开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 11 天,点击查看活动详情
各位小伙伴大家好!,我是Java步兵营的二排长。每日灵魂一问:今天,你更博学了嘛?
如果在座的小伙伴中有Java程序员的话,相信对于Tomcat这个Web容器一定印象非常深刻!就像是陪伴我们度过童年欢乐时光的游戏机一样。还记得自己早期刚入门学习Java时,最终展示自己作品时部署项目首选就是它。随着后面SpringBoot框架的崛起,Tomcat作为内嵌容器集成进来后变得更加容易使用了。
互联网场景中,与终端用户交互最多的应用要属Web应用,其通信协议是HTTP的。随着Java Web多年技术的发展,如今Java程序员只有两条路选择,一种是Servlet,另一种则是其他。前者几乎垄断了Java Web的市场。Tomcat、Jetty就是其典型代表。到后来JBoss旗下Undertow的出现兼容Servlet3.1+规范,为嵌入式Servlet容器添加了新的选择。
最新版现已支持HTTP/2和Servlet4.0了,且将核心包的体积缩减到2M左右。其实早在Tomcat 5.x和Jetty 5.x 时期就已经支持嵌入式容器了,版本间对照关系如下表格所示:
| Servlet | Tomcat | Jetty | Undertow |
|---|---|---|---|
| 4.0 | 9.x | 9.x | 2.x |
| 3.1 | 8.x | 8.x | 1.x |
| 3.0 | 7.x | 7.x | N/A |
| 2.5 | 6.x | 6.x | N/A |
Tomcat、Jetty、Undertow
1、Tomcat 概述
Tomcat是Apache基金下的一个轻量级Servlet容器,支持Serlvet和JSP。具有Web服务特有的功能,其有一个管理和控制界面可以控制平台、安全管理、阈值设置等。本身还包含HTTP服务器,因此可以作为单独Web服务器。还有一个更为重要的点就是Tomcat是完全免费的!
2、Jetty 概述
Jetty也是开源的serlvet容器,Jetty是使用Java语言开发的,为基于Java的web容器提供了运行环境。我们可以将Jetty容器实例化为一个对象,从而为一些独立运行的Java程序提供网络和web链接。
3、Undertow 概述
Undertow是Red Hat旗下的开源产品,也是采用Java语言开发的,具有灵活、高性能、支持阻塞IO和非阻塞IO。可以直接嵌入Java项目中使用。且Undertow在高并发情况下表现十分出色。
如何使用
1、使用 Tomcat
新建SpringBoot项目时,直接添加web引用即可,Tomcat是SpringBoot的默认容器技术,性能和内存使用方面都要弱于Jetty和Undertow。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2、使用 Jetty
使用Jetty容器时,需要移除web中默认的tomcat容器。Jetty容器在性能和内存使用方面都优于Tomcat,弱于Undertow。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 移除掉默认支持的 Tomcat -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 添加 Undertow 容器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
3、使用 Undertow
使用Undertow容器同样也是要先移除默认Tomcat,SpringBoot除了默认的Tomcat容器,同时也支持Undertow,而Undertow在性能和内存使用方面比Jetty和Tomcat都要优秀
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 移除掉默认支持的 Tomcat -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 添加 Undertow 容器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
总结
对于以上三种容器,大家如想比对容器运行时线程和内存的占用,可以使用JDK自带的工具jvisualvm.exe来对比各项指标,为了实验结果的准确性请在相同项目相同电脑配置的环境下启动,然后用工具观察工具反馈的数据变化情况,一般在并发量不是很高的情况下,Tomcat与Undertow的吞吐量区别不大,一旦出现大量并发的情况下,Undertow的性能要优于Jetty与Tomcat。