聊聊Tomcat架构和生命周期


1.Tomcat整体架构


Tomcat的物理架构主要由两个核心域功能支撑:

1. Connector连接器,负责处理对外连接,和IO数据转码Request、Response的处理。
     1. Container容器,负责加载、管理Servlet,处理具体的HTTP Request请求执行逻辑。

2.Tomcat核心组件

2.1 Server

Server指代的就是整个Tomcat服务器,它内部包含了多个Service,负责管理和启动各个Service,同时也负责监听shutdown关闭容器命令。

2.2 Service

每一个Service组件都包含了多个Connector和Executor。Connector的作用就是负责处理客户端的连接请求,Executor水白了就是线程池,负责处理Service内所有组件的任务。 一个Server包含多个Service,一个Service中有多个连接器和一个Engine容器。连接器和容器之间是通过ServletRequest、ServletResponse通信交互数据。

2.3 Connector连接器

连接器的作用就是负责处理对外网络IO任务。连接器对内屏蔽了不同的应用层协议和网络IO模型。Tomcat支持多种I/O模型和应用层协议。 Tomcat支持的网络IO模型有:

- BIO:同步阻塞式IO,性能最低。
     - NIO:同步非阻塞式IO,基于JDK的NIO库实现,Tomcat内部实现了自己的Reactor模型,性能不错。
     - AIO(NIO2):异步式IO模型,基于JDK的NIO2库实现。
     - APR:使用C++本地库实现,从操作系统层面来处理异步式IO,性能较高。
复制代码

Tomcat支持的应用层协议有:

- HTTP1.1 - HTTP2:基于HTTP2.0引用层协议,大幅提升了web2.0的性能。 - AJP:用于和Web服务器集成,例如Apache。
复制代码

2.3.1 连接器需要实现的功能

- 监听网络端口,接受客户端网络连接请求。
     - 根据不同的应用层协议解析数据流,封装成统一的Request对象。
     - 将Tomcat Request对象转换成标准的ServletRequest对象和容器交互。
     - 将ServletRequest对象转交给容器,让容器处理业务任务,然后得到容器返回来的ServletResponse对象。
     - 将ServletResponse对象转换成Tomcat统一的Response对象,然后序列化成字节流响应给客户端。
复制代码

连接器的三个功能:网络通信、协议解析、Request/Response和ServletRequest/ServletResponse对象的转换,这三个功能交给了三个组件来分别完成:

- `EndPoint`:负责提供数据字节流给Processor。
     - `Processor`:负责提供Tomcat Request对象给Adapter。
     - `Adapter`:负责提供ServletRequest对象给Servlet容器处理业务。

2.3.2 ProtocolHandler

ProtocolHandler包含了EndPoint和Processor,它融合了网络连接功能和应用层协议解析的能力。

2.4 Container容器相关组件

在Tomcat中,容器的概念就是来装载Servlet的一个管理器,Tomcat基于分层架构的思想,设计了4种容器:Engine、Host、Context、Wrapper。它们之间是父子关系。

Tomcat采用组合模式来管理这些容器,所有容器组件都会实现Container接口,使得所有的容器组件都存在共性。

3.Tomcat工作原理

3.1 Request请求如何定位Servlet

Tomcat将请求路由到具体的Servlet的过程是交给Mapper组件来完成的。Mapper组件里面会保存着Tomcat应用的各种应用配置信息,例如Host域名、Context路径等。

1. 根据请求协议和端口号路由到相应的Service,找到Service对应唯一的Engine容器。
     1. 根据域名地址找到相应的Host。
     1. 根据URL路径匹配某一个Context组件。
     1. 最后根据URL匹配某一个Servlet。
复制代码

3.2 请求再容器中的链式调用过程

Connector连接器中的Adapter适配器组件将封装好了的ServletRequest对象传递给Service的Engine容器,Engine处理完毕后继续将请求传递给子容器Host,Host继续处理交给子容器Context,如此下去形成了一个管道式的调用过程Pipline-Valve责任链模式的解决方案。 Pipeline中维护了一个Valve链表,Valve可以插入到Pipeline中,对请求做处理,每一个Valve处理完成后交给下一个Valve处理。

4.Tomcat生命周期

Tomcat作为一个应用服务器当然存在创建、初始化、启动、停止、销毁等阶段。

4.1 LifeCycle接口

Tomcat将容器生命周期抽象成了一个LifeCycle接口,接口里面定义了init( )、start( )、stop( )、destroy( )方法,具体的实现交给他的实现组件。上层容器的初始化会触发子容器的初始化,上层容器的启动会触发子容器的启动。 LifeCycle在每一个阶段方法触发的时候会通过观察者模式来触发具体事件,监听这个事件的组件可以自定义执行一些操作。LifeCycle中提供了添加监听者的方法。

4.2 LifeCycleBase抽象基类

为了提高复用性,Tomcat提出了一个抽象类来实现LifeCycle接口,这就是LifeCycleBase抽象类,这个抽象类里面提供了公共的一些逻辑,例如生命周期的状态、事件触发等。 LifeCycleBase也基于模板方法模式,提供了一些抽象方法供子类自己实现。

5.优化Tomcat的启动速度

- 清理Tomcat:清理掉不必要的Web引用,例如webapps文件下的一些docexample自带的Demo工程,没啥用,干掉。 - 进制Tomcat TDL扫描:为了支持JSPTomcat启动会扫描Jar包下的TDL文件,可以在context.xml配置文件中将这个TDL扫描禁用。 - 关闭WebSocket的支持,因为Tomcat启动的时候回去扫描相应的组件。 - 关闭JSP的支持,在xml配置文件中配置过滤JSP的配置。 - 并行容器启动开关打开:Tomcat默认web应用是一个个启动的,可以配置startStopThreads的数
#Java##编程##计算机##后端#
全部评论
感谢大佬分享的Tomcat
点赞 回复 分享
发布于 2022-08-09 21:44

相关推荐

冲芭芭拉鸭:你这图还挺新,偷了。
投递美团等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
1
分享
牛客网
牛客企业服务