深度揭秘:为何大厂禁用 Spring Boot 内嵌 Tomcat?

服务器 服务器产品
随着互联网行业的迅猛发展,Web 应用的并发量日益增长,传统 Tomcat 服务器的性能瓶颈逐渐显现。相较之下,Undertow 以其轻量级、高吞吐量、低内存占用的优势,成为高并发业务场景下更优的选择。

在 Java Web 开发领域,Spring Boot 以其“开箱即用”的特性成为开发者的首选。默认情况下,Spring Boot 内嵌 Tomcat 作为 Web 服务器,使得开发人员可以快速构建 Web 应用。然而,近年来,越来越多的大型企业和互联网公司逐渐放弃 Tomcat,而选择 Undertow 作为更优的替代方案。

究竟是什么原因促使大厂放弃 Tomcat?Undertow 又有哪些独特优势?本篇文章将深入剖析这两种 Web 服务器的核心特性、性能对比,并指导你如何在 Spring Boot 3.4 中高效替换 Tomcat,助力你的项目在高并发场景下获得更优的表现。

Spring Boot 的默认容器 —— Tomcat

Spring Boot 作为当前最流行的 Java Web 开发框架,极大地降低了开发者的配置复杂度,使得开发人员可以迅速搭建一个完整的 Web 服务。在 Web 项目中,容器是至关重要的组件,因为它负责处理 HTTP 请求,并提供运行环境。

Tomcat 作为 Spring Boot 默认的嵌入式服务器,被广大 Java 开发者所熟悉。它支持 Servlet 和 JSP,具有完整的 Web 服务器功能,并且包含 Tomcat 管理平台、安全控制和过滤机制。然而,随着高并发业务需求的增长,Tomcat 在性能和资源消耗方面暴露出一定的局限性。

替换 Tomcat 为 Undertow

Undertow 是由 Red Hat 开发的高性能 Web 服务器,完全采用 Java 编写,支持阻塞和非阻塞 IO,并且能够无缝嵌入到 Java 应用程序中。此外,Undertow 还原生支持 Servlet 和 WebSocket,使其在高并发场景下表现卓越。

在 Spring Boot 3.4 中,我们可以轻松地用 Undertow 替换默认的 Tomcat,只需要修改项目的依赖配置:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

<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>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

完成配置后,启动 Spring Boot 应用,服务器将自动使用 Undertow 作为容器。

Tomcat vs Undertow 对比分析

性能对比

Tomcat 是 Apache 基金会旗下的轻量级 Servlet 容器,适用于一般 Web 应用。然而,在高并发场景下,Tomcat 处理请求的吞吐量相对较低。相比之下,Undertow 采用更高效的 IO 处理模型,使其在大规模请求下表现更优。

并发吞吐能力

在相同硬件环境下,我们对 Tomcat 和 Undertow 进行了并发测试,得出的 QPS(每秒请求数)如下:

  • Tomcat并发请求数较大时,QPS 明显下降,吞吐量受限。
  • Undertow默认使用持久连接,在高并发下吞吐量表现更优。

内存占用

内存管理方面,Tomcat 由于线程模型相对传统,在大量请求下容易导致内存消耗较高。而 Undertow 采用异步非阻塞架构,能够更高效地利用系统资源,减少内存开销。

大厂为何弃用 Tomcat?

在传统 Java Web 开发中,Tomcat 作为 Apache 基金会维护的轻量级 Servlet 容器,凭借其稳定性和成熟度,一直是 Web 开发的首选方案。然而,随着业务需求的增长和流量的激增,Tomcat 在高并发场景下的性能瓶颈逐渐显现,主要体现在以下几个方面:

  1. 线程模型的局限性 
    Tomcat 采用基于线程池的阻塞 I/O 模型,每个请求都会分配一个独立的线程来处理。这种方式在低并发场景下表现良好,但当请求量激增时,大量线程的创建和切换会导致 CPU 资源被大量消耗,线程上下文切换开销大,容易引发性能下降甚至 OOM(内存溢出)问题。
  2. 高并发下吞吐量有限 
    在压力测试中,Tomcat 的 QPS(每秒查询数)在并发数提升后增速明显放缓,甚至会因线程池饱和而导致请求阻塞或超时。由于 Tomcat 依赖于同步阻塞的 Servlet API,在高并发环境下无法充分利用现代 CPU 多核架构的能力。
  3. 响应时间较长 
    由于 Tomcat 采用同步阻塞 I/O,在请求处理时,如果某个请求需要访问数据库或外部 API,线程会一直处于等待状态,直到请求完成后才释放。这导致 Tomcat 在高并发时容易出现响应延迟,影响用户体验。
  4. 资源消耗较大 
    Tomcat 需要维护大量的线程,每个线程都会消耗一定的内存,导致整体系统资源占用较高。在 JVM 堆内存较小的情况下,大量的线程开销会进一步降低系统稳定性。
  5. 连接管理能力不足 
    Tomcat 默认使用短连接(HTTP 1.1 的 Keep-Alive 需要手动优化),在高并发环境下,短连接的频繁创建和关闭会导致额外的 TCP 握手和挥手开销,从而影响系统吞吐量。而 Undertow 采用持久连接,可以更高效地管理长连接,提高并发能力。

基于以上原因,大型互联网公司开始寻求更高效的 Web 服务器来替代 Tomcat,Undertow 作为一种异步非阻塞的 Web 服务器,逐渐成为主流选择。

结论

随着互联网行业的迅猛发展,Web 应用的并发量日益增长,传统 Tomcat 服务器的性能瓶颈逐渐显现。相较之下,Undertow 以其轻量级、高吞吐量、低内存占用的优势,成为高并发业务场景下更优的选择。

对于普通 Web 应用,Tomcat 依然是一个不错的选择,但如果你的系统需要应对高并发请求,或者希望在微服务架构下提升整体性能,那么 Undertow 无疑是一个更优的选择。通过简单的配置调整,你的 Spring Boot 3.4 项目就可以轻松切换到 Undertow,让你的系统性能获得质的提升。

责任编辑:武晓燕 来源: 路条编程
相关推荐

2024-11-26 08:36:56

SpringJar机制

2023-11-22 15:22:34

SpringBootTomcat

2025-02-25 08:00:00

SpringBootLua开发

2024-10-11 18:31:14

2024-07-15 10:45:51

2023-04-17 23:49:09

开发代码Java

2020-11-05 10:40:07

Spring Boot多模块Java

2024-05-17 10:10:59

Web容器Undertow

2024-09-09 09:29:05

2022-05-02 17:34:25

大数据数据分析

2013-07-15 15:17:24

2025-01-13 12:46:31

SpringBootJacksonJSON

2020-08-12 07:59:15

Long类型

2021-09-01 14:45:08

服务器数据PostgreSQL

2024-09-04 09:47:21

2023-12-14 13:28:00

Spring流程Web

2019-02-14 14:33:22

Spring BootTomcat开发

2011-12-28 13:12:52

网络布线智能网络布线

2024-07-01 08:01:45

API网关接口

2023-04-11 16:04:19

Spring Boo端点运维
点赞
收藏

51CTO技术栈公众号