1. 首页 > 快讯

深入理解 Tomcat 架构模块

老铁们,大家好,相信还有很多朋友对于深入理解 Tomcat 架构模块和的相关问题不太懂,没关系,今天就由我来为大家分享分享深入理解 Tomcat 架构模块以及的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!

一、Tomcat顶层架构[[285675]]

首先我们看一下Tomcat的顶层整体结构图(图A),如下:

Tomcat中最顶层的容器是Server,它代表整个服务器。从上图可以看出,一个Server可以包含至少一个Service,用于提供特定的服务。

Service主要由两部分组成:Connector和Container。从上图可以看出,Tomcat的心脏就是这两个组件。它们的功能如下:

1、Connector用于处理连接相关的事务,提供Socket、Request、Response相关的转换;

2、Container用于封装和管理Servlet,具体处理Request请求;

Tomcat中只有一个Server,一个Server可以包含多个Service。一项服务只有一个容器,但可以有多个连接器。这是因为一个服务可以有多个连接,比如同时提供Http和Https链接。连接同一协议不同端口的示意图如下(Engine、Host、Context将在下面讨论):

多个连接器和一个容器形成一个服务。有了Service,就可以向外界提供服务,但Service也需要一个生存的环境。必须有人能够赋予它生命,掌控它的生死,而且必须是Server。是的!所以整个Tomcat的生命周期都是由Server来控制的。

另外,上面提到的包含关系或者父子关系可以在tomcat的conf目录下的server.xml配置文件中看到。下图是删除注释内容后的完整server.xml配置文件(Tomcat版本为8.0)

详细的配置文件内容可以查看Tomcat官网:http://tomcat.apache.org/tomcat-8.0-doc/index.html

上面的配置文件也可以通过下面的结构图来更清楚的理解:

Server标签设置的端口号为8005,shutdown="SHUTDOWN",表示在8005端口监听“SHUTDOWN”命令,收到后Tomcat将被关闭。一个Server有一个Service,当然是可以配置的。有多种服务。 Service左边的内容属于Container,Service下面是Connector。

二、Tomcat顶层架构小结:(1)Tomcat中只有一台Server,一台Server可以有多个Service,一个Service可以有多个Connector和1个Container;

(2)Server掌管着整个Tomcat的生死存亡;

(4)服务对外提供服务;

(5)Connector用于接受请求,并将请求封装成Request和Response进行具体处理;

(6)Container用于封装和管理Servlet,具体处理request请求;

知道了Tomcat 整个顶层分层架构以及各个组件的关系和作用,对于大多数开发者来说,Server 和Service 确实离我们很远,而我们开发中大部分的配置内容都属于Connector 和Container,所以接下来介绍Connector和Container。

三、Connector和Container的微妙关系从上面的内容我们可以大致知道,一个请求发送到Tomcat之后,首先经过Service,然后交给我们的Connector。 Connector用于接收请求,并将接收到的请求封装成Request和Response进行具体处理。请求和响应封装后交给Container处理。 Container处理完请求后,返回给Connector。最后Connector将处理结果通过Socket返回给客户端,这样整个请求就处理完毕了!

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

由于Tomcat处理请求,因此它必须首先接收请求。要接收请求,我们首先需要查看连接器!

四、Connector架构分析Connector用于接受请求并将请求封装成Request和Response,然后交给Container处理。 Container处理完后,交给Connector并返回给客户端。

因此,我们可以从四个方面来理解Connector:

(1)Connector如何接受请求?

(2)如何将请求封装成Request和Response?

(3)封装好的Request和Response是如何交给Container处理的?

(4)Container处理完毕后,如何交给Connector并返回给客户端?

首先看一下Connector结构图(图B),如下图:

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的抽象实现实现了两个内部类Acceptor和AsyncTimeout,以及AbstractEndpoint中定义的Handler接口。 Acceptor用于监听请求,AsyncTimeout用于检查异步Request的超时情况,Handler用于处理接收到的Socket,内部调用Processor进行处理。

至此,我们应该可以轻松回答问题(1)(2)(3)了,但是(4)我们还是不知道,所以我们来看看Container是如何处理的以及之后是如何处理的已处理。结果返回给Connector?

五、Container架构分析Container用于封装和管理Servlet,具体处理Request请求。 Connector 内部有4 个子容器。结构图如下(图C):

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

(1)Engine:引擎,用于管理多个站点。一个Service最多只能有一个Engine;

(2)主机:代表一个站点,也可以称为虚拟主机。可以通过配置Host来添加站点;

(3)Context:代表一个应用程序,对应通常开发的一组程序,或者是一个WEB-INF目录和下面的web.xml文件;

(4)Wrapper:每个Wrapper封装了一个Servlet;

我们找一个Tomcat文件目录来对比一下,如下图:

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

