【Tomcat技术专题】一切从零开始,让我们进入Tomcat的构设计模式

简介: 【Tomcat技术专题】一切从零开始,让我们进入Tomcat的构设计模式

Tomcat的设计模式分析


Tomcat 中运用的许多经典设计模式,如模版模式、工厂模式和单例模式等。通过学习它们的实践运用能给我们以后的软件设计起到一定的借鉴作用。




门面设计模式


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




门面设计模式的原理


顾名思义,就是将一个东西封装成一个门面好与人家更容易进行交流,就像一个国家的外交部一样。
复制代码

这种设计模式主要用在一个大的系统中有多个子系统组成时,多个子系统肯定要涉及到相互通信,但是每个子系统又不能将自己的内部数据过多的暴露给其它系统,不然就没有必要划分子系统了。


每个子系统都会设计一个门面,把别的系统感兴趣的数据封装起来,通过这个门面来进行访问。这就是门面设计模式存在的意义。


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

image.png


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



Tomcat 的门面设计模式示例


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


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


image.png



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




观察者设计模式


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



观察者模式的原理


观察者模式原理也很简单,就是你在做事的时候旁边总有一个人在盯着你,当你做的事情是它感兴趣的时候,它就会跟着做另外一些事情。但是盯着你的人必须要到你那去登记,否则你不会允许它盯着你或者监视着你的。



观察者模式通常包含下面这几个角色:


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



Tomcat 的观察者模式示例


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


Lifecycle 的观察者模式结构图:

image.png

上面的结构图中,LifecycleListener 代表的是抽象观察者,它定义一个 lifecycleEvent 方法,这个方法就是当主题变化时要执行的方法。 ServerLifecycleListener 代表的是具体的观察者,它实现了LifecycleListener 接口的方法,就是这个具体的观察者具体的实现方式。


Lifecycle 接口代表的是抽象主题,它定义了管理观察者的方法和它要所做的其它方法。而 StandardServer 代表的是具体主题,它实现了抽象主题的所有方法。这里 Tomcat 对观察者做了扩展,增加了另外两个类:LifecycleSupportLifecycleEvent,它们作为辅助类扩展了观察者的功能。


  • LifecycleEvent使得可以定义事件类别,不同的事件可区别处理,更加灵活。
  • LifecycleSupport 类代理了主题对多观察者的管理,将这个管理抽出来统一实现,以后如果修改只要修改 LifecycleSupport 类就可以了,不需要去修改所有具体主题,



因为所有具体主题的对观察者的操作都被代理给 LifecycleSupport类了。这可以认为是观察者模式的改进版。实际执行者就是LifecyleSupport去执行


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 的。



命令模式的原理

image.png

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


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



Tomcat 中的命令模式的示例


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


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

image.png

  • Connector 作为抽象请求者,HttpConnector 作为具体请求者。
  • HttpProcessor 作为命令。
  • Container 作为命令的抽象接受者,ContainerBase 作为具体的接受者。
  • 客户端就是应用服务器 Server组件了。

  1. Server 首先创建命令请求者 HttpConnector 对象,创建命令 HttpProcessor 命令对象,把请求者封装到命令对象里面。
  2. 再把命令对象交给命令接受者ContainerBase 容器来处理命令。命令的最终是被 Tomcat 的Container 执行的。
  3. 命令可以以队列的方式进来,Container可以以不同的方式来处理请求,如HTTP1.0 协议和 HTTP1.1 的处理方式就会不同。

责任链模式


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



责任链模式的原理


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


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


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



Tomcat中责任链模式示例


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

image.png

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


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


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









相关文章
|
8月前
|
设计模式 前端开发 JavaScript
【JavaScript 技术专栏】JavaScript 设计模式与实战应用
【4月更文挑战第30天】本文探讨JavaScript设计模式在提升开发效率和代码质量中的关键作用。涵盖单例、工厂、观察者、装饰器和策略模式,并通过实例阐述其在全局状态管理、复杂对象创建、实时数据更新、功能扩展和算法切换的应用。理解并运用这些模式能帮助开发者应对复杂项目,提升前端开发能力。
101 0
|
8月前
|
设计模式 安全 Java
【分布式技术专题】「Tomcat技术专题」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)
【分布式技术专题】「Tomcat技术专题」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)
118 0
|
5月前
|
Java 关系型数据库 MySQL
"解锁Java Web传奇之旅:从JDK1.8到Tomcat,再到MariaDB,一场跨越数据库的冒险安装盛宴,挑战你的技术极限!"
【8月更文挑战第19天】在Linux上搭建Java Web应用环境,需安装JDK 1.8、Tomcat及MariaDB。本指南详述了使用apt-get安装OpenJDK 1.8的方法,并验证其版本。接着下载与解压Tomcat至`/usr/local/`目录,并启动服务。最后,通过apt-get安装MariaDB,设置基本安全配置。完成这些步骤后,即可验证各组件的状态,为部署Java Web应用打下基础。
70 1
|
7月前
|
Ubuntu 前端开发 JavaScript
技术笔记:Ubuntu:一个部署好的tomcat应用(war包)怎么用Nginx实现动静分离?
技术笔记:Ubuntu:一个部署好的tomcat应用(war包)怎么用Nginx实现动静分离?
|
3月前
|
设计模式 算法 Java
盘点Tomcat中常见的13种设计模式
【10月更文挑战第6天】本文深入探讨了Tomcat中常见的13种设计模式,包括单例模式、工厂模式、适配器模式、装饰者模式、组合模式、外观模式、享元模式、责任链模式、命令模式、迭代器模式、观察者模式、策略模式和模板方法模式。通过具体示例,展示了这些设计模式如何协同工作,支撑起Tomcat的高性能和高灵活性。
|
5月前
|
设计模式 物联网 Android开发
移动应用与系统:探索未来技术的融合之路后端开发中的设计模式探索
【8月更文挑战第21天】随着科技的飞速发展,移动应用和操作系统已经成为我们日常生活中不可或缺的一部分。本文将深入探讨移动应用开发和移动操作系统的相关话题,包括它们的历史、现状以及未来的发展趋势。我们将从移动应用的开发环境、编程语言和工具等方面进行详细的分析,同时也会讨论移动操作系统的特点、优势以及面临的挑战。最后,我们将展望移动应用与系统在未来技术融合中的可能方向和机遇。
137 58
|
4月前
|
关系型数据库 Java MySQL
"解锁Java Web传奇之旅:从JDK1.8到Tomcat,再到MariaDB,一场跨越数据库的冒险安装盛宴,挑战你的技术极限!"
【9月更文挑战第6天】在Linux环境下安装JDK 1.8、Tomcat和MariaDB是搭建Java Web应用的关键步骤。本文详细介绍了使用apt-get安装OpenJDK 1.8、下载并配置Tomcat,以及安装和安全设置MariaDB(MySQL的开源分支)的方法。通过这些步骤,您可以快速构建一个稳定、高效的开发和部署环境,并验证各组件是否正确安装和运行。这为您的Java Web应用提供了一个坚实的基础。
63 0
|
6月前
|
设计模式 安全 Java
技术成神之路:设计模式(一)单例模式
【7月更文挑战第3天】技术成神之路:设计模式(一)单例模式
48 1
|
7月前
|
设计模式 Java API
程序技术好文:设计模式:装饰者模式
程序技术好文:设计模式:装饰者模式
32 0
|
7月前
|
设计模式 网络协议 Java
技术笔记:Reactor设计模式
技术笔记:Reactor设计模式
72 0