一次请求的来龙去脉 - Tomcat架构解析(二)

容器,简单理解就是用来装东西的工具。在Tomcat里面,容器被设计用来装载Servlet, 也就是我们平常写的普通的Servlet ,就会存放在容器里面。这也就是咱们平常念叨的Servlet容器,其实从广义上理解,Servlet容器是指Tomcat,从狭义上理解,Servlet容器,只是Tomcat里面的一个组件而已。

1. 容器概述

Tomcat采用分层结构设计了4种容器,这4种容器分别是: Engine 、Host 、Context 、Wrap 。它们钧继承 Container 容器接口。这样设计使得Tomcat在处理请求时,分工更加明确,也使得容器具有很好的灵活性。

一次请求的来龙去脉 - Tomcat架构解析(二)

其中从左到右: Engine 表示引擎,用来管理多个虚拟站点,一个Service最多只能有一个Engine。 Host代表虚拟主机,或者表示站点。其实就是我们配置出来的虚拟映射地址。Context表示一个Web应用,Wrap 名为包装,它其实就是内部包装着我们写的Servlet。

为了方便大家理解,我们可以从Tomcat里面的server.xml中看出来一些端倪。

一次请求的来龙去脉 - Tomcat架构解析(二)

这四个容器呈现的是一个父子包含关系:

一次请求的来龙去脉 - Tomcat架构解析(二)

2. 定位Servlet

在Tomcat里面使用Mapper 映射器来实现Servlet的定位工作。在最初启动项目的时候,Tomcat就开始解析了项目的配置信息,然后使用Mapper来保存了具体的映射地址和Host、Context、Wrap的对应关系。当请求到来的时候,就会到Mapper里面去查找匹配的Wrap(Servlet),然后调用。当我们为了方便理解,我们可以浅显的认为Mapper其实就是一个类似Map键值对的容器。

2.1 全局概览

比如: 下面的图示,我们可以把瑞吉点餐项目的面向管理员后台项目和面向用户前端项目部署在同一个Tomcat上,为了隔离它们,我们通过配置虚拟域名,也就是两个Host。而用户系统,订单系统,产品系统,购物车系统又都是可以独立运行的应用,所以我们可以配备4个Context来对应它们。最后一排的Wrap,其实就是各自系统中的Servlet了。

一次请求的来龙去脉 - Tomcat架构解析(二)

2.2 请求到来

此时用户使用 http://user.reggie.com:8080/cart/delete 来访问。

2.2.1 定位Service和Engine

由于来访的时候,使用的是8080端口,正好被Http连接器捕捉到。在Tomcat里面,Service里面包含着: 连接器和容器。找到了连接器,也就意味着找到了容器,这也就意味着Engine就确定了。

2.2.2 定位Host

Service和Engine确定了之后,就在Mapper中,通过路径地址,找到响应的Host容器。由于使用的是user.reggie.com 访问,所以这就确定了是Host2这个容器。

2.2.3 定位Context

Host确定了之后,继续在Mapper中查找。由于使用的/cart访问,所以这就定位到了Context4这个应用。

2.2.4 定位Wrap

Context确定了之后,后续也就能根据地址 /delete,轻而易举的找到 Wrap6 这个容器。最后也就定位到了Servlet。

2.3 请求传递

Tomcat 里面是如何把请求从最外层的容器Engine,一直往里传递到Wrap,然后执行Servlet的调用的呢?

答案是使用 Pipeline-Valve 管道。

Pipeline-Valve 是责任链模式,责任链模式是指在一个请求处理的过程中有很多处理者依次对请求进行处理,每个处理者负责做自己相应的处理,处理完之后将再调用下一个处理者继续处理。

下面通过一个张简单的草图来描述:

每一个容器都有一个Pipeline对象,中间的每一个圆圈,其实表示的是一个Valve,它表示处理点。在Pipeline里面维护这Valve的链表。只要执行了第一个Pipeline的Valve,这个容器中的Pipeline就会被调用,直到最后末端的Basic的Valve,它负责去连接下一个子容器的第一个Valve处理点。这样不断的串联起来,最终就到达了Servlet。