当我们访问应用Context时,如果是在ROOT下,我们可以直接使用域名来访问,例如:www.aistudy.com。如果是Host下的其他应用程序(webapps),我们可以使用www.aistudy.com/docs。当然,访问时默认指定根应用程序(ROOT)是可以设置的,但是Host站点下的默认主应用程序是在ROOT目录下的。

看到这里,我们知道了什么是Container,但是我们还是不知道Container是如何处理的,以及处理后的结果是如何返回给Connector的?不用担心!下面我们开始讨论Container是如何处理的!

六、Container如何处理请求的容器使用Pipeline-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的pipeline和Wrapper的pipeline最终执行到StandardWrapperValve。

(3)执行StandardWrapperValve时,StandardWrapperValve中会创建一个FilterChain,并调用其doFilter方法来处理请求。这个FilterChain包含了我们配置的与请求匹配的Filter和Servlet,它的doFilter方法会依次调用它们。 Filter的doFilter方法和Servlet的service方法,这样请求就被处理了!

(4) 当所有Pipeline-Valve执行完毕并处理完具体请求后,可以将返回结果交给Connector,Connector将结果通过Socket返回给客户端。

总结至此,我们对Tomcat的整体架构有了一个大概的了解。从图A、B、C、D中,我们可以看到各个组件的基本要素和功能。我们心里应该有一个大概的轮廓吧!如果面试时让你简单谈一下Tomcat,你能脱口而出上述内容吗?当你能脱口而出时,面试官一定会对你印象深刻。的!

好了,文章到此结束,希望可以帮助到大家。

用户评论

限量版女汉子

终于有详细讲讲解 Tomcat 架构篇的文章了!

    有13位网友表示赞同!

顶个蘑菇闯天下i

平时开发的时候,对 Tomcat 的理解比较浅,看这篇文章总算可以更深入地了解一下。

    有14位网友表示赞同!

旧事酒浓

Tomcat 搭建 web 服务器这么常用,但其实我很少去仔细研究它的内部架构。

    有7位网友表示赞同!

红尘烟雨

学习这方面知识还是很有帮助的,希望文章能解释得清晰易懂。

    有16位网友表示赞同!

苍白的笑〃

看来 Tomcat 的各个模块之间互相协作才能使整个服务器运行起来呢!

    有13位网友表示赞同!

夜晟洛

看了标题感觉很基础,但我还是要来学习一下,毕竟很多时候都不知道这些模块背后的原理。

    有20位网友表示赞同!

初阳

我最近正在项目中使用 Tomcat,希望能通过这篇文章来进一步提升我的开发水平。

    有10位网友表示赞同!

景忧丶枫涩帘淞幕雨

原来 Tomcat 不只是个简单的应用服务器,它还有这么复杂而强大的架构!

    有9位网友表示赞同!

念初

感谢作者分享这份宝贵资料,能够深入了解 Tomcat 的架构对我来说非常有意义。

    有16位网友表示赞同!

来瓶年的冰泉

平时用 Tomcat 基本都是按照教程来搭建的,很少去关心它们的具体原理。现在看来需要认真学习一下了!

    有7位网友表示赞同!

黑夜漫长

期待看到详细的架构图和代码讲解,这样能更直观地理解这些模块的功能。

    有6位网友表示赞同!

蹂躏少女

这篇文章很有帮助,可以让我更好地掌握 Tomcat 的基础知识。

    有19位网友表示赞同!

杰克

我正在学习 web 开发,Tomcat 是其中一个重要的知识点,希望能通过阅读这篇文章来快速入门。

    有16位网友表示赞同!

纯情小火鸡

学习 Tomcat 架构对我来说是提高开发水平的关键一步,期待作者能给出详细的讲解。

    有16位网友表示赞同!

太难

希望这篇博客能够涵盖 Tomcat 的常用和高级模块,让我能对它的所有功能有一个完整的认识。

    有16位网友表示赞同!

喜欢梅西

这篇文章肯定能解决我很多关于 Tomcat 架构的问题!

    有13位网友表示赞同!

此生一诺

平时使用 Tomcat 就用着,却很少深入了解其工作原理,看完这个标题立马勾起了我的学习兴趣!

    有18位网友表示赞同!

素婉纤尘

Tomcat 的架构知识点很重要,掌握了这些知识才能更好地维护和开发 web 应用。

    有13位网友表示赞同!

風景綫つ

期待看到这篇文章的详细内容!

    有13位网友表示赞同!

冷月花魂

这篇文章能让我对 Tomcat 有更深入的了解!

    有9位网友表示赞同!

本文采摘于网络,不代表本站立场,转载联系作者并注明出处:https://www.iotsj.com//kuaixun/7201.html

联系我们

在线咨询:点击这里给我发消息

微信号:666666