Web 项目 tiger 之15 切换 Servlet 嵌入式容器

本文导读

  • 本文承接《 Web 项目 tiger 之11 Servlet 容器配置修改
  • Spring Boot 的 web 项目默认使用嵌入式的 Tomcat 服务器,同时它也支持程序员自己切换 内置的 Servlet 容器,如 Jetty 、Undertow 
  • Jetty 支持长连接,对于页面与服务器类似建立长连接聊天式的性能很好
  • Undertow 不支持 JSP 页面,但是非阻塞,高并发性能好
  • Jetty 和 Tomcat 都是目前全球范围内最著名的两款开源的webserver/servlet容器。
  • undertow、jetty 和 tomcat 都是 Java Web 项目当下最火的三款服务器,spring boot 完美集成了 tomcat,jetty 和 undertow
  • Tomcat 是 Apache 下的一款重量级的服务器,历史悠久,经得起实践的考验。
  • Jetty 和 undertow 都是基于 NIO 实现的高并发轻量级的服务器

默认的 Tomcat 服务器

  • 如下所示是自己新建的项目  “ tiger ” 的 pom.xml 文件的内容
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>www.wmx.com</groupId>
    <artifactId>tiger</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>tiger</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/>
        <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!-- 引入 Thymeleaf 模板引擎-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <!-- 引入 web 模块,默认就是使用嵌入式的 Tomcat 作为Servlet容器;-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- Spring Boot 自己的测试模块-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- 引入Bootstrap的webjars包-->
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>bootstrap</artifactId>
            <version>4.0.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!-- Spring Boot 打包的插件-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
  • 在 pom.xml 文件中右击,选择 “ Diagrams (图解)”-> “ show dependencies(显示依赖关系)”

  • 启动时控制台如下输出显示,默认就是启动的 Tomcat 服务器,8084 端口是自己修改的,不是默认值了
.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-08-12 11:19:12.744  INFO 11888 --- [           main] o.s.b.a.w.s.WelcomePageHandlerMapping    : Adding welcome page template: index
2018-08-12 11:19:12.920  INFO 11888 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2018-08-12 11:19:13.055  INFO 11888 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8084 (http) with context path '/cat'
2018-08-12 11:19:13.059  INFO 11888 --- [           main] com.lct.TigerApplication                 : Started TigerApplication in 4.52 seconds (JVM running for 7.097)

切换 Jetty 服务器

  • 知道了上面的 Tomcat 服务器原理,修改起来就简单了。
  • 在 依赖关系图解 中的 Spring-boot-start-tomcat 上面右击,选择 “ Exclude ” 将默认的 Tomcat 服务器进行排除

  • 如下所示为完整的 pom.xml 文件,其实核心就是排除默认的 Tomcat ,然后 添加 jetty 组件即可
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>www.wmx.com</groupId>
    <artifactId>tiger</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>tiger</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/>
        <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!-- 引入 Thymeleaf 模板引擎-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <!-- 引入 web 模块,默认就是使用嵌入式的 Tomcat 作为Servlet容器;-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!-- 如下所示已经将 Tomcat 暂时排除在外,不会生效-->
            <exclusions>
                <exclusion>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                    <groupId>org.springframework.boot</groupId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- 引入 Servlet 容器 jetty-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jetty</artifactId>
        </dependency>

        <!-- Spring Boot 自己的测试模块-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- 引入Bootstrap的webjars包-->
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>bootstrap</artifactId>
            <version>4.0.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!-- Spring Boot 打包的插件-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
  • 从依赖关系图解可以看出 Spring-boot-starter-jetty 与 spring-boot-starter-web/test 是同级关系,并非从属

  • 此时启动应用时,可以看到启动的是 jetty 服务器了,而且 jetty 的端口默认与 Tomcat 一样都是 8080,如果想要修改,则与之前使用 Tomcat 时完全一样,下面的 8084 是修改过的
2018-08-12 11:31:54.050  INFO 11772 --- [           main] o.e.j.s.h.ContextHandler.application     : Initializing Spring FrameworkServlet 'dispatcherServlet'
2018-08-12 11:31:54.051  INFO 11772 --- [           main] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization started
2018-08-12 11:31:54.064  INFO 11772 --- [           main] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 13 ms
2018-08-12 11:31:54.091  INFO 11772 --- [           main] o.e.jetty.server.AbstractConnector       : Started ServerConnector@b9dfc5a{HTTP/1.1,[http/1.1]}{0.0.0.0:8084}
2018-08-12 11:31:54.093  INFO 11772 --- [           main] o.s.b.web.embedded.jetty.JettyWebServer  : Jetty started on port(s) 8084 (http/1.1) with context path '/cat'
2018-08-12 11:31:54.096  INFO 11772 --- [           main] com.lct.TigerApplication                 : Started TigerApplication in 3.718 seconds (JVM running for 4.186)
  • 仍然和以前使用 Tomcat 一样可以访问,关于 jetty 服务器的具体知识点,本文不做阐述,本文主要说明 Spring Boot 如何切换内置的 Servlet 容器

切换 Undertow 服务器

  • 与上面的切换 Jetty 完全同理
  • 首先在 依赖关系图解 中的 Spring-boot-start-tomcat 上面右击,选择 “ Exclude ” 将默认的 Tomcat 服务器进行排除
  • 或者直接在 pom.xml 文件中将默认的 Servlet 容器 Tomcat 排除,如果是 Jetty ,则先将 Jetty 排除,在将 undertow 组件添加进来即可
  • 如下为完整的 pom.xml 文件内容
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>www.wmx.com</groupId>
    <artifactId>tiger</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>tiger</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/>
        <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!-- 引入 Thymeleaf 模板引擎-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <!-- 引入 web 模块,默认就是使用嵌入式的 Tomcat 作为Servlet容器;-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!-- 如下所示已经将 Tomcat 暂时排除在外,不会生效-->
            <exclusions>
                <exclusion>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                    <groupId>org.springframework.boot</groupId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- 引入 Servlet 容器 undertow-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-undertow</artifactId>
        </dependency>

        <!-- Spring Boot 自己的测试模块-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- 引入Bootstrap的webjars包-->
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>bootstrap</artifactId>
            <version>4.0.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!-- Spring Boot 打包的插件-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

  • 此时启动应用时,可以看到启动的是 undertow 服务器了,而且 undertow 的端口默认与 Tomcat 一样都是 8080,如果想要修改,则与之前使用 Tomcat 时完全一样,下面的 8084 是修改过的
2018-08-12 11:50:18.093  INFO 8864 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/uploadFiles/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-08-12 11:50:18.191  INFO 8864 --- [           main] o.s.b.a.w.s.WelcomePageHandlerMapping    : Adding welcome page template: index
2018-08-12 11:50:18.306  INFO 8864 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
javax.servlet.Filter::服务器启动....
2018-08-12 11:50:18.369  INFO 8864 --- [           main] o.s.b.w.e.u.UndertowServletWebServer     : Undertow started on port(s) 8084 (http) with context path '/cat'
2018-08-12 11:50:18.373  INFO 8864 --- [           main] com.lct.TigerApplication                 : Started TigerApplication in 3.164 seconds (JVM running for 3.616)
  • 仍然和以前使用 Tomcat 一样可以访问,关于 undertow 服务器的具体知识点,本文不做阐述,本文主要说明 Spring Boot 如何切换内置的 Servlet 容器

猜你喜欢

转载自blog.csdn.net/wangmx1993328/article/details/81604258