Tomcat 请求处理流程
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
目录
一请求流程
设计了这么多层次的容器
Tomcat
是怎么确定每一个请求应该由哪个
Wrapper
容器里Servlet来处理的呢答案是
Tomcat
是用
Mapper
组件来完成这个任务的。
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
组件读取消息报文解析请求行、请求体、请求头封装成
Request
对象。
4) Mapper
组件根据请求行的
URL
值和请求头的
Host
值匹配由哪个
Host
容器、
Context
容器、Wrapper
容器处理请求。
5) CoyoteAdaptor
组件负责将
Connector
组件和
Engine
容器关联起来把生成的Request对象和响应对象
Response
传递到
Engine
容器中调用
Pipeline
。
6) Engine
容器的管道开始处理管道中包含若干个
Valve
、每个
Valve
负责部分处理逻辑。执行完Valve
后会执行基础的
Valve--StandardEngineValve
负责调用
Host
容器的Pipeline。
7) Host
容器的管道开始处理流程类似最后执行
Context
容器的
Pipeline
。
8) Context
容器的管道开始处理流程类似最后执行
Wrapper
容器的
Pipeline
。
9) Wrapper
容器的管道开始处理流程类似最后执行
Wrapper
容器对应的
Servlet
对象的处理方法。
二请求流程源码解析
在前面所讲解的
Tomcat
的整体架构中我们发现
Tomcat
中的各个组件各司其职组件之间松耦合确保了整体架构的可伸缩性和可拓展性那么在组件内部如何增强组件的灵活性和拓展性呢 在Tomcat
中每个
Container
组件采用责任链模式来完成具体的请求处理。
在
Tomcat
中定义了
Pipeline
和
Valve
两个接口
Pipeline
用于构建责任链 后者代表责
任链上的每个处理器。
Pipeline
中维护了一个基础的
Valve
它始终位于
Pipeline
的末端最后执行封装了具体的请求处理和输出响应的过程。当然我们也可以调用 addValve()方法 为Pipeline
添加其他的
Valve
后添加的
Valve
位于基础的
Valve
之前并按照添加顺序执行。Pipiline
通过获得首个
Valve
来启动整合链条的执行 。