聊聊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文件下的一些doc、example自带的Demo工程,没啥用,干掉。 - 进制Tomcat TDL扫描:为了支持JSP,Tomcat启动会扫描Jar包下的TDL文件,可以在context.xml配置文件中将这个TDL扫描禁用。 - 关闭WebSocket的支持,因为Tomcat启动的时候回去扫描相应的组件。 - 关闭JSP的支持,在xml配置文件中配置过滤JSP的配置。 - 并行容器启动开关打开:Tomcat默认web应用是一个个启动的,可以配置startStopThreads的数#Java##编程##计算机##后端#