Tomcat原理

article/2025/9/14 2:43:10

Tomcat顶层架构

Tomcat的顶层结构图:

1、Tomcat中最顶层的容器是Server,代表着整个服务器,一个Server可以包含至少一个Service,用于具体提供服务。

2、Service主要包含两个部分:Connector和Container。 Tomcat 的心脏就是这两个组件,这两个组件的作用:Connector用于处理连接相关的事情,并提供Socket与Request和Response相关的转化;Container用于封装和管理Servlet,以及具体处理Request请求。

3、一个Tomcat中只有一个Server,一个Server可以包含多个Service,一个Service只有一个Container,但是可以有多个Connectors,因为一个服务可以有多个连接,如同时提供Http和Https链接,也可以提供向相同协议不同端口的连接。

4、多个 Connector 和一个 Container 就形成了一个 Service,有了 Service 就可以对外提供服务了,但是 Service 还要一个生存的环境,必须要有人能够给她生命、掌握其生死大权,那就非 Server 莫属了!所以整个 Tomcat 的生命周期由 Server 控制。另外,上述的包含关系或者说是父子关系,都可以在tomcat的conf目录下的server.xml配置文件中看出。

5、Server标签设置的端口号为8005,shutdown=”SHUTDOWN” ,表示在8005端口监听“SHUTDOWN”命令,如果接收到了就会关闭Tomcat。一个Server有一个Service,当然还可以进行配置,一个Service有多个,Service左边的内容都属于Container的,Service下边是Connector。

Server处理HTTP请求

原理图

1.用户在浏览器中输入该网址,请求被发送到本机端口8080,被在那里监听的Coyote HTTP/1.1 Connector获得;

2.Connector把该请求交给它所在的Service的Engine(Container)来处理,并等待Engine的回应;

3.Engine获得请求localhost/test/index.jsp,匹配所有的虚拟主机Host;

4.Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机),名为localhost的Host获得请求/test/index.jsp,匹配它所拥有的所有Context。Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为“ ”的Context去处理);

5.path=“/test”的Context获得请求/index.jsp,在它的mapping table中寻找出对应的Servlet。Context匹配到URL Pattern为*.jsp的Servlet,对应于JspServlet类;

6.构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet()或doPost(),执行业务逻辑、数据存储等;

7.Context把执行完之后的HttpServletResponse对象返回给Host;

8.Host把HttpServletResponse对象返回给Engine;

9.Engine把HttpServletResponse对象返回Connector;

10.Connector把HttpServletResponse对象返回给客户Browser。

Connector架构分析

Connector用于接受请求并将请求封装成Request和Response,然后交给Container进行处理,Container处理完之后在交给Connector返回给客户端。Connector的结构图:

Connector就是使用ProtocolHandler来处理请求的,不同的ProtocolHandler代表不同的连接类型,比如:Http11Protocol使用的是普通Socket来连接的,Http11NioProtocol使用的是NioSocket来连接的。其中ProtocolHandler由包含了三个部件:Endpoint、Processor、Adapter:

(1)Endpoint用来处理底层Socket的网络连接,Processor用于将Endpoint接收到的Socket封装成Request,Adapter用于将Request交给Container进行具体的处理。

(2)Endpoint由于是处理底层的Socket网络连接,因此Endpoint是用来实现TCP/IP协议的,而Processor用来实现HTTP协议的,Adapter将请求适配到Servlet容器进行具体的处理。

(3)Endpoint的抽象实现AbstractEndpoint里面定义的Acceptor和AsyncTimeout两个内部类和一个Handler接口。Acceptor用于监听请求,AsyncTimeout用于检查异步Request的超时,Handler用于处理接收到的Socket,在内部调用Processor进行处理。

Container架构分析

Container用于封装和管理Servlet,以及具体处理Request请求,在Connector内部包含了4个子容器,结构图如下(图C):

 

4个子容器的作用分别是:

(1)Engine:引擎,用来管理多个站点,一个Service最多只能有一个Engine;
(2)Host:代表一个站点,也可以叫虚拟主机,通过配置Host就可以添加站点;
(3)Context:代表一个应用程序,对应着平时开发的一套程序,或者一个WEB-INF目录以及下面的web.xml文件;
(4)Wrapper:每一Wrapper封装着一个Servlet;

下面找一个Tomcat的文件目录对照一下,如下图所示:

Context和Host的区别是Context表示一个应用,我们的Tomcat中默认的配置下webapps下的每一个文件夹目录都是一个Context,其中ROOT目录中存放着主应用,其他目录存放着子应用,而整个webapps就是一个Host站点。

我们访问应用Context的时候,如果是ROOT下的则直接使用域名就可以访问,例如:www.hern.com,如果是Host(webapps)下的其他应用,则可以使用http://www.hern.com/docs进行访问,当然默认指定的根应用(ROOT)是可以进行设定的,只不过Host站点下默认的主营用是ROOT目录下的。

