1 前言
最近在复习 Tomcat 的请求处理过程,之前也看过一些局部的细节,【SpringBoot + Tomcat】【一】请求到达后端服务进程后的处理过程-连接器的创建和执行、【SpringBoot + Tomcat】【二】请求到达后端服务进程后的处理过程-连接的处理细节,但是没看完整,这节我们从整体看一下 Tomcat 从接收请求到最后到达 SpringMVC 的 DispatcherServlet 的过程。
另外参考我的两篇,可以帮助你理解 DispatcherServlet 是如何注入到 Tomcat 的过程(本节不会讲这个):【Spring MVC + Tomcat】Spring MVC 传统VS现代方式的启动过程对比、【Spring MVC + Tomcat】追本溯源,Spring MVC是如何和Tomcat关联到一块的呢?
2 整体一览
我们先从整体的请求处理上,有一个全局的概念:
一个 Tomcat 就是一个 Server 而一个 Server 里可以有多个Service ,一个Service里可以有多个 Connector 和 一个 Container(Container是个全称,它内部包含 Engine、Host、Context、Wrapper)
请求过程大概分两块,一边是 Connector 连接器的范畴,一边是 Container 范畴,中间通过 CyoteAdapter 将连接起里的请求下发给右边容器执行。容器执行采用的是责任链的方式:Pipline 表示整个责任链、Value 是每个链上的节点。
接下来,就从连接器 Connector 到内部的协议处理器 ProtocolHandler 再到内部的连接点 Endpoint 再到 CyoteAdapter 将请求下发给 Container 来看一下,这里以 HTTP/1.1为例,都是采用图示哈,图上的注释应该比较清楚,就不做文字解释了哈。
3 连接器 Connector
3.1 实例化
3.2 初始化
3.3 启动
4 协议处理器 ProtocolHandler
4.1 初始化
4.2 启动
5 连接点 Endpoint
5.1 初始化
5.2 启动
5.3 Accpet 线程
5.4 Poller 线程
5.5 线程池执行过程
图有点大,截图截不全,只好导出哈。
6 CyoteAdapter 委派以及 Container 请求执行
7 小结
好啦,其实请求中的细节还有很多,包括超时处理,一些 Socket 关闭以及报错处理可能在图上没严格表示出来还请理解一下,细节太多了哈哈= =,本节主要是看一下请求的经过的一些核心组件核心类的处理最后落点到 DispatcherServlet 的一条链路,有理解不对的地方还请指正哈。