Tomcat 启动流程详解
Tomcat 启动流程
通过上图分析:Tomcat的启动过程非常标准化, 统一按照生命周期管理接口Lifecycle的定义进行启动。首先调用init() 方法进行组件的逐级初始化操作,然后再调用start()方法进行启动。每一级的组件除了完成自身的处理外,还要负责调用子组件响应的生命周期管理方法,组件与组件之间是松耦合的,因为我们可以很容易的通过配置文件进行修改和替换。
启动步骤:
- 启动tomcat , 需要调用 bin/startup.bat (在linux 目录下 , 需要调用 bin/startup.sh) , 在startup.bat 脚本中, 调用了catalina.bat。
- 在catalina.bat 脚本文件中,调用了BootStrap 中的main方法。
- 在BootStrap 的main 方法中调用了 init 方法 , 来创建Catalina 及 初始化类加载器。
- 在BootStrap 的main 方法中调用了 load 方法 , 在其中又调用了Catalina的load方 法。
- 在Catalina 的load 方法中 , 需要进行一些初始化的工作, 并需要构造Digester 对象, 用 于解析 XML。
- 然后在调用后续组件的初始化操作 。。。 加载Tomcat的配置文件,初始化容器组件 ,监听对应的端口号, 准备接受客户端请求。
Tomcat的Lifecycle生命周期接口
Tomcat所有的组件均存在初始化、启动、停止等生命周期方法,拥有生命周期管理的特性, 所以Tomcat在设计的时候, 基于生命周期管理抽象成了一个接口 Lifecycle ,而组件 Server、Service、Container、Executor、Connector 组件 , 都实现了一个生命周期的接口。
生命周期中的核心方法
- init():初始化组件
- start():启动组件
- stop():停止组件
- destroy():销毁组件
Tomcat 各组件的默认实现类
Tomcat的 Server、Service、Engine、Host、Context都是接口。 实际执行的时这些接口的实现类。
接口 | 默认实现 |
---|---|
Server | StanderdServer |
Service | StanderdService |
Engine | StanderdEngine |
Host | StanderdHost |
Context | StanderdContext |
Endpoint组件没有接口 | 但提供一个抽象类AbstractEndpoint |
Endpoint组件在《Tomcat 连接器 Coyote》文章中也提到过。
Endpoint组件在Tomcat中没有对应的Endpoint接口, 但是有一个抽象类 AbstractEndpoint 。其下有三个实现类: NioEndpoint、Nio2Endpoint、AprEndpoint , 这三个实现类分别对应于前面讲解链接器 Coyote时, 提到的链接器支持的三种IO模型:NIO,NIO2,APR 。
Tomcat8.5版本中,默认采用的是 NioEndpoint。
ProtocolHandler : Coyote协议接口,通过封装Endpoint和Processor , 实现针对具体协议的处理功能。
Tomcat按照协议和IO提供了6个实现类。
AJP协议:
- AjpNioProtocol :采用NIO的IO模型。
- AjpNio2Protocol:采用NIO2的IO模型。
- AjpAprProtocol :采用APR的IO模型,需要依赖于APR库。
HTTP协议:
- Http11NioProtocol :采用NIO的IO模型,默认使用的协议(如果服务器没有安装APR)。
- Http11Nio2Protocol:采用NIO2的IO模型。
- Http11AprProtocol :采用APR的IO模型,需要依赖于APR库。