SpringBoot内置服务器(Tomcat/Jetty/Undertow)切换的操作指南
作者:希望永不加班
用 SpringBoot 开发时,你可能从没关注过“服务器”这件事——点一下启动,接口就能访问,默认用的是 Tomcat。但实际开发中,不同场景需要不同的服务器:比如追求高性能选 Undertow,追求轻量选 Jetty,兼容老项目选 Tomcat。
今天就手把手教你:SpringBoot 里怎么切换内置服务器(Tomcat→Jetty→Undertow),以及三种服务器的核心区别、选型建议——纯实操,改几行配置就能搞定,再也不用被“默认 Tomcat”绑死。
先搞懂:SpringBoot 为啥能“内置”服务器?
SpringBoot 之所以能一键启动,核心是把 Tomcat/Jetty/Undertow 这些 Web 服务器打包成了依赖,启动时自动初始化,不用我们手动安装、配置。
核心逻辑:
spring-boot-starter-web
- 依赖默认引入
spring-boot-starter-tomcat(内置 Tomcat); - 切换服务器的本质:排除默认的 Tomcat 依赖,引入目标服务器的 Starter 依赖;
- 所有服务器都适配 SpringBoot 的
WebServer接口,切换后代码无需任何改动。
先看三款内置服务器的核心差异(新手先记结论):
| 特性 | Tomcat(默认) | Jetty | Undertow |
|---|---|---|---|
| 核心优势 | 生态完善、兼容性好、文档多 | 轻量、启动快、适合长连接(WebSocket) | 高性能、低内存、并发能力强 |
| 核心劣势 | 内存占用较高、并发性能一般 | 并发性能弱于 Undertow | 功能比 Tomcat 少、文档相对少 |
| 适用场景 | 通用场景、传统 Web 项目、新手 | 轻量应用、WebSocket 应用(如聊天) | 高并发接口、微服务、性能敏感场景 |
| 内存占用(同等配置) | 高 | 中 | 低 |
| 并发处理能力 | 中 | 中低 | 高 |
默认服务器——Tomcat
SpringBoot 项目只要引入 spring-boot-starter-web,就自动用 Tomcat 作为内置服务器:
<dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-webartifactId> <dependency>
启动项目,日志里会看到 Tomcat 启动的痕迹:
2026-03-19 10:00:00.000 INFO 12345 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 8080 (http) 2026-03-19 10:00:00.123 INFO 12345 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8080 (http)
如果想自定义 Tomcat 配置(比如调线程数、最大连接数),在 application.yml 里加:
server: tomcat: max-threads:200# 最大工作线程数(默认200) min-spare-threads:20# 最小空闲线程数 max-connections:10000# 最大连接数 accept-count:100# 连接队列长度(满了之后新请求会被拒绝)
切换到 Jetty
Jetty 比 Tomcat 更轻量,启动更快,对 WebSocket 支持更友好(比如做即时聊天、消息推送项目)。
第一步:排除 Tomcat 依赖,引入 Jetty 依赖
修改 pom.xml,核心是“先排除、再引入”:
<dependencies> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-webartifactId> <exclusions> <exclusion> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-tomcatartifactId> <exclusion> <exclusions> <dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-jettyartifactId> <dependency> <dependencies>
第二步:启动项目,验证切换成功
启动日志里会看到 Jetty 相关输出,说明切换成功:
2026-03-19 10:01:00.000 INFO 67890 --- [ main] o.e.j.s.Server : jetty-11.0.18; built: 2024-01-01T00:00:00Z; git: abc123; jvm 17.0.10 2026-03-19 10:01:00.123 INFO 67890 --- [ main] o.e.j.w.StandardDescriptorProcessor : NO JSP Support for /, did not find org.eclipse.jetty.jsp.JettyJspServlet 2026-03-19 10:01:00.456 INFO 67890 --- [ main] o.s.b.web.embedded.jetty.JettyWebServer : Jetty started on port 8080 (http) with context path '/'
第三步:自定义 Jetty 配置(可选)
在 application.yml 里调整 Jetty 参数:
server: jetty: acceptors:4# 接受连接的线程数(默认CPU核心数) selectors:8# 处理IO的线程数 max-http-post-size: 10MB # 最大POST请求大小
切换到 Undertow
Undertow 是 RedHat 开源的服务器,性能吊打 Tomcat/Jetty,内存占用最低,适合高并发的微服务接口。
第一步:排除 Tomcat 依赖,引入 Undertow 依赖
同样修改 pom.xml:
<dependencies> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-webartifactId> <exclusions> <exclusion> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-tomcatartifactId> <exclusion> <exclusions> <dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-undertowartifactId> <dependency> <dependencies>
第二步:启动验证,查看日志
启动日志里出现 Undertow 标识,说明切换成功:
2026-03-19 10:02:00.000 INFO 11223 --- [ main] io.undertow.servlet.core.ApplicationDeploymentManager : starting deployment of web application directory /tmp/tomcat.12345/webapps/ROOT 2026-03-19 10:02:00.345 INFO 11223 --- [ main] o.s.b.web.embedded.undertow.UndertowWebServer : Undertow started on port 8080 (http) with context path '/'
第三步:自定义 Undertow 配置(性能调优)
Undertow 的性能调优主要在线程数和连接数,配置 application.yml:
server:
undertow:
# IO 线程数(默认CPU核心数*2),处理连接接受、请求分发
io-threads:8
# 工作线程数(默认IO线程数*8),处理具体的业务请求
worker-threads:64
# 最大请求大小
max-http-post-size: 10MB
# 开启HTTP2(可选,需要HTTPS)
http2:
enabled:true调优建议:IO 线程数设为 CPU 核心数2,工作线程数设为 IO 线程数8~16,根据服务器配置调整。
必避的 3 个坑
只引入新服务器依赖,没排除 Tomcat:
结果:项目启动报错(依赖冲突),日志里同时出现 Tomcat 和 Jetty/Undertow;
解决:必须先排除 spring-boot-starter-tomcat,再引入目标服务器依赖。
切换后接口访问 404:
原因:服务器切换不影响业务代码,大概率是其他配置问题(比如端口错、Controller 没扫描到);
解决:检查 server.port、主启动类包层级、@RestController 注解是否正确。
Undertow 开启 HTTP2 但没配 HTTPS:
结果:启动报错,HTTP2 必须基于 HTTPS;
解决:要么关闭 HTTP2,要么配置 SSL 证书(生产环境再配)。
生产环境选型建议(按场景选)
不用盲目追求“高性能”,按实际需求选:
新手/通用场景:选 Tomcat(文档多、问题好排查、兼容性最好);
WebSocket 应用(聊天、推送):选 Jetty(对长连接支持更优);
高并发微服务接口:选 Undertow(性能最高、内存占用最低);
老项目迁移:选 Tomcat(和传统 Web 项目兼容最好);
容器化部署(Docker/K8s):选 Undertow(镜像体积更小,资源占用低)。
最后说两句
SpringBoot 切换内置服务器的核心就两步:
- 排除默认的 Tomcat 依赖;
- 引入目标服务器(Jetty/Undertow)的 Starter 依赖。
三款服务器没有“最好”,只有“最适合”——大部分场景用 Tomcat 足够,追求性能选 Undertow,追求轻量选 Jetty。
以上就是SpringBoot内置服务器(Tomcat/Jetty/Undertow)切换的操作指南的详细内容,更多关于SpringBoot内置服务器切换的资料请关注脚本之家其它相关文章!
