`

TOMCAT 架构与设计模式

 
阅读更多

门面设计模式

门面设计模式在 Tomcat 中有多处使用,在 Request 和 Response 对象封装中、Standard Wrapper 到 ServletConfig 封装中、ApplicationContext 到 ServletContext 封装中等都用到了这种设计模式。

门面设计模式的原理

这么多场合都用到了这种设计模式,那这种设计模式究竟能有什么作用呢?顾名思义,就是将一个东西封装成一个门面好与人家更容易进行交流,就像一个国家的外交部一样。

这种设计模式主要用在一个大的系统中有多个子系统组成时,这多个子系统肯定要涉及到相互通信,但是每个子系统又不能将自己的内部数据过多的暴露给其它系统,不然就没有必要划分子系统了。每个子系统都会设计一个门面,把别的系统感兴趣的数据封装起来,通过这个门面来进行访问。这就是门面设计模式存在的意义。

门面设计模式示意图如下:


图 1. 门面示意图
图 1. 门面示意图 

Client 只能访问到 Façade 中提供的数据是门面设计模式的关键,至于 Client 如何访问 Façade 和 Subsystem 如何提供 Façade 门面设计模式并没有规定死。

Tomcat 的门面设计模式示例

Tomcat 中门面设计模式使用的很多,因为 Tomcat 中有很多不同组件,每个组件要相互交互数据,用门面模式隔离数据是个很好的方法。

下面是 Request 上使用的门面设计模式:


图 2. Request 的门面设计模式类图
图 2. Request 的门面设计模式类图 

从图中可以看出 HttpRequestFacade 类封装了 HttpRequest 接口能够提供数据,通过 HttpRequestFacade 访问到的数据都被代理到 HttpRequest 中,通常被封装的对象都被设为 Private 或者 Protected 访问修饰,以防止在 Façade 中被直接访问。

观察者设计模式

这种设计模式也是常用的设计方法通常也叫发布 - 订阅模式,也就是事件监听机制,通常在某个事件发生的前后会触发一些操作。

观察者模式的原理

观察者模式原理也很简单,就是你在做事的时候旁边总有一个人在盯着你,当你做的事情是它感兴趣的时候,它就会跟着做另外一些事情。但是盯着你的人必须要到你那去登记,不然你无法通知它。观察者模式通常包含下面这几个角色:

  • Subject 就是抽象主题:它负责管理所有观察者的引用,同时定义主要的事件操作。
  • ConcreteSubject 具体主题:它实现了抽象主题的所有定义的接口,当自己发生变化时,会通知所有观察者。
  • Observer 观察者:监听主题发生变化相应的操作接口。

Tomcat 的观察者模式示例

Tomcat 中观察者模式也有多处使用,前面讲的控制组件生命周期的 Lifecycle 就是这种模式的体现,还有对 Servlet 实例的创建、Session 的管理、Container 等都是同样的原理。下面主要看一下 Lifecycle 的具体实现。

Lifecycle 的观察者模式结构图:


图 3. Lifecycle 的观察者模式结构图
图 3. Lifecycle 的观察者模式结构图 

上面的结构图中,LifecycleListener 代表的是抽象观察者,它定义一个 lifecycleEvent 方法,这个方法就是当主题变化时要执行的方法。 ServerLifecycleListener 代表的是具体的观察者,它实现了 LifecycleListener 接口的方法,就是这个具体的观察者具体的实现方式。Lifecycle 接口代表的是抽象主题,它定义了管理观察者的方法和它要所做的其它方法。而 StandardServer 代表的是具体主题,它实现了抽象主题的所有方法。这里 Tomcat 对观察者做了扩展,增加了另外两个类:LifecycleSupport、LifecycleEvent,它们作为辅助类扩展了观察者的功能。LifecycleEvent 使得可以定义事件类别,不同的事件可区别处理,更加灵活。LifecycleSupport 类代理了主题对多观察者的管理,将这个管理抽出来统一实现,以后如果修改只要修改 LifecycleSupport 类就可以了,不需要去修改所有具体主题,因为所有具体主题的对观察者的操作都被代理给 LifecycleSupport 类了。这可以认为是观察者模式的改进版。

LifecycleSupport 调用观察者的方法代码如下:


清单 1. LifecycleSupport 中的 fireLifecycleEvent 方法
				
public void fireLifecycleEvent(String type, Object data) {
    LifecycleEvent event = new LifecycleEvent(lifecycle, type, data);
    LifecycleListener interested[] = null;
    synchronized (listeners) {
        interested = (LifecycleListener[]) listeners.clone();
    }
    for (int i = 0; i < interested.length; i++)
        interested[i].lifecycleEvent(event);
}

主题是怎么通知观察者呢?看下面代码:


清单 2. 容器中的 start 方法
				
public void start() throws LifecycleException {
    lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null);
    lifecycle.fireLifecycleEvent(START_EVENT, null);
    started = true;
    synchronized (services) {
        for (int i = 0; i < services.length; i++) {
            if (services[i] instanceof Lifecycle)
                ((Lifecycle) services[i]).start();
            }
        }
    lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);
}

命令设计模式

前面把 Tomcat 中两个核心组件 Connector 和 Container,比作一对夫妻。男的将接受过来的请求以命令的方式交给女主人。对应到 Connector 和 Container,Connector 也是通过命令模式调用 Container 的。

命令模式的原理

命令模式主要作用就是封装命令,把发出命令的责任和执行命令的责任分开。也是一种功能的分工。不同的模块可以对同一个命令做出不同解释。

下面是命令模式通常包含下面几个角色:

  • Client:创建一个命令,并决定接受者
  • Command 命令:命令接口定义一个抽象方法
  • ConcreteCommand:具体命令,负责调用接受者的相应操作
  • Invoker 请求者:负责调用命令对象执行请求
  • Receiver 接受者:负责具体实施和执行一次请求

Tomcat 中的命令模式的示例

Tomcat 中命令模式在 Connector 和 Container 组件之间有体现,Tomcat 作为一个应用服务器,无疑会接受到很多请求,如何分配和执行这些请求是必须的功能。

下面看一下 Tomcat 是如何实现命令模式的,下面是 Tomcat 命令模式的结构图:


图 4. Tomcat 命令模式的结构图
图 4. Tomcat 命令模式的结构图 

Connector 作为抽象请求者,HttpConnector 作为具体请求者。HttpProcessor 作为命令。Container 作为命令的抽象接受者,ContainerBase 作为具体的接受者。客户端就是应用服务器 Server 组件了。Server 首先创建命令请求者 HttpConnector 对象,然后创建命令 HttpProcessor 命令对象。再把命令对象交给命令接受者 ContainerBase 容器来处理命令。命令的最终是被 Tomcat 的 Container 执行的。命令可以以队列的方式进来,Container 也可以以不同的方式来处理请求,如 HTTP1.0 协议和 HTTP1.1 的处理方式就会不同。

责任链模式

Tomcat 中一个最容易发现的设计模式就是责任链模式,这个设计模式也是 Tomcat 中 Container 设计的基础,整个容器的就是通过一个链连接在一起,这个链一直将请求正确的传递给最终处理请求的那个 Servlet。

责任链模式的原理

责任链模式,就是很多对象有每个对象对其下家的引用而连接起来形成一条链,请求在这条链上传递,直到链上的某个对象处理此请求,或者每个对象都可以处理请求,并传给下一家,直到最终链上每个对象都处理完。这样可以不影响客户端而能够在链上增加任意的处理节点。

通常责任链模式包含下面几个角色:

  • Handler(抽象处理者):定义一个处理请求的接口
  • ConcreteHandler(具体处理者):处理请求的具体类,或者传给下家

Tomcat 中责任链模式示例

在 tomcat 中这种设计模式几乎被完整的使用,tomcat 的容器设置就是责任链模式,从 Engine 到 Host 再到 Context 一直到 Wrapper 都是通过一个链传递请求。

Tomcat 中责任链模式的类结构图如下:


图 5. Tomcat 责任链模式的结构图
图 5. Tomcat 责任链模式的结构图 

上图基本描述了四个子容器使用责任链模式的类结构图,对应的责任链模式的角色,Container 扮演抽象处理者角色,具体处理者由 StandardEngine 等子容器扮演。与标准的责任链不同的是,这里引入了 Pipeline 和 Valve 接口。他们有什么作用呢?

实际上 Pipeline 和 Valve 是扩展了这个链的功能,使得在链往下传递过程中,能够接受外界的干预。Pipeline 就是连接每个子容器的管子,里面传递的 Request 和 Response 对象好比管子里流的水,而 Valve 就是这个管子上开的一个个小口子,让你有机会能够接触到里面的水,做一些额外的事情。

为了防止水被引出来而不能流到下一个容器中,每一段管子最后总有一个节点保证它一定能流到下一个子容器,所以每个容器都有一个 StandardXXXValve。只要涉及到这种有链式是处理流程这是一个非常值得借鉴的模式。

分享到:
评论

相关推荐

    燃料电池汽车Cruise整车仿真模型(燃料电池电电混动整车仿真模型) 1.基于Cruise与MATLAB Simulink联合仿真完成整个模型搭建,策略为多点恒功率(多点功率跟随)式控制策略,策略模

    燃料电池汽车Cruise整车仿真模型(燃料电池电电混动整车仿真模型)。 1.基于Cruise与MATLAB Simulink联合仿真完成整个模型搭建,策略为多点恒功率(多点功率跟随)式控制策略,策略模型具备燃料电池系统电堆控制,电机驱动,再生制动等功能,实现燃料电池车辆全部工作模式,基于项目开发,策略准确; 2.模型物超所值,Cruise模型与Simulink策略有不懂的随时交流; 注:请确定是否需要再买,这种技术类文件出一概不 ;附赠Cruise与Simulink联合仿真的方法心得体会(大概十几页)。

    并列关系-关系图表-鲜艳红色 -3.pptx

    图表分类ppt

    实际项目中三菱fx5u编写的中型程序,用了st fbd ld 混合编程,程序内容完整,控制十来个轴 ,结构清晰 ,用到了结构体,全局变量 ,适合进阶学习

    实际项目中三菱fx5u编写的中型程序,用了st fbd ld 混合编程,程序内容完整,控制十来个轴 ,结构清晰 ,用到了结构体,全局变量 ,适合进阶学习

    并列关系-关系图表-简约折纸-3.pptx

    图表分类ppt

    甘特图-商业图表-稳重色彩 3.pptx

    图表分类ppt

    西南科技大学仿射密码实验报告

    一、实验目的 1.理解仿射密码的基本原理及加密、解密过程。 2.掌握利用 C 语言实现仿射密码加密与解密的基本方法。 3.通过实例观察仿射密码的加密效果及安全性。 4.通过实现简单的古典密码算法,理解密码学的相关概念,如明文、密文、加密密钥、解密密钥、加密算法、解密算法、流密码与分组密码等。

    彩色扇形层级关系图PPT模板-3.pptx

    彩色扇形层级关系图PPT模板-3

    创意铅笔四项并列PPT模板-1.pptx

    图表分类ppt

    大圆套小圆多项包含PPT图表.pptx

    大圆套小圆多项包含PPT图表

    Matlab 运动脉搏数据 基于小波降噪和VMD分解的滤波研究 不同滤波方法的信噪比对比

    Matlab 运动脉搏数据 基于小波降噪和VMD分解的滤波研究 不同滤波方法的信噪比对比

    极简创意PPT时间轴模板.pptx

    图表分类ppt

    CDN技术在网络内容分发的应用解析:工作原理、关键组件及优势

    内容概要:本文详细介绍了CDN (内容分发网络)的技术背景和具体实施方案,旨在帮助技术人员深入了解这一网络优化工具的工作机制。文章首先解释了CDN是如何通过在不同地理位置设立边缘节点来存储缓存内容的,接着重点描述了三个关键组成部分——边缘节点服务器、中心服务器以及负载均衡器的功能,并讨论了它们协同工作的流程。之后阐述了CDN的主要优势,包括提升网站响应时间和内容分发效率、减小源站服务器的压力和支持大规模并发访问等方面的表现。最后列举了几种典型应用场景,如加速静态网页加载速度、保障视频/音频串流质量,还有支持高效的大文件分发等。 适用人群:互联网开发者、运维人员及其他希望改进自己网站或平台性能的专业人士。 使用场景及目标:针对需要优化网站或移动应用程序加载速度的服务提供商来说,采用CDN可以帮助改善用户体验的同时也能节约带宽资源,进而达到降低运营开支的目的。 其他说明:文中不仅讲解了相关概念和技术细节,还提供了实用案例分析以便于读者更加直观的理解CDN的实际应用价值。此外,在选择是否部署CDN时应当考虑自身业务特点和需求,合理规划投入产出比。

    phpAjaxcookbook英文pdf文字版(phpAjax手册)最新版本

    This PDF, available in English, is designed for advanced PHP Ajax learners. It offers 60 simple yet highly effective recipes for the Ajaxification of Web 2.0 sites. Key topics include: - Learning to develop and deploy iPhone web and native applications. - Optimizing the performance of Ajax applications. - Constructing dynamic websites that achieve faster server responses through the asynchronous call feature of PHP Ajax. - Utilizing Ajax for rapid and efficient data access from the server, ther

    机器学习(预测模型):高等教育数学学习评估数据集

    一个专注于高等教育数学学习评估的宝贵资源,它汇集了9546条详尽的记录,为教育领域的数据分析和机器学习研究提供了丰富的素材。该数据集精心设计,能够支持多种机器学习任务,包括分类、回归和聚类等,有助于深入挖掘学生数学学习过程中的关键信息,为教育决策和教学改进提供有力依据。 数据集涵盖了学生回答数学问题的全方位信息。在学生层面,记录了学生ID和国籍,这有助于从不同地域文化背景分析学生的学习表现差异。问题细节方面,每个问题都有独特的ID标识,难度等级分为基础和高级,其中基础问题占比高达82%,高级问题占18%,这种分布反映了数学学习中不同难度层次的覆盖情况。数学主题丰富多样,线性代数主题占比最大,达60%,基础数学占9%,其他主题占31%,涵盖了数学教育的核心领域。子主题进一步细化,向量空间和线性变换是较为突出的两个子主题,分别占比29%和22%,体现了线性代数在数学学习中的重要地位。 数据的预期更新频率为每年,这保证了数据集能够持续反映数学教育领域的最新动态和学生学习情况的变化,使其始终保持时效性和实用性,为教育研究者和实践者提供持续的支持。

    基于java+springboot+vue+mysql的教学辅助平台设计与实现.docx

    基于java+springboot+vue+mysql的教学辅助平台设计与实现.docx

    西南科技大学密码学RSA实验

    内容概要:本文详细描述了RSA密码算法的实现,涵盖从基本原理的理解到密钥生成、数据加密解密的具体编程实践。在密钥生成环节,采用了随机大素数生成、素性检测(使用Miller-Rabin)、以及计算Euler's totient function和选定适当大小的公开指数e和私人指数d的过程;针对加密过程,引入了基于快速模幂算法的数据编码方式,而解密部分,则借助了中国剩余定理(孙子定理),提高了解密速度。同时对可能存在的误差进行了探讨。最后给出了关于如何改进代码性能的方法,并附带解答了一些相关理论问题。 适合人群:熟悉C语言编程,有兴趣深入研究密码学尤其是公共密钥基础设施的专业人士。 使用场景及目标:本报告适用于高校课程作业或是科研项目中的信息安全方向的研究,帮助学生掌握公钥加密机制背后的数学原理和技术细节,提升实际动手能力和解决实际问题的能力。 其他说明:报告还包括了一些附加的内容,比如如何用RSA构建简单的伪随机数生成器,还有讨论了什么情况下加密会产生固定点的现象。这些都是为了加深理解和巩固所学到的知识点提供的补充材料。

    实用的PPT数据表格模板-4.pptx

    实用的PPT数据表格模板-4

    springboot项目基于BS模式的冷链物流系统.zip

    springboot项目基于BS模式的冷链物流系统,含有完整的源码和报告文档

    基于微信小程序的岳阳市美术馆预约平台设计与实现.docx

    基于微信小程序的岳阳市美术馆预约平台设计与实现.docx

    Delphi 12 控件之BDE-Installer-for-RAD-Studio-10-Seattle.7z

    BDE_Installer_for_RAD_Studio_10_Seattle.7z

Global site tag (gtag.js) - Google Analytics