【Tomcat9源码分析】请求过程概述
转载请注明出处:http://blog.****.net/linxdcn/article/details/73382570
1 前言
Tomcat的源码结构层次非常清晰,在阅读源码前有必要先了解Tomcat整个框架,然后再深入到各个组件的源码中。之前已经介绍了组件与框架概述和启动、停止与生命周期管理概述。
本篇是概述性文章的最后一篇,主要介绍一下Tomcat是怎么处理一次http请求,各组件在这一过程中都扮演了什么角色。之后的文章会深入分析各组件的源码。
2 Connector
在Tomcat9中,Connector
支持的协议是HTTP和AJP,协议处理类分别对应org.apache.coyote.http11.Http11NioProtocol
和org.apache.coyote.http11.Http11AprProtocol
(已经取消BIO模式)。
Connector
主要包含三个模块:Http11NioProtocol
, Mapper
, CoyoteAdapter
,http请求在Connector中的流程如下:
http请求在Connector中的流程
- Acceptor为监听线程,调用serverSocketAccept()阻塞,本质上调用ServerSocketChannel.accept()
- Acceptor将接收到的Socket添加到Poller池中的一个Poller
- Poller通过worker线程把socket包装成SocketProcessor
- SocketProcessor调用getHandler()获取对应的ConnectionHandler
- ConnectionHandler把socket交由Http11Processor处理,解析http的Header和Body
- Http11Processor调用service()把包装好的request和response传给CoyoteAdapter
- CoyoteAdapter会通过Mapper把请求对应的session、servlet等关联好,准备传给Container
3 Container
从之前的文章知道有4个Container,采用了责任链的设计模式,每一个Container定义了一个Pipeline,每一个Pipeline又定义了多个Valve,代表需要处理的任务。Pipeline就像是每个容器的逻辑总线,在Pipeline上按照配置的顺序,加载各个Valve。通过Pipeline完成各个Valve之间的调用,各个Valve实现具体的应用逻辑。
有了责任链设计模式的概念,http请求由Connector转发至Container,在Container中的流程就比较清晰了,如下:
http请求在Container中的流程
上一节中的Connector中的CoyoteAdapter会调用invoke()把request和response传给Container,Container中依次调用各个Valve,每个Valve的作用如下:
- StandardEngineValve:StandardEngine中的唯一阀门,主要用于从request中选择其host映射的Host容器StandardHost
- AccessLogValve:StandardHost中的第一个阀门,主要用于管道执行结束之后记录日志信息
- ErrorReportValve:StandardHost中紧跟AccessLogValve的阀门,主要用于管道执行结束后,从request对象中获取异常信息,并封装到response中以便将问题展现给访问者
- StandardHostValve:StandardHost中最后的阀门,主要用于从request中选择其context映射的Context容器StandardContext以及访问request中的Session以更新会话的最后访问时间
- StandardContextValve:StandardContext中的唯一阀门,主要作用是禁止任何对WEB-INF或META-INF目录下资源的重定向访问,对应用程序热部署功能的实现,从request中获得StandardWrapper
- StandardWrapperValve:StandardWrapper中的唯一阀门,主要作用包括调用StandardWrapper的loadServlet方法生成Servlet实例和调用ApplicationFilterFactory生成Filter链
最终将Response返回给Connector完成一次http的请求。
4 参考
http://tomcat.apache.org/tomcat-9.0-doc/architecture/requestProcess/request-process.png
http://blog.****.net/beliefer/article/details/51894747
转载请注明出处:http://blog.****.net/linxdcn/article/details/73382570