Tomcat--请求处理流程

Tomcat请求处理流程

请求流程

Tomcat使用Mapper组件来确定每一个请求该由哪个Wrapper容器里的Servlet来处理。

Mapper组件的功能就是将用户请求的URL定位到一个servlet,它的工作原理是:Mapper组件里面保存了Web应用配置信息,其实就是容器组件与访问路径的映射关系,比如Host容器里配置的域名、Context容器里的Web应用路径,以及Wrapper容器里的Servlet映射路径,可以想象这些配置信息就是一个多层次的Map。

当一个请求到来时,Mapper组件通过解析请求URL里的域名和路径,再到自己保存的Map里面去查找,就能定位到一个Servlet。注意:一个请求URL最后只会定位到一个Wrapper容器,也就是一个Servlet。

下面的示意图,就描述了当用户请求链接http://www.itcast.cn/bbs/findAll之后,是如何找到最终业务处理逻辑的Servlet。
在这里插入图片描述

上面这副图只是描述了根据请求URL如何查找到需要执行的Servlet,下面从Tomcat设计架构层面来分析Tomcat的请求处理:

在这里插入图片描述

步骤如下:

  1. Connector组件Endpoint中的Acceptor监听客户端套接字连接并接收Socket;
  2. 将连接交给线程池Executor处理,开始执行请求响应任务;
  3. Processor组件读取消息报文,解析请求行、请求体、请求头,封装成Reauest对象;
  4. Mapper组件根据请求行的URL值和请求头的Host值匹配由哪个Host容器、Context容器、Wrapper容器处理请求;
  5. CoyoteAdapter组件负责将Connector组件和Engine容器关联起来,把生成的Request对象和响应对象Response传递到Engine容器中,调用Pipeline;
  6. Engine容器的管道开始处理,管道中包含若干个Valve、每个Valve负责部分处理逻辑。执行完Valve后会执行基础的Valve–StandardEngineValue,负责调用Host容器的Pipeline;
  7. Host容器的管道开始处理,流程类似,最后执行Context容器的Pipeline;
  8. Context容器的管道开始处理,流程类似,最后执行Wrapper容器的Pipeline;
  9. Wrapper容器的管道开始处理,流程类似,最后执行Context容器对应的Servlet对象的处理方法;

在这里插入图片描述

在Tomcat中,每个Container组件采用责任链模式来完成具体的请求处理。

在Tomcat中定义了Pipeline和Valve两个接口,Pipeline用于构建责任链,后者代表责任链上的每个处理器。Pipeline中维护了一个基础的Valve,它始终位于Pipeline的末端(最后执行),封装了具体的请求处理和输出响应的过程。当然,我们也可以调用addValve()来Pipeline添加其它Valve,后添加的Valve位于基础的Valve之前,并按照添加顺序执行。Pipeline通过获得首个Valve来启动整个链条的执行。

发布了892 篇原创文章 · 获赞 2314 · 访问量 31万+

猜你喜欢

转载自blog.csdn.net/cold___play/article/details/105128366