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 作为内置服务器:

go 复制代码
1
2<dependency>
3<groupId>org.springframework.bootgroupId>
4<artifactId>spring-boot-starter-webartifactId>
5dependency>

启动项目,日志里会看到 Tomcat 启动的痕迹:

go 复制代码
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 里加:

go 复制代码
1server:
2  tomcat:
3max-threads:200# 最大工作线程数(默认200)
4min-spare-threads:20# 最小空闲线程数
5max-connections:10000# 最大连接数
6accept-count:100# 连接队列长度(满了之后新请求会被拒绝)
切换到 Jetty

Jetty 比 Tomcat 更轻量,启动更快,对 WebSocket 支持更友好(比如做即时聊天、消息推送项目)。

第一步:排除 Tomcat 依赖,引入 Jetty 依赖

修改 pom.xml,核心是"先排除、再引入":

go 复制代码
1<dependencies>
2
3<dependency>
4<groupId>org.springframework.bootgroupId>
5<artifactId>spring-boot-starter-webartifactId>
6
7<exclusions>
8<exclusion>
9<groupId>org.springframework.bootgroupId>
10<artifactId>spring-boot-starter-tomcatartifactId>
11exclusion>
12exclusions>
13dependency>
14
15
16<dependency>
17<groupId>org.springframework.bootgroupId>
18<artifactId>spring-boot-starter-jettyartifactId>
19dependency>
20dependencies>
第二步:启动项目,验证切换成功

启动日志里会看到 Jetty 相关输出,说明切换成功:

go 复制代码
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 参数:

go 复制代码
1server:
2  jetty:
3acceptors:4# 接受连接的线程数(默认CPU核心数)
4selectors:8# 处理IO的线程数
5max-http-post-size: 10MB  # 最大POST请求大小
切换到 Undertow

Undertow 是 RedHat 开源的服务器,性能吊打 Tomcat/Jetty,内存占用最低,适合高并发的微服务接口。

第一步:排除 Tomcat 依赖,引入 Undertow 依赖

同样修改 pom.xml

go 复制代码
1<dependencies>
2
3<dependency>
4<groupId>org.springframework.bootgroupId>
5<artifactId>spring-boot-starter-webartifactId>
6
7<exclusions>
8<exclusion>
9<groupId>org.springframework.bootgroupId>
10<artifactId>spring-boot-starter-tomcatartifactId>
11exclusion>
12exclusions>
13dependency>
14
15
16<dependency>
17<groupId>org.springframework.bootgroupId>
18<artifactId>spring-boot-starter-undertowartifactId>
19dependency>
20dependencies>
第二步:启动验证,查看日志

启动日志里出现 Undertow 标识,说明切换成功:

go 复制代码
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

go 复制代码
1server:
2  undertow:
3# IO 线程数(默认CPU核心数*2),处理连接接受、请求分发
4io-threads:8
5# 工作线程数(默认IO线程数*8),处理具体的业务请求
6worker-threads:64
7# 最大请求大小
8max-http-post-size: 10MB
9# 开启HTTP2(可选,需要HTTPS)
10    http2:
11enabled:true

⚠️ 调优建议:IO 线程数设为 CPU 核心数2,工作线程数设为 IO 线程数8~16,根据服务器配置调整。

必避的 3 个坑
  1. 只引入新服务器依赖,没排除 Tomcat

    结果:项目启动报错(依赖冲突),日志里同时出现 Tomcat 和 Jetty/Undertow;

    解决:必须先排除 spring-boot-starter-tomcat,再引入目标服务器依赖。

  2. 切换后接口访问 404

    原因:服务器切换不影响业务代码,大概率是其他配置问题(比如端口错、Controller 没扫描到);

    解决:检查 server.port、主启动类包层级、@RestController 注解是否正确。

  3. Undertow 开启 HTTP2 但没配 HTTPS

    结果:启动报错,HTTP2 必须基于 HTTPS;

    解决:要么关闭 HTTP2,要么配置 SSL 证书(生产环境再配)。

生产环境选型建议(按场景选)

不用盲目追求"高性能",按实际需求选:

  1. 新手/通用场景

    :选 Tomcat(文档多、问题好排查、兼容性最好);

  2. WebSocket 应用(聊天、推送)

    :选 Jetty(对长连接支持更优);

  3. 高并发微服务接口

    :选 Undertow(性能最高、内存占用最低);

  4. 老项目迁移

    :选 Tomcat(和传统 Web 项目兼容最好);

  5. 容器化部署(Docker/K8s)

    :选 Undertow(镜像体积更小,资源占用低)。

最后说两句

SpringBoot 切换内置服务器的核心就两步:

  • 排除默认的 Tomcat 依赖;

  • 引入目标服务器(Jetty/Undertow)的 Starter 依赖。

三款服务器没有"最好",只有"最适合"------大部分场景用 Tomcat 足够,追求性能选 Undertow,追求轻量选 Jetty。

下一期,咱们会讲:SpringBoot 配置 HTTPS(自签名证书+正式证书),让接口通过 HTTPS 访问,保证数据传输安全。

如果这篇文章帮你搞定了服务器切换,麻烦点个赞、在看,关注我,后续还有更多 SpringBoot 性能调优实战技巧,从入门到精通~


相关推荐
服务器专卖店2 小时前
单台服务器52块硬盘
服务器
Sammyyyyy2 小时前
9个Python库把一个月的AI开发周期缩短到了3天
人工智能·后端·python·servbay
左左右右左右摇晃2 小时前
Java笔记——反射
java·tomcat
苍何2 小时前
腾讯上线 ima skill,知识管理终于可以🦞全自动了
后端
小比特_蓝光2 小时前
Linux开发工具
linux·运维·服务器
苍何2 小时前
难怪黄仁勋GTC请了杨植麟,读完Kimi新论文我懂了
后端
苍何3 小时前
你的Agent🦞也能做电影了!
后端
yymboss3 小时前
【JavaEE】Spring Boot 项目创建
java·spring boot·java-ee
Soofjan3 小时前
GMP 源码(下):调度循环、抢占与 syscall
后端