Tomcat 的架构如图所示:
从图中可以看出,Tomcat 的基本组件包括 Catalina、Server、Service、Connector、Container、Engine、Host、Context 和 Wrapper。其中,Tomcat 服务器的顶层容器是一个 Catalina 容器,Catalina 容器的顶层容器是 Server 容器,三者的关系是 1∶1∶1,也就是说,每个 Tomcat 实例有一个 Catalina 容器和一个 Server 容器。
1. Catalina:这是一个 Servlet 容器,用于处理 Servlet。它负责解析 Tomcat 的配置文件 (server.xml),从而创建并管理服务器组件。
2. Server:这是管理 Tomcat 实例的组件,负责组装和启动 Servlet 引擎及 Tomcat 连接器。Server 通过实现 Lifecycle 接口,为整个系统提供优雅的启动和关闭方式。
3. Service:这是一个逻辑组件,用于绑定 Connector 和 Container。Service 组件允许对外提供服务,可以认为一个 Service 对应启动一个 JVM。更严格来说,一个 Engine 组件对应一个 JVM,只不过 Connector 也在 JVM 中工作。
4. Connector:这是一个监听组件,具有以下四个功能:
打开监听套接字,监听外部请求并与客户端建立 TCP 连接。
使用 protocolHandler 解析请求中的协议和端口等信息,如 HTTP 协议、AJP 协议。
根据解析到的信息,使用 processor 将处理后的请求转发给绑定的 Engine。
接收响应数据并返回客户端。
5. Container:这是一个容器,负责处理用户的 Servlet 请求并将对象返回给 Web 用户。Container 是一类组件,包含四个容器类组件:Engine 容器、Host 容器、Context 容器和 Wrapper 容器。
6. Engine:用于从 Connector 组件接收已建立的 TCP 连接,还用于接收并解析客户端发送的 HTTP 请求,然后根据解析结果将相关参数传递给匹配的虚拟主机。Engine 还用于指定默认主机。
7. Host:用于定义虚拟主机。由于 Tomcat 主要作为 Servlet 容器使用,因此为每个 Web 应用指定了它们的根目录 appBase。
8. Context:根据 path 和 docBase 获取信息,并将结果交给其内的 Wrapper 组件处理,为 Wrapper 提供运行环境。一般采用默认的标准 Wrapper 类,因此在 Context 容器中几乎不会出现 Wrapper 组件。
9. Wrapper:对应 Servlet 的处理过程。它管理 Servlet 的生命周期,根据 Context 提供的信息及解析 web.xml 中的映射关系,负责加载相关类,初始化 Servlet 对象 (init())、执行 Servlet 代码 (service()) 以及在服务结束时销毁 Servlet 对象 (destroy())。
综上,Tomcat 的执行顺序如下:
Client(request)→ Connector → Engine → Host → Context → Wrapper(response data)→ Connector(response header)→ Client