Spring Boot 中,内嵌的 Servlet 容器(也称为嵌入式 Web 服务器)

Spring Boot 中,内嵌的 Servlet 容器

Spring Boot 2.x

默认内嵌 Servlet 容器

  • 默认是 Tomcat
  • Spring Boot Web Starter(spring-boot-starter-web)默认依赖 spring-boot-starter-tomcat

支持的内嵌 Servlet 容器

Spring Boot 2.x 支持以下三种内嵌 Servlet 容器:

  1. Apache Tomcat(默认)
  2. Jetty
  3. Undertow

注意:这些容器都实现了 Servlet 3.1+ 规范(Spring Boot 2.x 基于 Servlet 3.1)。

如何切换容器

通过 排除默认依赖引入目标容器依赖 实现切换。

示例:切换为 Jetty
复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <!-- 排除默认的 Tomcat -->
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!-- 引入 Jetty -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
切换为 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>

注意:Jetty 和 Undertow 不支持 JSP(Tomcat 支持,但 Spring Boot 不推荐使用 JSP)。


Spring Boot 3.x

默认内嵌 Servlet 容器
  • 仍然是 Tomcat
  • spring-boot-starter-web 默认依然依赖 spring-boot-starter-tomcat
支持的内嵌 Servlet 容器

Spring Boot 3.x 依然支持:

  1. Tomcat(默认)
  2. Jetty
  3. Undertow

