Tomcat请求处理一个请求的过程

Connector组件是Tomcat两个核心组件之一(另一个是Container),主要任务是负责接收客户端发过来的TCP连接请求,创建一个Request和Response对象用于和请求端交换数据。

Tomcat使用Apache Coyote库来处理网络I/O的。

Connector是通过适配器将自己“置入”这个框架中的,具体是org.apache.catalina.connector.CoyoteAdapter。Adapter位于Coyote框架处理请求的末端,解析和得到的org.apache.coyote.Request和org.apache.coyote.Response将会传入Adapter,该对象负责将http request解析成HttpServletRequest对象,之后绑定相应的容器,然后从engine开始逐层调用valve直至该servlet。

Connector负责创建Adapter(CoyoteAdapter)和ProtocolHandler,
ProtocolHandler负责根据具体的协议和I/O模型对请求数据进行接受,解析和处理,然后创建并委托Endpoint进行具体的处理。
Endpoint经过一层处理后将请求传入Processor,最终由Processor将请求传入Adapter进而进入容器。

Tomcat有四种不同的协议可供选择,类型包括BIO,AIO,NIO,APR,接口的具体实现是:

ProtocolHandler——>Http11NioProtocol;
Endpoint——>NioEndpoint;
Processor——Http11NioProcessor;


Request和Response对象的创建:

AbstractProcessor负责创建org.apache.coyote.Request和org.apache.coyote.Response;

CoyoteAdapter调用Connector.createRequset()和createResponse()创建org.apache.catalina.connector.Request和Response这就是实现了我们熟悉的HttpServletRequest和HttpServletResponse接口的贯穿整个容器,Filter&Servlet生命周期的两个对象了。


请求是如何传入容器的最终到达Servlet的:

Acceptor: 负责在一个后台线程中指定端口上接收客户端发送的请求,
SocketProcessor: 根据socket的状态进行第一层处理,另外SSL的握手也是由它负责.
Http11ConnectionHandler: SocketProcessor将会调用handler.process()将socket请求内容传入Processor.process().
AbstractHttp11Processor: AbstractHttp11Processor.process()调用CoyoAdapter.service(),
CoyoAdapter: 调用Service拥有的容器(也就是Engine)对应Pipeline的第一个Valve的invoke方法

这样Request和Response对象就进入容器。每个容器Pipeline上的最后一个Valve负责将Request和Response传入下一个容器(也就是每个容器的第一个Valve)。经过了Pipeline上所有的Valve,最后一个Valve也就是StandardWrapperValve,它的invoke方法将调用FilterChain.doFIlter(),将把设置好的Request和Response对象传入Filter链,这就进入我们熟悉的部分了,最终将被分派的正确的Servlet进行处理。

请求流程图如下:
这里写图片描述


请求流程简述:

  1. 接收到请求的serverSocket会被wrapper包装一下,之后放到线程池里面,由线程池分配一个线程来处理这个请求
  2. Http11Processor解析http的请求,生产并封装request和response对象
  3. 通过connector.getService()调用一系列的invoke(request,response)方法,传递request和response顺着Containter的Pipeline一直到StandardWrapperValve,在StandardWrapperValve中,创建FilterChain并执行,包括我们自己定义的,到我们的应用中,完成响应
//1.
protected class Acceptor extends AbstractEndpoint.Acceptor {
   
  @Override
  public void run() {
      // Loop until we receive a shutdown command
      while (running) {
      
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值