当前位置: 首页 > news >正文

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.xTomcatTomcat, Jetty, UndertowServlet 3.1+javax.servlet.*
Spring Boot 3.xTomcatTomcat, Jetty, UndertowServlet 5.0+ (Jakarta EE 9+)jakarta.servlet.*

Tomcat, Jetty, Undertow对比

总体概览

特性Apache TomcatJettyUndertow
默认容器✅ Spring Boot 默认
开源协议Apache 2.0Apache 2.0 / EPLApache 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~121802.5
Jetty~10,000~91401.8
Undertow~12,000~71101.2

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


如何选择?

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

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

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

http://www.dtcms.com/a/570018.html

相关文章:

  • 确定网站建设目标国外网站阻止国内访问怎么做
  • 网站维护的主要工作wordpress 获取用户id
  • 金融做推广的网站什么网站框架
  • 建设了网站怎么管理网页设计实训报告美食主题
  • 重组、谋上市,OpenAI更自由了
  • Linux 自动清理临时文件配置
  • Docker安装jenkins并配置对应的maven项目自动发布
  • 重塑城市治理的智能运营新范式
  • 网站托管什么意思苗木网站素材
  • 东营做网站m0536怎么做网站一个平台
  • 课程表---bfs
  • Redis的数据淘汰策略解读
  • Spring EL 表达式
  • 利用海伦公式计算经纬度坐标点到直线的距离
  • 前端面试题最大矩形面积问题
  • 网站建设顺德营销型网站制作msgg
  • 19、【Ubuntu】【远程开发】技术方案分析:远程桌面
  • 从零到一:我的开源AI商业化实战之路
  • 景县网站建设在线培训平台
  • 第21课:前端界面开发:用Gradio构建RAG应用UI
  • 网站原型图是什么做网站的数据从哪里来
  • 网站文件权限设置金融投资网站源码
  • 织梦手机网站怎么修改密码html网站设计模板下载
  • 哪种网站开发最简单家庭宽带做网站稳定吗
  • 浅谈Linux内核kswapd的内存域(zone)扫描机制
  • 什么是北斗短报文终端?与卫星电话有什么区别?
  • Maven基础(一)
  • MAC-SQL:黄金标准错误
  • 怎样创建基本的网站电子商务网站建设的试卷
  • 网站加盟代理wordpress 本地调试