Tomcat架构设计图形化梳理
一、概述
概述
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器
核心功能
Tomcat 实现 2 个核心功能:
- 处理 Socket 连接,负责网络字节流与 Request 和 Response 对象的转化。(连接器(Connector))
- 加载和管理 Servlet,以及具体处理 Request 请求。(容器(Container))
因此 Tomcat 设计了两个核心组件连接器(Connector)和容器(Container)来分别做这两件事情。连接器负责对外交流,容器负责内部处理。
二、Tomcat目录结构
2.1、一级目录详解
1 | - Tomcat |
2.2、二级目录详解
2.2.1、bin
主要用于Tomcat的启停
1 | - bin |
2.2.2、conf
主要用于修改Tomcat的配置文件,比如修改server.xml中默认端口号等
1 | - conf |
2.2.3、webapps
编写程序的目录
1 | - webapps: Tomcat服务器的web目录 |
三、Tomcat架构及流程梳理
3.1、Tomcat宏观架构
Tomcat主要由两大功能组成:Connector处理请求、Servletr容器Container
【TCP&Socket】:服务器之间通过TCP进行通信,TCP是不能随意调的,提供了Socket接口用于调用
【Tomcat】:Web 应用服务器
【Server】:代表着整个服务器,整个 Tomcat 的生命周期由 Server 控制
【Service】:主要包含两个部分(Connector和Container),用于对外提供服务
【Connector】:用于处理连接,将Socketz字节流转化为Container可以识别的ServletRequest
- 【ProtocolHandler】:Connector使用ProtocolHandler来处理请求
- 【Endpoint】:用来实现TCP/IP协议,处理底层Socket的网络连接
- 【Acceptor】:监听请求
- 【Handler】:处理接收到的Socket,在内部调用Processor进行处理
- 【AsyncTimeout】:检查异步Request的超时
- 【Processor】:实现HTTP协议,将Endpoint接收到的Socket封装成Request和Response(org.apache.coyote.Request)
- 【Adapter】:将Request转化为Container容器可以识别的ServletRequest、ServletResponse,,并交给Container
- 【Endpoint】:用来实现TCP/IP协议,处理底层Socket的网络连接
- 【ProtocolHandler】:Connector使用ProtocolHandler来处理请求
【Container】:用于封装和管理Servlet,以及具体处理Request请求(Servlet容器)
【Engine】:引擎,用来管理多个站点,一个Service最多只能有一个Engine
在server.xml中配置
- 【Host】:代表一个站点,也可以叫虚拟主机,通过配置Host就可以添加站点(webapps)
在server.xml中配置
- 【Context】:代表一个应用程序,对应着平时开发的一套程序,或者一个WEB-INF目录以及下面的web.xml文件(webapps子目录)
在server.xml中配置
- 【Wrapper】:每一Wrapper封装着一个Servlet(Servlet类),调用servlet的service()方法。
在web.xml中配置
- 【Host】:代表一个站点,也可以叫虚拟主机,通过配置Host就可以添加站点(webapps)
3.2、细节详解
3.2.1、Connector
整体架构
用于处理连接(
Socket字节流与ServletRequest类和ServletResponse类相关的转化
)处理连接流程
Connector配置(Tomcat调优)
org.apache.catalina.connector.Connector
是 “Tomcat” 的核心组件,负责协议的解析(由它持有的ProtocolHandler
处理)以及相关处理等,并定义了运行中需要的相关配置项,包括支持协议,端口,以及解析相关参数等,可在conf/server.xml文件中对Connector进行配置
Tomcat处理HTTP请求 详解Connector模块-张华
注:对调优还没深入学习和实践,暂不做记录
3.2.2、Container
用于封装和管理Servlet,以及具体处理Request请求(Servlet容器)
责任链模式
责任链模式是指在一个请求处理的过程中有很多处理者依次对请求进行处理,每个处理者负责做自己相应的处理,处理完之后将处理后的结果返回,再让下一个处理者继续处理。
整体架构
Container处理请求是使用Pipeline-Valve管道来处理的!(Valve是阀门之意)
Pipeline-Valve使用的责任链模式和普通的责任链模式有些不同!区别主要有以下两点:
- 每个Pipeline都有特定的Valve,而且是在管道的最后一个执行,这个Valve叫做BaseValve,BaseValve是不可删除的;
- 在上层容器的管道的BaseValve中会调用下层容器的管道。
3.2.3、Servlet生命周期
3.3、Tomcat运行流程
假设来自客户的请求为:https://baidu.com
【browser--->Connector】
1、监听8080(port=”8080” protocol=”HTTP/1.1”)获得请求
2、将Socket转化为Request和Response再转化为容器能识别的ServletRespoinse和ServletRequest
【Connector--->Container】
3、Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应
【Container】
4、Engine匹配到14.215.177.39的Host
5、Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为””的Context去处理)
6、Context匹配路径下的index.jsp,并匹配jsp中对应的servlet
7、ServletRespoinse和ServletRequest作为参数调用Servlet的Service方法构造HttpServletRequest对象和HttpServletResponse对象,并作为参数调用对应servlet的doGet或doPost方法
8、Context把执行完了之后的HttpServletResponse对象返回给Host
9、Host把HttpServletResponse对象返回给Engine
【Container--->Connector】
10、Engine把HttpServletResponse对象返回给Connector
【Connector--->browser】
11、Connector把HttpServletResponse对象返回给客户browser