Tomcat 是一个开源的、轻量级的 Java Web 应用服务器,也是 Servlet 和 JSP 技术的官方参考实现。其核心是处理 HTTP 请求、管理 Servlet 生命周期并提供 Web 应用运行环境。
### 一、核心架构与组件
Tomcat 采用分层、模块化的容器架构,其核心组件及职责如下表所示:
| 组件 | 核心职责 | 关键实现类/接口 |
| :--- | :--- | :--- |
| **Server** | 代表整个 Tomcat 实例,是生命周期管理的最顶层容器。 | `org.apache.catalina.Server` |
| **Service** | 在 Server 内部,将 Connector 与 Container(Engine)绑定。 | `org.apache.catalina.Service` |
| **Connector** | 处理网络连接(如 HTTP/1.1, AJP),将字节流转换为 `Request`/`Response` 对象。 | `org.apache.catalina.connector.Connector` |
| **Container** | 处理 Servlet 请求的容器体系,采用责任链模式。 | `org.apache.catalina.Container` |
| **Engine** | 顶级容器,代表整个 Servlet 引擎,可包含多个 Host。 | `org.apache.catalina.Engine` |
| **Host** | 虚拟主机,代表一个网络域名(如 `localhost`),可包含多个 Context。 | `org.apache.catalina.Host` |
| **Context** | Web 应用上下文,对应一个 `/WEB-INF/web.xml` 和一套类加载器,可包含多个 Wrapper。 | `org.apache.catalina.Context` |
| **Wrapper** | 最底层容器,封装单个 Servlet 定义,管理其生命周期(init, service, destroy)。 | `org.apache.catalina.Wrapper` |
| **Pipeline & Valve** | 容器内部处理请求的责任链管道与阀门机制,提供可插拔的处理逻辑。 | `org.apache.catalina.Pipeline`, `org.apache.catalina.Valve` |
| **Mapper** | 将请求 URL 映射到对应的 Host、Context、Wrapper。 | `org.apache.catalina.mapper.Mapper` |
### 二、核心处理流程
#### 1. 启动流程
启动入口为 `Bootstrap.main()`,核心流程如下:
1. **初始化类加载器**:创建 `CatalinaClassLoader`,用于加载 Tomcat 内部类,与 Web 应用类加载器隔离。
2. **解析 `server.xml`**:`Catalina.load()` 方法使用 `Digester` 解析配置文件,构建 `Server`、`Service`、`Connector`、`Engine` 等组件对象树。
3. **初始化并启动组件**:调用 `Server.init()` 和 `Server.start()`,触发各组件生命周期。`Connector` 启动时会初始化协议处理器(如 `Http11NioProtocol`)、端点(`Endpoint`,如 `NioEndpoint`),并启动 Acceptor 线程、Poller 线程和工作线程池。
#### 2. 请求处理流程
当一个 HTTP 请求到达时,处理流程如下:
1. **接收连接**:`Acceptor` 线程接收新 Socket 连接,并将其注册到 `Poller`。
2. **I/O 事件处理**:`Poller` 线程通过 `Selector` 监听 Socket 的读写事件。当通道可读时,从线程池获取一个工作线程来处理。
3. **协议解析**:工作线程调用 `Http11Processor` 等组件,按照 HTTP 协议解析输入流,生成 Tomcat 内部的 `Request` 和 `Response` 对象。
4. **适配与映射**:`CoyoteAdapter` 将协议层对象适配为 Servlet API 标准的 `HttpServletRequest` 和 `HttpServletResponse` 对象。随后调用 `Mapper.map()` 方法,根据请求的 URL、主机名等信息,确定处理该请求的 Host、Context、Wrapper(Servlet)。
5. **容器责任链调用**:请求被传递到 `Engine` 的 `Pipeline`,开始执行 `Valve` 链。核心调用顺序为:`EngineValve` -> `HostValve` -> `ContextValve` -> `WrapperValve`。`WrapperValve` 负责调用 `Wrapper.allocate()` 分配或创建 Servlet 实例,并最终调用 `FilterChain.doFilter()` 和 `Servlet.service()` 方法。
6. **响应返回**:Servlet 处理完成后,响应沿原路返回,通过协议处理器写入 Socket 输出流。
### 三、核心设计思想与机制
1. **生命周期统一管理**:所有核心组件均实现 `Lifecycle` 接口,通过 `init()`、`start()`、`stop()`、`destroy()` 方法统一管理状态,采用**观察者模式**通知状态变化。
2. **责任链模式**:`Pipeline` 和 `Valve` 机制是容器处理请求的核心,提供了高度的灵活性和可扩展性,允许开发者插入自定义处理逻辑。
3. **分层类加载器**:Tomcat 实现了自定义的类加载器体系(`WebappClassLoader`),支持 Web 应用隔离、热部署,并遵循双亲委派模型的变体。
4. **并发控制与线程池**:通过 `LimitLatch` 控制连接数,使用 `Executor` 线程池处理请求,有效管理资源,防止过载。
### 四、关键配置与优化
| 配置项 | 文件 | 作用与说明 |
| :--- | :--- | :--- |
| **端口与协议** | `server.xml` `<Connector>` | 配置监听端口、协议(HTTP/1.1, AJP)、线程池参数(maxThreads, acceptCount)等。 |
| **虚拟主机** | `server.xml` `<Host>` | 配置域名、应用基础目录(appBase)。 |
| **Web应用** | `context.xml` | 配置数据源、会话管理器、类加载器等上下文参数。 |
| **Servlet映射** | `web.xml` | 配置 Servlet 定义、映射、过滤器、监听器等。 |
| **日志配置** | `logging.properties` | 配置日志级别、输出格式和文件位置。 |
**常用优化方向**:
* **Connector 调优**:调整 `maxThreads`(最大工作线程数)、`acceptCount`(等待队列长度)、`connectionTimeout`(连接超时)。
* **JVM 调优**:设置合适的堆内存(`-Xms`, `-Xmx`)、新生代大小、选择垃圾收集器(如 G1)。
* **会话管理**:对于集群环境,配置会话持久化或使用外部存储(如 Redis)。
* **静态资源缓存**:配置 `DefaultServlet` 的缓存参数,或使用前端代理(如 Nginx)处理静态文件。

1727

被折叠的 条评论
为什么被折叠?



