目录

序言

默认的 Tomcat 服务器

切换 Jetty 服务器

切换 Undertow 服务器

Tomcat 与 Undertow 对比


序言

1、Spring Boot 的 web 项目默认使用嵌入式的 Tomcat 服务器,同时它也支持程序员自己切换 内置的 Servlet 容器,如 Jetty 、Undertow 

2、Jetty 支持长连接,对于页面与服务器类似建立长连接聊天式的性能很好

3、Jetty 和 Tomcat 都是目前全球范围内最著名的两款开源的webserver/servlet容器。

4、undertow、jetty 和 tomcat 都是 Java Web 项目当下最火的三款服务器,spring boot 完美集成了 tomcat,jetty 和 undertow

Tomcat 是 Apache 下的一款重量级的服务器,历史悠久,经得起实践的考验。

5、Jetty 和 undertow 都是基于 NIO 实现的高并发轻量级的服务器

默认的 Tomcat 服务器

1、如下所示是自己新建的项目  “ 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>

2、在 pom.xml 文件中右击,选择 “ Diagrams (图解)”-> “ show dependencies(显示依赖关系)”

springboot 内嵌 nginx springboot内嵌服务器_服务器

3、启动时控制台如下输出显示,默认就是启动的 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 服务器

1、知道了上面的 Tomcat 服务器原理,修改起来就简单了。

2、在 依赖关系图解 中的 Spring-boot-start-tomcat 上面右击,选择 “ Exclude ” 将默认的 Tomcat 服务器进行排除

springboot 内嵌 nginx springboot内嵌服务器_spring_02

3、如下所示为 pom.xml 文件,其实核心就是排除默认的 Tomcat ,然后 添加 jetty 组件即可:

<!-- 引入 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>

4、从依赖关系图解可以看出 Spring-boot-starter-jetty 与 spring-boot-starter-web/test 是同级关系,并非从属

springboot 内嵌 nginx springboot内嵌服务器_xml_03

5、此时启动应用时,可以看到启动的是 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)

6、仍然和以前使用 Tomcat 一样可以访问,关于 jetty 服务器的具体知识点,本文不做阐述,本文主要说明 Spring Boot 如何切换内置的 Servlet 容器

springboot 内嵌 nginx springboot内嵌服务器_xml_04

切换 Undertow 服务器

1、与上面的切换 Jetty 完全同理,首先在 依赖关系图解 中的 Spring-boot-start-tomcat 上面右击,选择 “ Exclude ” 将默认的 Tomcat 服务器进行排除,或者直接在 pom.xml 文件中将默认的 Servlet 容器 Tomcat 排除,如果是 Jetty ,则先将 Jetty 排除,在将 undertow 组件添加进来即可

<!-- 引入 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>

springboot 内嵌 nginx springboot内嵌服务器_spring_05

2、此时启动应用时,可以看到启动的是 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)

3、仍然和以前使用 Tomcat 一样可以访问,关于 undertow 服务器的具体知识点,本文不做阐述,本文主要说明 Spring Boot 如何切换内置的 Servlet 容器

springboot 内嵌 nginx springboot内嵌服务器_服务器_06

Tomcat 与 Undertow 对比

1、Tomcat 是 Apache 基金下的一个轻量级的 Servlet 容器,支持 Servlet 和 JSP。Tomcat 具有 Web 服务器特有的功能,包括 Tomcat 管理和控制平台、安全局管理和 Tomcat 阀等。Tomcat 本身包含了 HTTP 服务器,因此也可以视作单独的 Web 服务器。

2、但是,Tomcat 和 ApacheHTTP 服务器不是同一个东西,ApacheHTTP 服务器是用 C 语言实现的 HTTP Web 服务器。Tomcat 是完全免费的,深受开发者的喜爱。

3、Undertow 是 Red Hat 公司的开源产品, 它完全采用 Java 语言开发,是一款灵活的高性能 Web 服务器,支持阻塞 IO 和非阻塞 IO。由于 Undertow 采用 Java 语言开发,可以直接嵌入到 Java 项目中使用。同时,Undertow 完全支持 Servlet 和 Web Socket,在高并发情况下表现非常出色。

springboot 内嵌 nginx springboot内嵌服务器_springboot 内嵌 nginx_07

4、Sping Boot 中我们既可以使用 Tomcat 作为 Http 服务,也可以用 Undertow 来代替。Undertow 在高并发业务场景中,性能优于Tomcat。