Tomcat
Apache Tomcat 是开源的 Servlet 容器,实现了 Jakarta EE 的 Servlet、JSP、WebSocket 规范,是 Spring Boot 默认内嵌的 Web 服务器。
整体架构
Server
└── Service
├── Connector (HTTP/1.1 :8080)
│ └── ProtocolHandler → Endpoint (NIO/NIO2)
└── Engine (Catalina)
└── Host (localhost)
└── Context (/app)
└── Wrapper (Servlet)
| 组件 | 职责 |
|---|---|
| Connector | 监听端口,解析 HTTP,调用 Engine |
| Engine | 顶层容器,选择合适的 Host |
| Host | 虚拟主机,对应一个域名 |
| Context | 一个 Web 应用,对应一个 war/目录 |
| Wrapper | 封装单个 Servlet |
请求处理流程
客户端
│
▼
Endpoint(Acceptor 接受连接,Poller 监听 IO 事件)
│
▼
ProtocolHandler(解析 HTTP 协议)
│
▼
CoyoteAdapter(转换为 Servlet Request/Response)
│
▼
Pipeline → Valve 链(AccessLogValve、AuthenticatorValve 等)
│
▼
Servlet(Spring 的 DispatcherServlet)
线程模型
Tomcat 默认使用 NIO Connector(异步非阻塞 IO + 线程池):
server:
tomcat:
threads:
max: 200 # 最大工作线程(默认 200)
min-spare: 10 # 最小空闲线程
max-connections: 8192 # 最大连接数
accept-count: 100 # 连接队列长度(满后拒绝)
connection-timeout: 20000类加载器层次
Bootstrap ClassLoader
└── Extension ClassLoader
└── System ClassLoader
└── Common ClassLoader(Tomcat 公共库)
├── Catalina ClassLoader(Tomcat 内部)
└── WebApp ClassLoader(每个应用独立)
每个 Context 有独立的 WebApp ClassLoader,实现应用间类隔离,同时打破双亲委派(先由 WebApp ClassLoader 加载,找不到再委托父加载器)。
Spring Boot 内嵌 Tomcat
TomcatServletWebServerFactory 自动配置并启动内嵌 Tomcat,无需外部容器:
@Bean
public TomcatServletWebServerFactory tomcatFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.addConnectorCustomizers(connector -> {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
protocol.setMaxThreads(500);
protocol.setConnectionTimeout(10_000);
});
return factory;
}虚拟线程(Java 21+)
spring:
threads:
virtual:
enabled: true # Tomcat 请求线程全部切换为虚拟线程等效代码:
@Bean
public TomcatProtocolHandlerCustomizer<?> virtualThreadTomcat() {
return handler ->
handler.setExecutor(Executors.newVirtualThreadPerTaskExecutor());
}HTTPS 配置
server:
ssl:
key-store: classpath:keystore.p12
key-store-password: changeit
key-store-type: PKCS12
key-alias: tomcat
port: 8443优雅停机
server:
shutdown: graceful
spring:
lifecycle:
timeout-per-shutdown-phase: 30s性能调优
| 方向 | 配置项 | 建议 |
|---|---|---|
| 最大线程数 | threads.max | IO 密集:200~500;CPU 密集:CPU×2 |
| 最大连接数 | max-connections | 默认 8192,按实际调整 |
| 响应压缩 | server.compression.enabled=true | 文本类接口开启 |
| 访问日志 | accesslog.enabled=true | 生产必开,便于排查 |
与 Undertow 对比
| 特性 | Tomcat | Undertow |
|---|---|---|
| IO 模型 | NIO / NIO2 | NIO(XNIO) |
| 内存占用 | 较高 | 较低 |
| 吞吐量 | 高 | 略高 |
| Spring Boot 默认 | 是 | 需替换依赖 |