Tomcat 是一个开源的 Java Servlet 容器,同时也是一个轻量级 Web 服务器。它的核心工作原理是:通过 Connector(连接器) 接收并解析网络请求,再通过 Container(容器) 按层级路由到对应的 Servlet 执行业务逻辑,最后将响应原路返回给客户端。
一、核心架构(组件树)
Tomcat 采用分层、模块化的组件设计,核心组件关系如下:
plaintext
Server (整个服务器实例)
└── Service (服务单元,关联连接器与引擎)
├── Connector (连接器,可多个,处理网络通信)
└── Container (容器,处理业务逻辑)
└── Engine (引擎,顶层容器,管理虚拟主机)
└── Host (虚拟主机,对应域名)
└── Context (Web应用,对应WAR包/目录)
└── Wrapper (Servlet包装器,管理单个Servlet)
1. 顶层组件
- Server:代表整个 Tomcat 实例,管理生命周期,监听 shutdown 端口(默认 8005)。
- Service:将一组 Connector 与一个 Engine 绑定,实现多端口 / 多协议共享同一套 Web 应用。
2. Connector(连接器)—— 网络通信层
负责与客户端交互,将 Socket 字节流转换为 Servlet 容器可识别的 Request/Response 对象。
- Endpoint:底层 I/O 处理,监听端口、接收连接(Tomcat 8+ 默认 NIO,Reactor 模式)。
- Processor:协议解析(HTTP/1.1、HTTP/2、AJP),将字节流解析为内部请求对象。
- Adapter:适配转换,将 Tomcat 内部 Request 转为标准
ServletRequest,供容器调用。
3. Container(容器)—— 业务处理层
采用 Pipeline-Valve(管道 - 阀门) 责任链模式,逐层处理请求。
- Engine:请求处理入口,根据 Host 头路由到对应虚拟主机。
- Host:对应一个域名(如 localhost、www.example.com),管理该域名下的所有 Web 应用。
- Context:对应一个 Web 应用(如
/myapp),管理 Servlet、Filter、Listener 及类加载器。 - Wrapper:最底层容器,封装单个 Servlet,管理其生命周期(加载、初始化、service、销毁)。
二、请求处理全流程(HTTP 请求为例)
- 连接建立:客户端发起 HTTP 请求,Connector 的 Endpoint 监听端口(如 8080),Acceptor 接收 TCP 连接。
- I/O 与协议解析:Poller 线程管理 Socket,工作线程从线程池取出,Processor 解析 HTTP 协议,生成 Tomcat 内部 Request 对象。
- 适配转换:CoyoteAdapter 将内部 Request 转换为标准
ServletRequest,传递给 Engine 容器。 - 容器路由:
- Engine 通过 Mapper 组件,根据请求的 Host 找到对应 Host 容器。
- Host 根据请求路径(如
/myapp)找到对应 Context(Web 应用)。 - Context 根据 URL 匹配规则,找到处理该请求的 Wrapper(Servlet)。
- Pipeline 执行:每个容器的 Pipeline 依次执行 Valve,最终到达 StandardWrapperValve。
- Servlet 调用:
- Wrapper 加载并实例化 Servlet(若未加载),调用
init()初始化。 - 创建 FilterChain,依次执行所有匹配的 Filter,最后调用 Servlet 的
service()方法。 - Servlet 执行业务逻辑(如
doGet()/doPost()),生成ServletResponse。
- Wrapper 加载并实例化 Servlet(若未加载),调用
- 响应返回:响应沿原路径返回,经 Adapter 转换、Processor 封装为 HTTP 响应,通过 Socket 发送给客户端。
三、关键机制
- 类加载机制:打破 Java 双亲委派,每个 Context 有独立的 WebAppClassLoader,实现 Web 应用间类隔离。
- 生命周期管理:所有组件实现
Lifecycle接口,统一管理 init、start、stop、destroy 流程。 - Pipeline-Valve 模式:提供灵活的扩展点,可在请求处理的各个阶段插入自定义逻辑。
- 线程池:Connector 使用线程池处理并发请求,提升性能。
四、总结
Tomcat 通过 Connector 负责网络通信、Container 负责业务路由与 Servlet 执行,将复杂的 Web 请求处理解耦为清晰的分层流程,既实现了 Web 服务器的功能,又完整支持 Servlet/JSP 规范,是 Java Web 开发的核心基础设施。