Tomcat原理整理

目录接口

Tomcat原理整理_第1张图片

功能组件

Tomcat原理整理_第2张图片

Tomcat 的核心功能有两个,分别是负责接收和反馈外部请求的连接器 Connector,和负责处理请求的容器 Container。其中连接器和容器相辅相成,多个 Connector 和一个 Container 一起构成了基本的 web 服务 Service。每个 Server可以管理多个 Service,整个 Tomcat 的生命周期由 Server 控制。

Connector:负责对外接收反馈请求。是tomcat与外界的交通枢纽,监听端口接收外界请求,并将请求处理后传递给容器做业务处理。最后将容器处理后的结果反馈给外界。

Container:负责对内处理业务逻辑。内部由Engine、Host、Context、Wrapper四个容器组成,用于管理和调用Servlet相关逻辑。

Service:对外提供的Web服务。主要包含连接器和容器两个核心组件,以及其他功能组件,Tomcat可以管理多个Service,且各Service之间相互独立。

Tomcat 还有其它重要的组件,如安全组件 security、logger 日志组件、session、mbeans、naming 等其它组件。这些组件共同为 Connector 和 Container 提供必要的服务

Tomcat原理整理_第3张图片

Connector

1,监听网络端口,接收和响应网络请求

Connector 最重要的功能就是接收连接请求然后分配线程让 Container 来处理这个请求

2,将收到的请求(网络字节流)转换成Request 和Response,分配线程来处理,同时将Request 和 Response 传给线程,处理这个请求的线程是在 Container 容器中(Container 将请求转换为ServletRequest ,ServletResponse)完成处理。

Tomcat原理整理_第4张图片

请求处理时序图:

Tomcat原理整理_第5张图片

Container

每个 Service 会包含一个容器。容器由一个引擎可以管理多个虚拟主机。每个虚拟主机可以管理多个 Web 应用。每个 Web 应用会有多个 Servlet 包装器。Engine、Host、Context 和 Wrapper,四个容器之间属于父子关系。

通常一个 Servlet class 对应一个 Wrapper。

Engine:引擎,管理多个虚拟主机,子容器是Host。

Host:虚拟主机,负责Web应用的部署。Host 是 Engine 的字容器,一个 Host 在 Engine 中代表一个虚拟主机,这个虚拟主机的作用就是运行多个应用,它负责安装和展开这些应用,并且标识这个应用以便能够区分它们。它的子容器通常是 Context,它除了关联子容器外,还有就是保存一个主机应该有的信息。

Context:Web应用,包含多个Servlet封装器。Context 最重要的功能就是管理它里面的 Servlet 实例,Servlet 实例在 Context 中是以 Wrapper 出现的,还有一点就是 Context 如何才能找到正确的 Servlet 来执行它呢? Tomcat5 以前是通过一个 Mapper 类来管理的,Tomcat5 以后这个功能被移到了 request 中,在前面的时序图中就可以发现获取子容器都是通过 request 来分配的。

Wrapper:封装器,容器的最底层,没有子容器,Wrapper 代表一个 Servlet,它负责管理一个 Servlet,包括的 Servlet 的装载、初始化、执行以及资源回收。

Tomcat原理整理_第6张图片

容器的请求处理过程就是在 Engine、Host、Context 和 Wrapper 这四个容器之间层层调用,最后在 Servlet 中执行对应的业务逻辑。各容器都会有一个通道 Pipeline,每个通道上都会有一个 Basic Valve(如StandardEngineValve), 类似一个闸门用来处理 Request 和 Response 。其流程图如下。

Tomcat原理整理_第7张图片

Engine 和 Host 处理请求的时序图:

Tomcat原理整理_第8张图片

Context 和 wrapper 的处理请求时序图:

Tomcat原理整理_第9张图片

从 Tomcat5 开始,子容器的路由放在了 request 中,request 中保存了当前请求正在处理的 Host、Context 和 wrapper。

Tomcat请求整体处理:

Tomcat原理整理_第10张图片

假设客户端发送请求:http://mp.csdn.net/postedit/hello.jsp

请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得

1)Connector的主要任务是负责接收浏览器的发过来的 tcp 连接请求,创建一个 Request 和 Response 对象分别用于和请求端交换数据,然后会产生一个线程来处理这个请求并把产生的 Request 和 Response 对象传给处理这个请求的线程
2) Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应
3) Engine获得请求mp.csdn.net/postedit/hello.jsp,匹配它所拥有的所有虚拟主机Host
4) Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机)
5) localhost Host获得请求/postedit/hello.jsp,匹配它所拥有的所有Context
6) Host匹配到路径为/hello.jsp的Context(如果匹配不到就把该请求交给路径名为”"的Context去处理)
7) path=”/postedit”的Context获得请求/postedit/hello.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

你可能感兴趣的:(tomcat,servlet)