tomcat中Request的Dispatch

本篇是本系列第三篇,主要来介绍当一个Request来到,如何调用了被调度到Controller下
这个工作主要是tomcat做的

  • spring boot 总结
  • spring的Ioc
  • tomcat中Request的Dispatch <==

前言

本文主要是概念性的了解,暂不进行深入的探索。摘自:

tomcat的结构

整体结构

tomcat结构.jpeg

这张图在诸多的文章中被引用,就是server包含多组service,service主要由connector、container以及相关组件组成.

  • Server:指的就是整个 Tomcat 服务器,包含多组服务,负责管理和启动各个 Service,同时监听 8005 端口发过来的 shutdown 命令,用于关闭整个容器;
  • Service:Tomcat 封装的、对外提供完整的、基于组件的 web 服务, 包含 Connectors、Container 两个核心组件,以及多个功能组件,各个 Service 之间是独立的,但是共享同一 JVM 的资源;
  • Connector:Tomcat 与外部世界的连接器,监听固定端口接收外部请求,传递给 Container,并将 Container 处理的结果返回给外部;
  • Container:Catalina,Servlet 容器,内部有多层容器组成,用于管理 Servlet 生命周期,调用 servlet 相关方法;
  • Loader:封装了 Java ClassLoader,用于 Container 加载类文件; Realm:Tomcat 中为 web 应用程序提供访问认证和角色管理的机制;
  • JMX:Java SE 中定义技术规范,是一个为应用程序、设备、系统等植入管理功能的框架,通过 JMX 可以远程监控 Tomcat 的运行状态;
  • Jasper:Tomcat 的 Jsp 解析引擎,用于将 Jsp 转换成 Java 文件,并编译成 class 文件;
  • Session:负责管理和创建 session,以及 Session 的持久化(可自定义),支持 session 的集
    群;
  • Pipeline:在容器中充当管道的作用,管道中可以设置各种 valve(阀门),请求和响应在经由管 道中各个阀门处理,提供了一种灵活可配置的处理请求和响应的机制。

运行流程

流程.png

Connector负责生成请求对象和响应对象的,Tomcat默认的是HttpConnector,负责根据收到的Http请求报文生成Request对象和Response对象,并把这两个对象传递给Container,然后根据Response中的内容生成相应的HTTP报文。

再进一步看:
运行流程.jpeg

  1. 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得;
  2. Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应;
  3. Engine获得请求localhost:8080/test/index.jsp,匹配它所有虚拟主机Host;
  4. Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机);
  5. localhost Host获得请求/test/index.jsp,匹配它所拥有的所有Context;
  6. Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为""的Context去处理);
  7. path="/test"的Context获得请求/index.jsp,在它的mapping table中寻找对应的servlet;
  8. Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类;
  9. 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法;
  10. Context把执行完了之后的HttpServletResponse对象返回给Host;
  11. Host把HttpServletResponse对象返回给Engine;
  12. Engine把HttpServletResponse对象返回给Connector;
  13. Connector把HttpServletResponse对象返回给客户browser;

connector

其基本的过程如下:
connector-1.png
Connector的实现模式有三种,分别是BIO、NIO、APR。拉近来看看NIO形式

connector-2.jpeg
Acceptor线程负责接收连接,调用accept方法阻塞接收建立的连接,并对socket进行封装成PollerEvent,并放入到EventQueue队列中,PollerEvent的run方法逻辑的是将Selector注册到socket的指定事件;
Poller线程从EventQueue获取PollerEvent,并执行PollerEvent的run方法,调用Selector的select方法,如果有可读的Socket则创建Http11NioProcessor,放入到线程池中执行;
CoyoteAdapter是Connector到Container的适配器,Http11NioProcessor调用其提供的service方法,内部创建Request和Response对象,并调用最顶层容器的Pipeline中的第一个Valve的invoke方法;
Mapper主要处理http url 到servlet的映射规则的解析,对外提供map方法;

cantainer

cantainer结构如下

container.jpeg

Engine:Servlet 的顶层容器,包含一个或多个 Host 子容器;
Host:虚拟主机,负责 web 应用的部 署和 Context 的创建;
Context:Web应用上下文,每个Context代表一个应用,包含多个 Wrapper,负责 web 配置的解析、管理所有的 Web 资源;
Wrapper:最底层的容器,每个Wrapper封装一个Servlet,,负责 Servlet 实例的创建、执行和销毁。

生命周期

Tomcat 为了方便管理组件和容器的生命周期,定义了从创建(New)、初始化(Initializing)、启动(Starting)、到停止(Stopping)、销毁(Destroying)等共 12 中状态(包括pre、ing、ed),tomcat 生命周期管理了内部状态变化的规则控制,组件和容器只需实现相应的生命周期 方法即可完成各生命周期内的操作(initInternal、startInternal、stopInternal、 destroyInternal);

请求处理过程

请求处理过程.png

根据 server.xml 配置的指定的 connector 以及端口监听 http、或者 ajp 请求
请求到来时建立连接,解析请求参数,创建 Request 和 Response 对象,调用顶层容器 pipeline 的 invoke 方法
容器之间层层调用,最终调用业务 servlet 的 service 方法
Connector 将 response 流中的数据写到 socket 中

# spring 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×