这个题目命的其实是很大的,写的时候照旧很忐忑的,但我尽大概把这个进程描写清楚。因为这是读过源码今后写的总结,在写的进程中大概会忽略一些前提条件,假如有哪些较量突兀就呈现,或欠好领略的处所可以给我提 Issue,我会尽快增补修订相关内容。
许多对象在时序图中浮现的已经很是清楚了,没有须要再一步一步的作先容,所以本文以图为主,然后对部门内容加以简朴表明。
PlantUML 源文件:
本文对 Tomcat 的先容以 Tomcat-9.0.0.M22 为尺度。
Tomcat-9.0.0.M22 是 Tomcat 今朝最新的版本,但尚未宣布,它实现了 Servlet4.0 及 JSP2.3 并提供了许多新特性,需要 1.8 及以上的 JDK 支持等等,详情请查阅 Tomcat-9.0-doc
Overview
Bootstrap 作为 Tomcat 对外界的启动类,在 $CATALINA_BASE/bin 目次下,它通过反射建设 Catalina 的实例并对其举办初始化及启动。Catalina 理会 $CATALINA_BASE/conf/server.xml 文件并建设 StandardServer、StandardService、StandardEngine、StandardHost 等StandardServer 代表的是整个 Servlet 容器,他包括一个或多个 StandardServiceStandardService 包括一个或多个 Connector,和一个 Engine,Connector 和 Engine 都是在理会 conf/server.xml 文件时建设的,Engine 在 Tomcat 的尺度实现是 StandardEngineMapperListener 实现了 LifecycleListener 和 ContainerListener 接口用于监听容器事件和生命周期事件。该监听器实例监听所有的容器,包罗 StandardEngine、StandardHost、StandardContext、StandardWrapper,当容器有变换时,注册容器到 Mapper。Mapper 维护了 URL 到容器的映射干系。当请求到来时会按照 Mapper 中的映射信息抉择将请求映射到哪一个 Host、Context、Wrapper。Http11NioProtocol 用于处理惩罚 HTTP/1.1 的请求NioEndpoint 是毗连的端点,在请求处理惩罚流程中该类是焦点类,会重点先容。CoyoteAdapter 用于将请求从 Connctor 交给 Container 处理惩罚。使 Connctor 和 Container 解耦。StandardEngine 代表的是 Servlet 引擎,用于处理惩罚 Connector 接管的 Request。包括一个或多个 Host(虚拟主机), Host 的尺度实现是 StandardHost。StandardHost 代表的是虚拟主机,用于陈设该虚拟主机上的应用措施。凡是包括多个 Context (Context 在 Tomcat 中代表应用措施)。Context 在 Tomcat 中的尺度实现是 StandardContext。StandardContext 代表一个独立的应用措施,凡是包括多个 Wrapper,一个 Wrapper 容器封装了一个 Servlet,Wrapper的尺度实现是 StandardWrapper。StandardPipeline 组件代表一个流水线,与 Valve(阀)团结,用于处理惩罚请求。 StandardPipeline 中含有多个 Valve, 当需要处理惩罚请求时,会逐一挪用 Valve 的 invoke 要领对 Request 和 Response 举办处理惩罚。出格的,个中有一个非凡的 Valve 叫 basicValve,每一个尺度容器都有一个指定的 BasicValve,他们做的是最焦点的事情。
StandardEngine 的是 StandardEngineValve,他用来将 Request 映射到指定的 Host;StandardHost 的是 StandardHostValve, 他用来将 Request 映射到指定的 Context;StandardContext 的是 StandardContextValve,它用来将 Request 映射到指定的 Wrapper;StandardWrapper 的是 StandardWrapperValve,他用来加载 Rquest 所指定的 Servlet,并挪用 Servlet 的 Service 要领。Tomcat init