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 容器:
- Apache Tomcat(默认)
- Jetty
- 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 依然支持:
- Tomcat(默认)
- Jetty
- Undertow
但注意:Spring Boot 3.x 要求 JDK 17+,并基于 Jakarta EE 9+(即包名从
javax.*变为jakarta.*)。因此,所有容器也必须兼容 Jakarta Servlet API(而非旧的 Java EEjavax.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-jetty和spring-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。
