Java中的Web容器,除了Tomcat还有?

1,279 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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 时期就已经支持嵌入式容器了,版本间对照关系如下表格所示:

ServletTomcatJettyUndertow
4.09.x9.x2.x
3.18.x8.x1.x
3.07.x7.xN/A
2.56.x6.xN/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。