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.maxIO 密集:200~500;CPU 密集:CPU×2
最大连接数max-connections默认 8192,按实际调整
响应压缩server.compression.enabled=true文本类接口开启
访问日志accesslog.enabled=true生产必开,便于排查

与 Undertow 对比

特性TomcatUndertow
IO 模型NIO / NIO2NIO(XNIO)
内存占用较高较低
吞吐量略高
Spring Boot 默认需替换依赖

相关链接