一次请求的来龙去脉 - Tomcat架构解析(二)

值得注意的是: 在Wrap的最后一个Basic的Valve的处理点里面,它会创建一个Filter过滤器链,然后在doFilter方法中最终调用Servlet的service方法。

3. 总结

本文主要给大家描述了Tomcat了里面的容器结构,以及请求到来的时候,是如何识别到底执行了哪个Servlet。请求的链式调用是基于 Pipeline-Valve 责任链来完成的,这样的设计使得系统具有良好的可扩展性,如果需要扩展容器本身的功能,只需要增加相应的 Valve 即可。

文章来源于:王晴儿网页设计博客 欢迎分享交流,转载请注明出处

本文来自投稿,不代表重蔚自留地立场,如若转载,请注明出处https://www.cwhello.com/262660.html

如有侵犯您的合法权益请发邮件951076433@qq.com联系删除

(0)
黑马程序员黑马程序员订阅用户
上一篇 2023年5月10日 11:55
下一篇 2023年5月10日 11:56

相关推荐

  • 我来分享网站定制开发的五个过程。

        网站定制开发很多人都听闻过,可是实践活动如何实际操作却少有些人了解。一个完好无损的网站定制开发应当包括了网站域名、空间、程序流程、內容这些。网站定制开发是综合型的,并不是说你看一下便会做的,是要…

    2023年6月16日
    00
  • 教你SEO优化过程新手需要防范哪些内容。

    对于杭州网站优化SEO推广服务公司,开始网站排名优化时没有经验,也没有实际操作。 因此,网站seo推广服务公司将首先遇到许多无法理解的问题,因此对优化的效果也不理想,那么如何在这种情况下防止网站SEO推广服务…

    2023年6月27日
    00
  • 小编分享死链对网站的影响、产生过程、解决办法汇总。

    大量死链对搜索引擎来讲,有什么影响? 1、几乎很多站都避免不了存在死链接,但死链率过高,会影响搜索引擎对网站的评分。 2、搜索引擎对每个网站每天抓取的频次是限额的,若网站存在大量死链,会浪费掉抓取配额并影…

    2023年6月22日
    00
  • 分享网页设计过程是什么。

    在日常的工作和生活中,我们经常使用到网站,无论是大型的购物网站,还是很好的社交媒体平台,亦或是厉害的游戏共享平台,但凡是做的比较好的平台,他们的受欢迎度都很好,因为他们都有一个共同的特点,那就是有一…

    2023年6月13日
    00
  • 小编分享听小编讲解搜索引擎工作过程。

    搜索引擎的工作的过程非常复杂,而简单的讲搜索引擎的工作过程大体可以分成三个阶段。 爬行和抓取:搜索引擎蜘蛛通过跟踪链接访问页面,获取页面HTML代码存入数据库。 预处理:搜索赢球对抓取来的页面数据文字进行…

    2023年6月22日
    00
  • 教你SEO为什么是一个业精于勤的过程。

    从事seo有没有制胜法宝,这是每一个小白所问到的共同问题,他们每天绞尽脑汁,想尽办法去找一个屡试不爽的方法,视乎总是希望投入少量的资源,获得长久的稳定。但事实上在搜索引擎优化的道路中,这是不现实的,毕竟…

    2023年6月22日
    02
  • 分享SEO优化过程应当避免的哪些误区。

    1、链接不在质 不管是外链还是内链,在保证质量的情况下,数量是越多越好,这样花费出去的时间和收入才是正比,对于网站的关键词才能够起到提升的作用;但是一些新手seo优化却是把核心定在了量上面,通过软件进行大…

    2023年6月8日
    00
  • 我来分享服务器状态码查询。

    服务器状态码查询是通过向服务器发送请求并查看返回的状态码,以判断请求是否成功或失败。 服务器常见的状态码有以下几种: 1、信息性状态码(1xx) 状态码 描述 100 Continue 请求者应当继续提出请求,这个代码是…

    2024年6月27日
    00

联系我们

QQ:951076433

在线咨询:点击这里给我发消息邮件:951076433@qq.com工作时间:周一至周五,9:30-18:30,节假日休息