内部组件与流程
Catalina 容器
Catalina 是 Apache Tomcat 的 Servlet 容器实现,其主要职责包括:
- 解析 HTTP 请求并调用对应的 Servlet
- 管理 Servlet 的生命周期(加载、初始化、销毁)
- 提供标准的 Servlet API 支持
- 支持 Session 管理、Cookie 处理
- 集成 JSP 编译、JNDI 查找、用户认证等容器级功能
Catalina 的架构是典型的容器嵌套结构,核心接口是 org.apache.catalina.Container:
Engine (顶级容器)
└── Host (虚拟主机)
└── Context (Web应用)
└── Wrapper (单个Servlet)
- Engine:StandardEngine,代表整个 Catalina 引擎,可以配置多个虚拟主机(Host)
- Host,StandardHost:表示一个虚拟主机,对应 server.xml 中的 配置
- Context,StandardContext:表示一个 Web 应用,通常对应一个 WAR 包或一个 webapps 子目录
- Wrapper,StandardWrapper:表示一个 Servlet(如 LoginServlet)
这些容器都是 Container 接口的实现,支持递归嵌套与生命周期管理(start、stop、init)
分层结构
Tomcat 是有一个由一系列配置(conf/server.xml)的组件构成的Web容器,而Catalina是Tomcat的Servlet容器。
从另一个角度来说,Tomcat 本质上就是一款 Servlet 容器,因为 Catalina 才是 Tomcat的核心,其他模块都是为 Catalina 提供支撑的,比如:Coyote 模块提供链接通信,Jasper模块提供JSP引擎,Naming提供JNDI服务,Juli提供日志服务。
容器结构
我们可以认为整个 Tomcat 就是一个 Catalina 实例,Tomcat 启动的时候会初始化这个个例,Catalina 实例通过加载 server.xml 完成其他实例的创建,创建并管理一个 Server,Server创建管理多个服务,每个服务又可以有多个Connector和一个Container。
● 一个 Catalina 实例 ● 一个 Server 实例 ● 多个 Service 实例
每一个 Service 实例下可以有多个 Connector 和 一个 Container 实例
● Catalina:负责解析Tomcat配置文件(server.xml),以此来创建服务器Server 组件并进行管理 ● Server:服务器表示整个Catalina Servlet容器以及其他组件,负责组装并启动Servlet引擎,Tomcat连接器,Server通过实现LifeCycle接口,提供了一种优雅的启动和关闭整个系统的方式 ● Service:服务是Server内部的组件,一个Server包含多个Service,它将若干个Connector组件绑定到一个Container ● Container:容器,负责处理用户的Servlet请求,并返回给对象给Web用户的模块
Container 具体结构
Container 组件下有几种具体的组件,分别是 Engine、Host、Context 和 Wrapper。这 4 种组件是父子关系,Tomcat 通过一种分层的架构,使得 Servlet 容器具有很好的灵活性。
● Engine:表示整个Catalina的Servlet引擎,用来管理多个虚拟站点,一个Service最多只能有一个Engine,但是一个引擎可以包含多个Host ● Host:代表一个虚拟主机,或者说一个站点,可以给Tomca配置多个虚拟主机地址,而一个虚拟主机下可能包含多个Context ● Context:表示一个Web应用程序,一个Web应用可以包含多个Wrapper ● Wrapper:表示一个Servlet,Wrapper作为容器中的最低层,不能包含子容器。上述组件的配置其实就是 conf/server.xml 中
启动流程
Catalina 的启动流程可以通过 bin/startup.sh 脚本追溯到底层 Java 类:
startup.sh 脚本调用 catalina.sh catalina.sh 会执行:java org.apache.catalina.startup.Bootstrap start
Bootstrap 类完成以下几件事:
- 加载 catalina.jar
- 创建并初始化 Catalina 实例
- 调用 catalina.load() 加载 server.xml 配置
- 调用 catalina.start() 启动服务(包含 Connector 和 Container)
线程处理机制
Catalina 是基于线程池来处理请求的:
- 每个 Connector 内部使用线程池(如 org.apache.tomcat.util.threads.ThreadPoolExecutor)
- 请求进入后会转化为 HttpServletRequest/Response,交由对应的 Wrapper 执行 Servlet
这种机制既能高并发处理请求,也可通过配置限制最大线程数量(防止 OOM)。