ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Tomcat原理整理

2021-03-23 12:30:40  阅读:218  来源: 互联网

标签:Engine 容器 请求 Tomcat Connector Host Context 整理 原理


目录接口

功能组件

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 提供必要的服务

Connector

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

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

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

请求处理时序图:

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 的装载、初始化、执行以及资源回收。

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

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

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

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

Tomcat请求整体处理:

假设客户端发送请求: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

标签:Engine,容器,请求,Tomcat,Connector,Host,Context,整理,原理
来源: https://blog.csdn.net/wqadxmm/article/details/115113037

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有