类似Tomcat的服务器主要有Jetty、Undertow、WildFly、GlassFish,以及国产的TongWeb、Resin等,它们都能运行Java Web应用,但在内存占用、并发模型、管理体验上各有侧重,选型需要结合业务场景。下文咱们把这些“同类”挨个聊清楚,顺便聊聊怎么迁移、怎么选型。
Tomcat和Undertow对比,谁更适合高并发场景?
Undertow是红帽公司WildFly项目底层的Web服务器,后来被独立出来,它最突出的特点是采用非阻塞IO模型,用少量线程就能扛住大量并发连接,Tomcat虽然也支持NIO,但传统模型更偏重阻塞IO,每个连接在活跃时会占用一个线程,在长连接、慢客户端、WebSocket这类场景里,Undertow的实时资源占用明显更低。
行业共识认为,Undertow在高并发长连接场景下比Tomcat更有优势,Spring Boot、Quarkus等框架也都提供了Undertow作为内置容器选项,你可以简单做个测试:用同样的代码分别部署在Tomcat和Undertow上,压测一万个并发长连接,观察线程数和内存占用,差距会比较直观。
如果想把Spring Boot默认的Tomcat换成Undertow,操作很简单,在Maven的pom.xml里先排除Tomcat,再引入Undertow:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
改完重新启动服务,日志里会显示使用Undertow容器,这种切换成本很低,也是不少团队尝试Undertow的入门路径。
Jetty与Tomcat的区别在哪里?
Jetty是老牌轻量级服务器,历史比Undertow还长,它最大的特点是可嵌入式部署,能把服务器当作一个Java类直接启动,很多分布式框架、微服务网关的内部通信组件都默认用Jetty,因为它启动快、依赖少、容易定制。
Tomcat的问题在于功能完整但有点“重”,如果你只是需要处理HTTP请求和WebSocket,Jetty的jar包体积只有几MB,内存占用也小得多,但如果你要完整的Servlet规范支持、JSP支持、集群会话共享、管理控制台,Tomcat的成熟度依然领先。
Jetty的嵌入式启动代码非常直观,写个main方法就能跑起来:
Server server = new Server(8080); server.setHandler(new HelloHandler()); server.start();
这使得Jetty特别适合做“服务里的服务”,比如在一个批量任务进程中开一个HTTP端口提供健康检查,相比之下,Tomcat更常见的是独立部署在机器上,配合系统服务自动启动。
这里做一个简单的对比表格:
| 对比项 | Tomcat | Jetty | Undertow |
|---|---|---|---|
| 启动速度 | 中等 | 快 | 快 |
| 内存占用 | 较高 | 低 | 低 |
| 并发模型 | 混合IO | 传统+少量NIO | 非阻塞IO |
| 嵌入式支持 | 支持但偏重 | 极佳 | 良好 |
| 生态成熟度 | 最成熟 | 较高 | 上升中 |
| 维护方 | Apache基金会 | Eclipse基金会 | 红帽 |
多数情况下,独立部署的传统Java Web应用选Tomcat最稳,如果是嵌入到Spring Boot、或者做微服务基础设施,Jetty和Undertow更顺手。
适合中小企业使用的web服务器有哪些?
中小企业通常缺专门的运维团队,更看重“省心”,Tomcat免费开源、资料丰富,是默认选择,但有些场景需要找替代品,比如想减少内存占用,或者有信创需求。
WildFly(前身JBoss AS)是Java EE全功能服务器,支持EJB、JMS、CDI等企业级规范,中小企业如果业务复杂,想用全套Java EE技术栈,WildFly能一步到位,缺点是启动较慢、配置项多,需要一定学习成本。
GlassFish是Oracle官方主导的Java EE参考实现,规范支持最完整,但它和Tomcat一样偏重,而且社区活跃度相比WildFly和Tomcat低一些,除非你明确依赖某个GlassFish特有的管理功能,否则不建议首选。
Resin来自Caucho公司,支持Servlet标准和依赖注入,并且自带PHP解释器能力(准确的说是Quercus模块),它在国内早期使用较多,特点是对动态页面支持好,但商业授权需要付费,如果预算有限,还是优先考虑开源方案。
TongWeb是国产服务器里比较有代表性的,由东方通提供,兼容Servlet规范,也支持国家相关安全要求,近年来在政务、金融、电信等需要信创替代的领域应用较多,有明确国产化目标的企业,一般会直接采购TongWeb的授权和服务。
Tomcat收费吗这个问题也常被问到,Tomcat本身是Apache基金会开源项目,遵循Apache License 2.0,可以免费商用,收费的部分是第三方技术支持、定制化补丁和认证服务,比如某些云厂商提供的商业版镜像,如果你不需要这类增值服务,直接用Tomcat没有任何费用。
服务器选型常见问题与避坑指南
选型不是越新越好,也不是性能越高越好,以下几条经验供参考。
- 先看团队熟悉度。 没有专职运维,就选Tomcat;Redis、Nginx都熟,Undertow上手没难度。
- 看应用约束。 EJB、JTA这种重量级规范,优先WildFly;纯Servlet REST接口,Jetty或Undertow就够。
- 看部署方式。 一次部署跑一年,用Tomcat稳定省心;容器频繁启停,选Jetty能提升启动速度。
- 看监控体系。 Tomcat的JMX指标最完善,Prometheus导出器也多;Tomcat和Undertow对比时,Undertow的自带监控指标相对少,需要自行接入。
另外要注意Tomcat服务器性能怎么样这个问题,Tomcat的性能瓶颈通常在配置不当,而不是服务器本身,比如默认线程池200,如果业务接口耗时2秒,压测时线程很快耗尽,这时候调大maxThreads或者改用异步Servlet效果明显,换Undertow只是优化方式之一,不是万能药。
一个常见坑:把Undertow部署在Windows服务器上,依赖Java的AIO实现,部分老版本JDK存在性能波动,生产环境建议用新版JDK,尽量跑在Linux上。
基于Tomcat的应用迁移到其他服务器,需要改哪些配置?
如果把一个现有Web应用从Tomcat迁移到Jetty或Undertow,大部分项目不需要改代码,但需要检查三处配置。
第一,Maven依赖,用刚才提到的exclusion方式切换内置容器,如果是独立部署,直接替换war包运行环境即可,Jetty支持deploy目录放war包,Undertow通过WildFly管理控制台部署。
第二,web.xml中的命名空间,如果写了Tomcat私有配置(比如Context的reloadable属性),其他服务器不识别,标准做法是只保留Java Servlet规范自己的标签。
第三,数据源配置,Tomcat的JNDI数据源写在context.xml里,Jetty写在jetty-env.xml里,WildFly用standalone.xml,迁移时需要重写这部分。
实际操作中,先跑起来再说,用本地环境把war包扔到新服务器,启动后看日志里有没有报错,逐个解决即可。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/695326.html





