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 对比

特性UndertowTomcat
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开启可减少连接数,适合多资源页面

相关链接