Tomcat 是基于 Java 的开源 Servlet 容器,实现了 Servlet/JSP 规范,核心作用是处理 HTTP 请求并将结果返回给客户端。其工作原理可拆解为「架构设计、请求处理流程、核心组件协作」三部分,以下是通俗易懂的全维度解析:
Tomcat 采用「分层 + 模块化」设计,核心组件按职责划分,底层依赖 Java NIO(8.0+ 默认)实现高性能 IO 处理:
核心关系:Server → Service → (Connector + Engine) → Host → Context → Wrapper → Servlet
以「浏览器访问 http://localhost:8080/demo/hello」为例,拆解 Tomcat 处理请求的完整步骤:
- Connector 绑定 8080 端口,通过「Acceptor 线程」监听客户端连接;
- 接收到 HTTP 请求后,由「Poller 线程」(NIO 模式)将连接交给「Worker 线程池」处理;
- Worker 线程解析 HTTP 协议(请求行、请求头、请求体),封装为 Tomcat 内部的
Request 和 Response 对象(而非 Servlet 标准对象)。
Connector 将封装后的 Request/Response 转发给 Service 绑定的 Engine 组件。
Engine 根据请求的域名(如 localhost)匹配对应的 Host 组件,转发请求。
Host 根据请求的上下文路径(如 /demo)匹配对应的 Context 组件(即 Web 应用),转发请求。
Context 根据请求的 Servlet 路径(如 /hello)匹配 web.xml 或注解配置的 Servlet,找到对应的 Wrapper 组件。
- Wrapper 检查 Servlet 实例是否已初始化:
- 未初始化:调用
Servlet.init() 初始化(仅第一次调用);
- 已初始化:直接复用实例(Servlet 默认为单例);
- Wrapper 调用
Servlet.service() 方法,将 Tomcat 内部 Request/Response 转换为 Servlet 标准的 HttpServletRequest/HttpServletResponse;
- Servlet 处理业务逻辑(如查询数据库、生成响应数据),将结果写入
HttpServletResponse。
- Servlet 处理完成后,响应数据从 Wrapper → Context → Host → Engine 逐层回传给 Connector;
- Connector 将
Response 转换为 HTTP 协议格式,通过网络返回给客户端;
- 连接处理完成:若为长连接(HTTP/1.1)则复用,短连接则关闭。
- Tomcat 默认使用线程池处理请求,避免为每个请求创建新线程(减少资源开销);
- 核心参数(可配置):
maxThreads:最大线程数(默认 200),超出则请求进入等待队列;
acceptCount:等待队列长度(默认 100),超出则拒绝请求;
minSpareThreads:核心线程数,保持常驻线程避免频繁创建。
- BIO(阻塞 IO):每个请求占用一个线程,阻塞等待数据,性能低(Tomcat 7 及以下默认);
- NIO(非阻塞 IO):基于 Reactor 模式,少量线程处理大量连接,性能高(Tomcat 8+ 默认);
- NIO2(异步 IO):基于 JDK 7 的 AIO,进一步提升高并发性能;
- APR:基于本地库的 IO 模型,性能最优(需安装本地依赖)。
Tomcat 负责 Servlet 的完整生命周期:
实例化(new)→ 初始化(init())→ 处理请求(service())→ 销毁(destroy())
init():仅在第一次请求时调用,用于初始化资源(如数据库连接);
service():每次请求调用,根据请求方式(GET/POST)调用 doGet()/doPost();
destroy():Tomcat 关闭时调用,释放资源。
Tomcat 打破 JVM 双亲委派模型,为每个 Context(Web 应用)创建独立的 WebappClassLoader:
- 优先加载 Web 应用
WEB-INF/classes 和 WEB-INF/lib 下的类;
- 避免不同 Web 应用的类冲突(如不同应用依赖不同版本的 Spring 包)。
<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" connectionTimeout="20000"/>
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Context path="/demo" docBase="demo" reloadable="true"/>
</Host>
</Engine>
</Service>
</Server>
Tomcat 的工作原理本质是「协议解析 + 组件路由 + Servlet 执行 + 响应返回」的闭环:
- 底层通过 Connector 完成 HTTP 协议解析和 IO 处理;
- 中层通过 Engine/Host/Context/Wrapper 完成请求的精准路由;
- 上层通过 Servlet 生命周期管理完成业务逻辑处理;
- 依托线程池、NIO 等机制保障高性能和高可靠性。
理解 Tomcat 工作原理的核心是抓住「组件分层协作」和「请求链路流转」,这也是排查 Tomcat 性能问题、配置优化的基础。