连接器(Connector)负责对外交流,建立Socket连接,读取并解析网络字节流,生成Request和Response对象并转发给容器。
容器(Container)负责内部处理,加载和管理Servlet,通过Response对象的输出流写入响应结果。
接口 | 默认实现 | 阀值 |
---|---|---|
Server | StanderdServer | |
Service | StanderdService | |
Engine | StanderdEngine | StandardEngineValve |
Host | StanderdHost | StandardHostValve |
Context | StanderdContext | StandardContextValve |
StandardWrapper | StandardWrapperValve | |
Endpoint组件没有接口 但提供一个抽象类AbstractEndpoint |
使用NioEndpoint |
|
ProtocolHandler |
使用Http11NioProtocol |
|
Processor |
使用Http11Processor |
对应Connector中的三个组件就是:Endpoint、Processor、Adapter,其中 Endpoint和 Processor放在一起抽象成了 ProtocolHandler协议组件。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zrBMdeMG-1684648768852)(assets/image-20220721205552106.png)]
ProtocolHandler负责传输层网络连接和应用层协议解析,由两个核心部件 Endpoint和 Processor具体做这两件事。
Tomcat的连接器主要支持两种协议:HTTP/1.1协议和AJP协议,实则还支持HTTP/2.0协议
还分别支持3种I/O方式:NIO、NIO2、APR
总结:两两组合就出现了很多实现类:Http11NioProtocol、Http11Nio2Protocol、Http11AprProtocol(已过期)、AjpNioProtocol、AjpNio2Protocol、AjpAjpProtocol
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6SWUksSA-1684648768852)(assets/image-20220721212502505.png)]
Endpoint负责网络通信,监听一个端口,循环接收socket请求,读取网络字节流等。Endpoint不是接口,而是提供了一个抽象类AbstractEndpoint,又根据I/O方式提供了若干实现类:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8GETZ0se-1684648768853)(assets/image-20220721205848106.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uxuL7z6j-1684648768854)(assets/image-20220721205906427.png)]
Acceptor接收到请求封装成一个SocketProcessor扔进线程池Executor后,会调用Processor从操作系统底层读取、过滤字节流,对应用层协议(HTTP/AJP)进行解析封装,生成org.apache.coyote.Request和org.apache.coyote.Response对象。不同的协议有不同的Processor,HTTP/1.1对应Http11Processor,AJP对应AjpProcessor,HTTP/1.2对应StreamProcessor,UpgradeProcessorInternal 和 UpgradeProcessorExternal用于协议升级:
SocketProcessor并不是直接调用的Processor,而是通过org.apache.coyote.AbstractProtocol.ConnectionHandler#process找到一个合适的Processor进行请求处理:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
executor="tomcatThreadPool"
redirectPort="8443">
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol"/>
Connector>
Adapter接口只有一个实现类org.apache.catalina.connector.CoyoteAdapter,其主要职责如下:
Tomcat所有的组件均存在初始化、启动、停止等生命周期方法,拥有生命周期管理的特性, 所以Tomcat在设计的时候, 基于生命周期管理抽象成了一个接口 Lifecycle 。而组件 Server、Service、Container、Executor、Connector 、WebappLoader、WebappClassLoader组件 , 都实现了一个生命周期的接口。
生命周期中的核心方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3E3fqOzJ-1684648768855)(assets/image-20220719112606727.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pCv24wZq-1684648768856)(assets/image-20220719111501610.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tPd1ncQj-1684648768856)(assets/image-20220730175705888.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8bARZsoh-1684648768857)(assets/image-20220719102639459.png)]
启动步骤
启动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 方法中 , 需要进行一些初始化的工作
解析 XML,填充到StandardServer中,包含StandardService、Connector、StandardEngine、Mapper、MapperListener等等;
重定向日志输出路径
将很多组件注册到JMX(全称为“Java Management Extension”,即Java管理扩展)中。注册后可以通过Jconsole获取属性,对象等监控信息。IDEA debug tomcat应用的时候利用JMX技术调用org.apache.catalina.mbeans.MBeanFactory#createStandardContext(java.lang.String, java.lang.String, java.lang.String)来初始化StandardContext,如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l8tlr8gD-1684648768857)(assets/image-20220731133800684.png)]
在context的start方法中
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RzSpxlAt-1684648768857)(assets/image-20220721210422762.png)]