目录
序言
默认的 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(显示依赖关系)”
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 服务器进行排除
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 是同级关系,并非从属
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 容器
切换 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>
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 容器
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,在高并发情况下表现非常出色。
4、Sping Boot 中我们既可以使用 Tomcat 作为 Http 服务,也可以用 Undertow 来代替。Undertow 在高并发业务场景中,性能优于Tomcat。