Container处理请求

 Container处理请求是使用Pipeline-Valve管道来处理的!(Valve是阀门之意)Pipeline-Valve是责任链模式,责任链模式是指在一个请求处理的过程中有很多处理者依次对请求进行处理,每个处理者负责做自己相应的处理,处理完之后将处理后的请求返回,再让下一个处理着继续处理。但是Pipeline-Valve使用的责任链模式和普通的责任链模式有些不同,区别主要有以下两点:

(1)每个Pipeline都有特定的Valve,而且是在管道的最后一个执行,这个Valve叫做BaseValve,BaseValve是不可删除的;

(2)在上层容器的管道的BaseValve中会调用下层容器的管道。

Container包含四个子容器,而这四个子容器对应的BaseValve分别在:StandardEngineValve、StandardHostValve、StandardContextValve、StandardWrapperValve。

Pipeline的处理流程图如下(图D):

(1)Connector在接收到请求后会首先调用最顶层容器的Pipeline来处理,这里的最顶层容器的Pipeline就是EnginePipeline(Engine的管道);

(2)在Engine的管道中依次会执行EngineValve1、EngineValve2等等,最后会执行StandardEngineValve,在StandardEngineValve中会调用Host管道,然后再依次执行Host的HostValve1、HostValve2等,最后在执行StandardHostValve,然后再依次调用Context的管道和Wrapper的管道,最后执行到StandardWrapperValve。

(3)当执行到StandardWrapperValve的时候,会在StandardWrapperValve中创建FilterChain,并调用其doFilter方法来处理请求,这个FilterChain包含着我们配置的与请求相匹配的Filter和Servlet,其doFilter方法会依次调用所有的Filter的doFilter方法和Servlet的service方法,这样请求就得到了处理!

(4)当所有的Pipeline-Valve都执行完之后,并且处理完了具体的请求,这个时候就可以将返回的结果交给Connector了,Connector在通过Socket的方式将结果返回给客户端。

Connector和Container的微妙关系

当一个请求发送到Tomcat之后,首先经过Service然后会交给Connector,Connector用于接收请求并将接收的请求封装为Request和Response来具体处理,Request和Response封装完之后再交由Container进行处理,Container处理完请求之后再返回给Connector,最后在由Connector通过Socket将处理的结果返回给客户端,这样整个请求的就处理完了!

Connector最底层使用的是Socket来进行连接的,Request和Response是按照HTTP协议来封装的,所以Connector同时需要实现TCP/IP协议和HTTP协议!

Tomcat顶层架构小结

(1)Tomcat中只有一个Server,一个Server可以有多个Service,一个Service可以有多个Connector和一个Container;
(2) Server掌管着整个Tomcat的生死大权;
(4)Service 是对外提供服务的;
(5)Connector用于接受请求并将请求封装成Request和Response来具体处理;
(6)Container用于封装和管理Servlet,以及具体处理request请求;


http://chatgpt.dhexx.cn/article/bBq7WBmp.shtml

相关文章

javascript 文本框限制输入1到10位数字正则表达式

<meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> <!DOCTYPE html> <html> <head><title>DOM 教程</title><style></style><!--不需要再次引用jquery--><script type"te…

js数字正则

js正则表达式 1.了解什么是正则表达式&#xff1f; 正则表达式&#xff08;Regular Expression&#xff09;又称规则表达式&#xff0c;简单来说它就是一个概念&#xff0c;用事先声明好的字符和字符的组合&#xff0c;来组成一个“规则字符串”&#xff0c;用来检测我们书写…

卷积神经网络降维方法,深度神经网络降维方法

1、卷积神经网络中用1*1 卷积有什么作用或者好处 1*1卷积的主要作用有以下几点&#xff1a; 1、降维&#xff08; dimension reductionality &#xff09;。比如&#xff0c;一张500 * 500且厚度depth为100 的图片在20个filter上做1*1的卷积&#xff0c;那么结果的大小为500*5…

常用降维方法

降维方法分为线性核非线性降维&#xff0c;非线性降维又分为基于核函数和基于特征值的方法。 线性降维方法&#xff1a;PCA ICA LDA LFA LPP(LE的线性表示) 基于核函数的非线性降维方法&#xff1a;KPCA KICA KDA 基于特征值的非线性降维方法&#xff08;流型学习&#x…

机器学习四大数据降维方法详解

引言&#xff1a; 机器学习领域中所谓的降维就是指采用某种映射方法&#xff0c;将原高维空间中的数据点映射到低维度的空间中。降维的本质是学习一个映射函数 f : x->y&#xff0c;其中x是原始数据点的表达&#xff0c;目前最多使用向量表达形式。 y是数据点映射后的低维向…

机器学习 | 降维问题

目录 一、主成分分析 二、奇异值分解 2.1 奇异值分解原理 2.2 奇异值分解实践 三、特征值与特征向量 一、主成分分析 主成分有如下特征&#xff1a; 每个主成分是原变量的线性组合&#xff1b;各个主成分之间互不相关&#xff1b;主成分按照方差贡献率从大到小依次排列&…

数据降维方法总结

Introduce 经过这几天面试后&#xff0c;我发现数据降维这一块在工业界用的很多或者说必不可少&#xff0c;因此&#xff0c;这方面需要重点关注。今天&#xff0c;我将数据降维总结于此&#xff0c;包括他人成果&#xff0c;这里对他们的内容表示感谢。 Method 对数据降维作…

