Undertow
Undertow 是 RedHat 开发的高性能 非阻塞 Web 服务器,基于 XNIO(JBoss 的非阻塞 IO 框架),是 WildFly 的默认服务器,也是 Spring Boot 的可选内嵌容器之一。相比 Tomcat,Undertow 内存占用更低、启动更快。
整体架构
XNIO Worker(线程池)
├── IO 线程(接收连接 & IO 事件,非阻塞)
└── Worker 线程(处理业务逻辑,阻塞 OK)
请求链路:
Client → ListenerService(HTTP/HTTPS/HTTP2)
→ HttpHandler 链(责任链模式)
→ Servlet / REST Handler
| 组件 | 职责 |
|---|---|
| XNIO | 非阻塞 IO 抽象,屏蔽 JDK NIO 细节 |
| ListenerService | 监听端口,支持 HTTP/1.1、HTTP/2、WebSocket |
| HttpHandler | 责任链,每个 Handler 处理一类横切逻辑 |
| WorkerDispatchHandler | 将阻塞逻辑分发到 Worker 线程池 |
线程模型
Undertow 分两类线程,IO 线程绝不能阻塞:
IO 线程(默认 CPU 核数)
│ 负责:接收连接、读写 Buffer、调度
│ 禁止:Thread.sleep / 数据库调用 / 任何阻塞 IO
▼
Worker 线程(默认 CPU×8,可配置)
│ 负责:业务逻辑、Servlet 执行
▼
响应写回 IO 线程
Spring Boot 集成
替换默认 Tomcat 依赖即可:
<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>server:
undertow:
threads:
io: 4 # IO 线程数,默认 CPU 核数
worker: 32 # Worker 线程数,默认 io×8
buffer-size: 1024
direct-buffers: true # 使用堆外内存,减少 GC
max-http-post-size: -1 # 不限制 POST 体大小(-1)HTTP/2 配置
server:
http2:
enabled: true
ssl:
key-store: classpath:keystore.p12
key-store-password: changeit
key-store-type: PKCS12
port: 8443编程式 API(不依赖 Spring)
Undertow server = Undertow.builder()
.addHttpListener(8080, "0.0.0.0")
.setHandler(exchange -> {
exchange.getResponseHeaders()
.put(Headers.CONTENT_TYPE, "text/plain");
exchange.getResponseSender().send("Hello, Undertow!");
})
.setWorkerThreads(64)
.setIoThreads(4)
.build();
server.start();优雅停机
server:
shutdown: graceful
spring:
lifecycle:
timeout-per-shutdown-phase: 30s与 Tomcat 对比
| 特性 | Undertow | Tomcat |
|---|---|---|
| IO 模型 | XNIO(非阻塞) | NIO / NIO2 |
| 内存占用 | 低(无 JSP 引擎) | 较高 |
| 吞吐量 | 略高 | 高 |
| HTTP/2 支持 | 原生 | 需配置 |
| JSP 支持 | 需额外依赖 | 内置 |
| Spring Boot 默认 | 否(需替换) | 是 |
| 适用场景 | 高并发 REST API | 通用 Web 应用 |
性能调优要点
| 方向 | 建议 |
|---|---|
| IO 线程 | = CPU 核数,勿超 |
| Worker 线程 | IO 密集 io×8~16;CPU 密集 io×2 |
| 堆外缓冲 | direct-buffers: true 减少 GC 停顿 |
| HTTP/2 | 开启可减少连接数,适合多资源页面 |