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