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-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。

相关推荐
IT研究室7 小时前
最新计算机毕业设计选题推荐-基于spring boot的葡萄酒文化宣传网站-网站-文档指导-Java-springboot
java·spring boot·课程设计
凤山老林9 小时前
Spring Boot 集成 Sa-Token 实现高可用权限认证:登录鉴权、动态路由权限与接口防重放实战
spring boot·后端·sa-token·bootstrap
Wx-bishekaifayuan10 小时前
springboot桂味美食分享系统40540-计算机课程设计、毕业设计
spring boot·后端·python·django·课程设计·express·旅游
墨神谕12 小时前
RabbitMQ 从入门到实战:核心原理、消息模型、可靠性机制与 Spring Boot 实战
spring boot·rabbitmq·java-rabbitmq
威哥爱编程13 小时前
【AI全栈12-12】Spring Boot 3.x → 4.x 迁移实操:Jakarta 11、Jackson 3 与 AI 2.0
java·spring boot·后端
威哥爱编程13 小时前
【AI全栈12-11】Spring Boot 把 AI 接口真正上线扛量:限流 / 降级 / 可观测
java·spring boot·后端
小蒜学长13 小时前
基于SpringBoot+uni-app的闪洁家政系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·uni-app·家政服务
做个文艺程序员13 小时前
MQ第07篇:Java SaaS多租户消息隔离实战:RabbitMQ VHost+RocketMQ Tag+命名空间架构
spring boot·rabbitmq·rocketmq·saas·多租户
需要82613 小时前
Spring Boot 启动流程:run() 里到底发生了什么
java·spring boot·后端
凤山老林15 小时前
Spring Boot 集成 Spring Modulith:搭一个能拆微服务的模块化单体
spring boot·spring·微服务