Spring Boot 切换内置 Web 容器为 Undertow 不需要改业务代码,核心是排除 spring-boot-starter-tomcat 并引入 spring-boot-starter-undertow;它支持非阻塞 I/O 和 WebSocket,高并发下更省内存、吞吐更高,可通过 server.undertow 配置调优线程数、缓冲区及堆外内存。

Spring Boot 切换内置 Web 容器为 Undertow 不需要改业务代码,核心就是两步:排除默认 Tomcat 依赖、引入 Undertow Starter。它天然支持非阻塞 I/O 和长连接(如 WebSocket),在高并发、低延迟场景下比 Tomcat 更省内存、吞吐更高。
修改 Maven 依赖(关键第一步)
在 pom.xml 中调整 spring-boot-starter-web 的依赖结构:
- 显式排除
spring-boot-starter-tomcat - 单独添加
spring-boot-starter-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>
基础配置项(application.yml)
切换后可通过 server.undertow 前缀调优关键参数,直接影响长连接承载能力和响应延迟:
立即学习“Java免费学习笔记(深入)”;
- io-threads:负责处理网络事件(如连接建立、数据读取),建议设为 CPU 核心数 × 2(如 8 核机器设为 16)
- worker-threads:执行阻塞型任务(如数据库查询、文件读写),建议 200–500,避免过高导致线程争抢
- buffer-size:单个缓冲区大小(单位 KB),默认 512,若平均请求体较大可设为 1024 或 2048
-
direct-buffers:启用堆外内存(
true),显著降低 GC 压力,适合长连接持续收发场景
示例:
server:
port: 8080
undertow:
threads:
io: 16
worker: 300
buffer-size: 1024
direct-buffers: true
支持 HTTP/2 与 WebSocket(长连接刚需)
Undertow 开箱支持 HTTP/2 和 JSR-356 WebSocket,无需额外适配:
- HTTP/2 可提升现代浏览器并发请求数和首屏加载速度,只需在配置中开启(Spring Boot 2.1+ 默认启用)
- WebSocket 连接复用底层 NIO Channel,连接数上限远高于 Tomcat 的线程模型,适合聊天、实时推送等场景
- 若需细粒度控制,可通过
UndertowServletWebServerFactoryBean 自定义处理器链或添加 HTTP/2 流控参数
验证是否生效
启动应用后,观察控制台日志:
- 出现
Undertow started on port(s): 8080表示切换成功 - 访问
/actuator/env查看server.undertow配置是否被加载 - 用
netstat -an | grep :8080或lsof -i :8080观察连接状态,长连接会稳定保持而非频繁新建/关闭



















