【Tomcat9源码分析】请求过程概述

转载请注明出处:http://blog.csdn.net/linxdcn/article/details/73382570


1 前言

Tomcat的源码结构层次非常清晰,在阅读源码前有必要先了解Tomcat整个框架,然后再深入到各个组件的源码中。之前已经介绍了组件与框架概述启动、停止与生命周期管理概述

本篇是概述性文章的最后一篇,主要介绍一下Tomcat是怎么处理一次http请求,各组件在这一过程中都扮演了什么角色。之后的文章会深入分析各组件的源码。


2 Connector

在Tomcat9中,Connector支持的协议是HTTP和AJP,协议处理类分别对应org.apache.coyote.http11.Http11NioProtocolorg.apache.coyote.http11.Http11AprProtocol(已经取消BIO模式)。

Connector主要包含三个模块:Http11NioProtocol, Mapper, CoyoteAdapter,http请求在Connector中的流程如下:



http请求在Connector中的流程

  1. Acceptor为监听线程,调用serverSocketAccept()阻塞,本质上调用ServerSocketChannel.accept()
  2. Acceptor将接收到的Socket添加到Poller池中的一个Poller
  3. Poller通过worker线程把socket包装成SocketProcessor
  4. SocketProcessor调用getHandler()获取对应的ConnectionHandler
  5. ConnectionHandler把socket交由Http11Processor处理,解析http的Header和Body
  6. Http11Processor调用service()把包装好的request和response传给CoyoteAdapter
  7. 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.csdn.net/beliefer/article/details/51894747


转载请注明出处:http://blog.csdn.net/linxdcn/article/details/73382570

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值