机器学习四大降维方法

引言&#xff1a; 机器学习领域中所谓的降维就是指采用某种映射方法&#xff0c;将原高维空间中的数据点映射到低维度的空间中。降维的本质是学习一个映射函数 f : x->y&#xff0c;其中x是原始数据点的表达&#xff0c;目前最多使用向量表达形式。 y是数据点映射后的低维向…

机器学习降维方法概括

最近刷题看到特征降维相关试题&#xff0c;发现自己了解的真是太少啦&#xff0c;只知道最简单的降维方法&#xff0c;这里列出了常见的降维方法&#xff0c;有些算法并没有详细推导。特征降维方法包括&#xff1a;Lasso&#xff0c;PCA&#xff0c;小波分析&#xff0c;LDA&am…

详解机器学习高维数据降维方法

当特征选择完成后&#xff0c;可以直接训练模型了&#xff0c;但是可能由于特征矩阵过大&#xff0c;导致计算量大&#xff0c;训练时间长的问题&#xff0c;因此降低维度也是必不可少的。 常见的降维方法除了以上提到的基于 L1 惩罚项的模型以外&#xff0c;另外还有主成分分…

机器学习之降维

本周关于降维的学习主要分为五类&#xff1a;PCA、LDA、LLE、tSNE、ISOMAP 来进行学习 首先自己的任务是&#xff1a;tSNE的学习 &#xff08;一&#xff09;降维的基本知识点总结 1、降维方法分为线性和非线性降维&#xff0c;非线性降维又分为基于核函数和基于特征值的方…

四大机器学习降维方法

引言&#xff1a; 机器学习领域中所谓的降维就是指采用某种映射方法&#xff0c;将原高维空间中的数据点映射到低维度的空间中。降维的本质是学习一个映射函数 f : x->y&#xff0c;其中x是原始数据点的表达&#xff0c;目前最多使用向量表达形式。 y是数据点映射后的低维向…

降维方法总结

目录 数据降维方法: 降维&#xff1a; 降维的用处&#xff1a; 降维方法思想分类&#xff1a; 降维方法总览 降维方法详细说明 1. 缺失值比率&#xff08;Missing Value Ratio&#xff09; 2. 低方差滤波&#xff08;Low Variance Filter&#xff09; 3. 高相关…

数据分析七种降维方法

近来由于数据记录和属性规模的急剧增长&#xff0c;大数据处理平台和并行数据分析算法也随之出现。于此同时&#xff0c;这也推动了数据降维处理的应用。实际上&#xff0c;数据量有时过犹不及。有时在数据分析应用中大量的数据反而会产生更坏的性能。 最新的一个例子是采用 20…

12种降维方法及python实现

你遇到过特征超过1000个的数据集吗&#xff1f;超过5万个的呢&#xff1f;我遇到过。降维是一个非常具有挑战性的任务&#xff0c;尤其是当你不知道该从哪里开始的时候。拥有这么多变量既是一个恩惠——数据量越大&#xff0c;分析结果越可信&#xff1b;也是一种诅咒——你真的…

特征降维方法

关于降维的学习主要分为五类&#xff1a;PCA、LDA、LLE、tSNE、ISOMAP &#xff08;一&#xff09;降维的基本知识点总结 1、降维方法分为线性和非线性降维&#xff0c;非线性降维又分为基于核函数和基于特征值的方法。 &#xff08;1&#xff09;线性降维&#xff1a;PCA、…

四大降维方法

PCA和LDA之间的区别 从主观的理解上&#xff0c;主成分分析到底是什么&#xff1f;它其实是对数据在高维空间下的一个投影转换&#xff0c;通过一定的投影规则将原来从一个角度看到的多个维度映射成较少的维度。到底什么是映射&#xff0c;下面的图就可以很好地解释这个问题—…

数据降维方法小结

数据的形式是多种多样的&#xff0c;维度也是各不相同的&#xff0c;当实际问题中遇到很高的维度时&#xff0c;如何给他降到较低的维度上&#xff1f;前文提到进行属性选择&#xff0c;当然这是一种很好的方法&#xff0c;这里另外提供一种从高维特征空间向低纬特征空间映射的…

12种降维方法终极指南

来源&#xff1a;Analytics Vidhya 编译&#xff1a;Bot 授权自 论智 你遇到过特征超过1000个的数据集吗&#xff1f;超过5万个的呢&#xff1f;我遇到过。降维是一个非常具有挑战性的任务&#xff0c;尤其是当你不知道该从哪里开始的时候。拥有这么多变量既是一个恩惠——数据…

12种降维方法终极指南(含Python代码)

12种降维方法终极指南&#xff08;含Python代码&#xff09; 你遇到过特征超过1000个的数据集吗&#xff1f;超过5万个的呢&#xff1f;我遇到过。降维是一个非常具有挑战性的任务&#xff0c;尤其是当你不知道该从哪里开始的时候。拥有这么多变量既是一个恩惠——数据量越大&…