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

news2024/10/5 17:25:49

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

      1.容器概述
 

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

  

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

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

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

  2. 定位Servlet
 

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

  2.1 全局概览
 

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

  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。

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

  3. 总结
 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/23231.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JSON.stringify() 、JSON. parse()方法详解

JSON.stringify() 用法:JSON.stringify(value, [replacer], [space]) 第一个参数: value: 必选,将要序列后成 JSON 字符串的值。 第二个参数: replacer: 可选 如果是一个函数,则在序列化过程中,属性进行转…

机器学习之K-Means聚类(python手写实现+使用Silhouette Coefficient来选取最优k值)

文章目录K-MeansSilhouette Coefficient(轮廓系数)代码实现参考K-Means K-Means聚类又叫K均值聚类,是一种线性时间复杂度的聚类方法,也是比较成熟的一种聚类算法。 具体计算步骤如上。 Silhouette Coefficient(轮廓…

以前编写好能够正常运行的 SAP UI5 代码,几个月后忽然不能运行了该怎么办?

以笔者本套教材为例,每一步骤的源代码都托管在本人 Github 仓库里,每次上传之前,都确保本地测试通过。 但笔者编写过程中发现,之前测试通过的代码,可能几个月之后再执行,就会遇到白屏现象,即应…

ffplay数据读取线程

从这张图开始,主要介绍ffplay的读取线程部分。 从图中可以看出,解码线程的主要工作内容是将资源包从待解码列队中取出,然后送进解码器,最后将解码出的数据帧放入帧队列中,等待SDL获取播放。 【学习地址】:F…

【开源电路】ST-LINK/V2、ST-LINK/V2-1、DAP-LINK烧录器(已验证)

【开源电路】ST-LINK/V2、ST-LINK/V2-1、DAP-LINK烧录器(已验证)PCBA实物图 最终的的PCB 3D效果图 效果图和PCBA实物图差异说明 由于设计之初只考虑当ST-LINK V2来用,主要是用来给STM8和stm32烧录程序。没有考虑到会将固件升级到ST-LINK…

可变电阻元件封装

实验目的 掌握原理图封装的绘制操作掌握原理图封装和PCB封装的联系掌握PCB封装的绘制探索逻辑元件的选择 实验原理 采用EDA软件进行电路原理图设计 实验仪器 电脑、Altium Designer软件、相关元器件 实验内容 制作可变电阻元件 1. 创建工作环境2. 管理元件库在左侧面板中打开…

2023年,pmp还值得去考试吗?

为什么不值得呢?PMP的中文翻译过来就是项目管理专业人士,专业人士才考的证难道会差吗?有了它,即使是项目管理小白也能变成PMP专业人士! 张嘴就冒那种别人听了就一脸懵但依然觉得你牛逼坏了的专业术语(笑&a…

站稳前沿消费趋势,IU酒店持续领跑轻中端品牌

站稳前沿消费趋势,IU凸显品牌影响魅力 在疫情点状散发的背景下,身处一线的酒店行业深受影响,在现今错综复杂的市场环境中,投资者如何谋求机遇?酒店业为何破局重生?另一方面,随着消费升级以及年轻一代消费群体的崛起…

【SpringCloud】02 搭建springcloud微服务项目

文章目录搭建springcloud微服务项目1. 微服务父工程2. 创建子模块-shop-common3. 创建子模块--shop-product4. 创建子模块--shop-order搭建springcloud微服务项目 技术栈: springcloud-alibabamybatis-plus 持久性框架mysql数据库5.7以上springboot来搭建每个微服务。 1. 微服…

艾美捷Immunochemistry MitoPT JC-1试剂盒

艾美捷Immunochemistry MitoPT JC-1测定利用荧光染料JC-1检测线粒体膜去极化。当积聚在带负电的极化线粒体中时,JC-1发出橙色荧光。当线粒体膜电位在凋亡或代谢应激的细胞中崩溃时,JC-1试剂分散在细胞中并发出绿色荧光。使用流式细胞仪、荧光平板读取器或…

【场景化解决方案】慧致造ERP,为企业提供生产全流程数字化管理

方案简介 慧致造ERP以钉钉为基座,借助钉钉待办、工作通知、OA审批、工作台组件、酷应用、定制工作台等开放能力,围绕制造业生产管理场景与钉钉深度融合,为中小制造业打造业财一体化的生产制造解决方案,企业用户只需一个平台&…

Linux企业运维之git的使用

文章目录前言一、git简介以及基础操作二、github或者在gitee上创建项目并且上传本地项目自动化创建(触发jenkins)前言 一、git简介以及基础操作 git 简单来说就是版本控制系统 但是相对于其他版本控制系统来说,它又具有一些优点:…

集群渲染和渲染农场是什么意思?跟云渲染有什么关系?

嗨咯,大家好,今天后台有同学问集群渲染什么意思?集群渲染怎么做? 集群渲染(cluster rendering)指的是一组计算机通过通信协议连接在一起的计算机群,它们能够将工作负载从一个超载的计算机迁移到…

20款免费项目管理系统推荐

通过本篇文章您将了解:1、国内外20款最佳项目管理软件;2、使用免费项目管理工具可能面临的风险。一、项目管理软件的重要性 根据 Capterra 的数据研究,项目管理软件即将成为人们最需要的软件。一个项目无论大小,都需要一款高效且…

基于PHP+MySQL游戏视频网站的设计与实现

游戏是茶前饭后一个很好的娱乐方式,但是由于当下网络的高速发展,游戏的模式和种类也丰富多彩,这就导致很多时候人们不能够很快的对游戏上手。 为了改变这一情况很多视频娱乐类网站都出现了游戏视频,但是大多数时候这种网站并不是一个专业的游戏视频网站,跟多的时候是各类电影和…

SpringMVC学习

SpringMVCSpring MVC概述:**什么是Spring MVC ?****什么是MVC?**第一个SpringMVC程序具体步骤:具体实现:第一个SpringMVC小程序的完善Spring MVC概述: 什么是Spring MVC ? 他是基于MVC开发模式的框架&am…

数学建模英文论文的写作方法和步骤

目录 一、语言技巧 二、论文结构 1.标题写作 2.摘要写作时态​编辑 2.2摘要写作语态 2.3摘要写作人称 2.4摘要写作注意事项 3.问题重述 4. 符号说明​编辑 三线表 ​5.模型假设(以三到七个合理假设为宜 ) 6.模型分析及建立模型 7.模型求解 8.模型检验 9.模型优…

电视剧里的代码真能运行吗?

大家好,欢迎来到 Crossin的编程教室 ! 前几天,后台老有小伙伴留言“爱心代码”。这不是Crossin很早之前发过的内容嘛,怎么最近突然又被人翻出来了?后来才知道,原来是一部有关程序员的青春偶像剧《点燃我,温…

022_SSS_Novel View Synthesis with Diffusion Models

Novel View Synthesis with Diffusion Models 1. Introduction 本文利用diffusion模型,在给定参考图的条件下,生成指定pose的图像,作者称为3DiM。并且可以在给定一张特定视角的图的条件下,生成其他所有视角的图。 本文的主要贡…

Treap 原理详解和实战

一 点睛 Treap 指 Tree heap,又叫作树堆,同时满足二叉搜索树和堆两种性质。二叉搜索树满足中序有序性,输入序列不同,创建的二叉搜索树也不同,在最坏的情况下(只有左子树或只有右子树)会退化为…