但注意:Spring Boot 3.x 要求 JDK 17+,并基于 Jakarta EE 9+(即包名从 javax.* 变为 jakarta.* 。因此,所有容器也必须兼容 Jakarta Servlet API(而非旧的 Java EE javax.servlet)。

如何切换容器(Spring Boot 3.x)

方式与 2.x 类似,但依赖版本自动适配 Jakarta EE。

示例:切换为 Jetty(Spring Boot 3.x)
复制代码
<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-jetty</artifactId>
</dependency>

Spring Boot 3.x 的 spring-boot-starter-jettyspring-boot-starter-undertow 已经使用 Jakarta Servlet API,无需额外配置。


总结对比

版本 默认容器 支持容器 Servlet API 包命名空间
Spring Boot 2.x Tomcat Tomcat, Jetty, Undertow Servlet 3.1+ javax.servlet.*
Spring Boot 3.x Tomcat Tomcat, Jetty, Undertow Servlet 5.0+ (Jakarta EE 9+) jakarta.servlet.*

Tomcat, Jetty, Undertow对比

总体概览

特性 Apache Tomcat Jetty Undertow
默认容器 ✅ Spring Boot 默认
开源协议 Apache 2.0 Apache 2.0 / EPL Apache 2.0
所属组织 Apache 软件基金会 Eclipse 基金会(最初由 Mort Bay 开发) Red Hat(WildFly/JBoss 子项目)
Servlet 支持 ✅ 全面(Jakarta Servlet 5.0+ in SB3)
WebSocket 支持
JSP 支持 ✅(需额外依赖) ⚠️ 有限(不推荐) ❌ 不支持
嵌入式友好度 极高 极高
轻量级 中等 轻量 极轻量
性能(吞吐/延迟) 稳定可靠 高并发表现好 极高吞吐 + 低延迟
内存占用 较高 最低
线程模型 BIO/NIO/NIO2(默认 NIO) NIO(高度可定制) XNIO(基于事件驱动,无阻塞)

详细优缺点分析

1. Apache Tomcat
✅ 优点:
  • 最成熟、最广泛使用:社区庞大,文档丰富,企业级应用首选。
  • 兼容性强:对 JSP、Servlet、EL、WebSocket 等规范支持最完整。
  • 调试和监控工具完善:如 JMX、Manager App、Host Manager。
  • Spring Boot 默认集成:开箱即用,无需额外配置。
  • 稳定性高:经过数十年生产验证。
❌ 缺点:
  • 相对笨重:启动稍慢,内存占用较高(尤其在微服务场景下)。
  • 默认线程模型为"每请求一线程"(虽支持 NIO,但不如 Jetty/Undertow 彻底异步)。
  • 扩展性一般:架构较传统,定制化成本高。
🎯 适用场景:
  • 传统企业 Web 应用(含 JSP 页面)
  • 对稳定性要求极高的系统
  • 团队熟悉 Tomcat 运维
  • 不追求极致性能或资源节省的场景

2. Jetty
✅ 优点:
  • 轻量、启动快:适合微服务、测试环境、嵌入式场景。
  • 高度模块化:按需加载组件(如只启用 HTTP,不加载 JNDI)。
  • 优秀的异步支持:原生支持 Continuation(早期异步模型)和 Servlet 3.1+ 异步 I/O。
  • 易于嵌入和定制:API 设计简洁,常用于测试框架(如 Spring Test、Dropwizard)。
  • 低内存占用:比 Tomcat 更节省资源。
❌ 缺点:
  • JSP 支持弱:需额外引入 Apache Jasper,且不推荐在生产使用。
  • 社区规模小于 Tomcat:问题排查资源略少。
  • 企业级功能较少:如集群、高级安全策略等需自行实现。
🎯 适用场景:
  • 微服务架构(Spring Boot 应用)
  • 高并发 API 服务(无 JSP)
  • 嵌入式服务器(如 IDE 插件、测试工具)
  • 资源受限环境(Docker 容器、Serverless)

3. Undertow
✅ 优点:
  • 极致性能 :Red Hat 官方宣称"世界上最快的 Web 服务器之一"。
  • 极低内存占用:比 Jetty 更轻,适合大规模部署。
  • 灵活的 handler 链架构:类似 Netty 的 pipeline,可组合 HTTP、AJP、HTTPS 等处理器。
  • 完全非阻塞 I/O:基于 XNIO(异步 I/O 框架),支持百万级并发连接。
  • 与 WildFly 深度集成:Red Hat 生态首选。
❌ 缺点:
  • 生态较小:文档和社区支持不如 Tomcat/Jetty。
  • 不支持 JSP:完全专注于现代 Web API(REST、WebSocket)。
  • 学习曲线略陡:handler 模型需要理解其架构。
  • Spring Boot 集成略"边缘":虽官方支持,但使用率较低。
🎯 适用场景:
  • 高性能网关、API 网关
  • 实时通信服务(WebSocket、SSE)
  • 大规模微服务集群(追求低资源消耗)
  • 与 WildFly/JBoss 生态集成的项目

性能对比(参考数据)

注:以下为典型压测场景(HTTP GET,JSON 返回,4 核 8G 机器,Spring Boot 3.x)

容器 吞吐量(req/s) 平均延迟(ms) 内存占用(MB) 启动时间(s)
Tomcat ~8,000 ~12 180 2.5
Jetty ~10,000 ~9 140 1.8
Undertow ~12,000 ~7 110 1.2

💡 实际性能受应用逻辑、数据库、GC 等影响,但趋势一致:Undertow > Jetty > Tomcat(在纯 I/O 场景)。


如何选择?

🔸 Spring Boot 默认用 Tomcat 是为了"最大兼容性",而非性能最优。

容器 定位 优势 劣势 推荐指数(微服务)
Tomcat 通用企业级容器 稳定、兼容、生态强 较重、性能一般 ⭐⭐⭐
Jetty 轻量嵌入式容器 快、灵活、易嵌入 JSP 弱、生态小 ⭐⭐⭐⭐
Undertow 高性能异步容器 极快、极轻、非阻塞 学习成本、无 JSP ⭐⭐⭐⭐⭐

如果你在构建现代 Spring Boot 微服务(无 JSP),优先考虑 Jetty 若追求极致性能,选 Undertow。

相关推荐
李白的粉3 小时前
基于springboot的新闻资讯系统
java·spring boot·毕业设计·课程设计·源代码·新闻资讯系统
摇滚侠4 小时前
Spring Boot3零基础教程,为什么有Reactive-Stream 规范,响应式编程,笔记101
java·spring boot·笔记
山河亦问安4 小时前
Spring Boot异步接口性能优化:从单线程到高并发的优化历程
spring boot·后端·性能优化
陈果然DeepVersion5 小时前
Java大厂面试真题:Spring Boot+微服务+AI智能客服三轮技术拷问实录(四)
spring boot·redis·微服务·kafka·spring security·智能客服·java面试
BUG?不,是彩蛋!6 小时前
Maven-Java 项目到底解决了什么痛点?
java·servlet·maven
摇滚侠6 小时前
Spring Boot3零基础教程,Reactive-Stream 规范核心接口,笔记103
java·spring boot·笔记
程序猿小蒜7 小时前
基于springboot的校园社团信息管理系统开发与设计
java·前端·spring boot·后端·spring
爱淋雨的鼬先生7 小时前
SpringBoot 概述
java·spring boot·后端
shepherd1267 小时前
破局延时任务(下):Spring Boot + DelayQueue 优雅实现分布式延时队列(实战篇)
java·spring boot·分布式