从Tomcat和Jetty总结组件化设计规范
经常谈论的快速迭代和重构,敏捷开发,都是应对需求的快速变化,因此在整个系统设计的时候就要考虑可扩展性.总结Tomcat和Jetty中框架的设计,有助于学习其中的思想.
组件化和可配置
Tomcat和Jetty的整体架构都是基于组件的,可以通过XML文件或者代码的方式配置这些组件,Tomcat通过server.xml,Jetty通过jetty.xml.可以根据需要灵活选择内置的组件,也可以自定义组件,这样的设计为Web容器提供了深度定制的可能.
Tomcat&Jetty实现组件化设计要点:
- 1.面向接口编程.所有组件都通过抽象和接口进行调用和通信,这样就能轻易对组件进行替换.
- 2.提供组件载体.Tomcat和Jetty都有Server的概念,Server就是所有组件组装在一起之后提供服务的载体.而开发者只需要定制那些组件进行组合就可以达到定制化需求.
虽然Web容器的组件都能够自行选定,但是Web容器中组件的关系都是固定的,在既定的规则下进行组件的定义.
类比Spring容器,虽然也可以通过配置或者注解形式注入bean,但是Spring容器中Bean的关系是由用户自己定义的.
组件的创建
由于组件都是可配置的,Web容器在启动前并不知道要创建哪些具体的组件,也就是说不能通过硬编码形式实现,而是通过反射机制动态创建.而又因为需要隔离不同的Web应用,所以就需要自定义的类加载器(因为用JVM提供的类加载器,就无法对同一个类进行Web应用隔离,这点后续会继续总结).
因为所有Web应用都运行在同一个JVM中,但是可能不用的Web应用中定义了同一个类,但是如果用系统自带的类加载器就会出现异常,所以需要自定义类加载器
组件的生命周期管理
Tomcat和Jetty采用类似的办法管理组件的生命周期.
- 由父组件负责子组件的创建,启动/停止,销毁
只要启动最上层组件,整个Web容器就启动了
- 定义组件的生命周期状态,通过观察者模式让相关组件在状态发生变化的时候实现相应的处理动作.
组件的骨架抽象类和模板模式
组件的设计与实现中,Tomcat和Jettty都大量采用了骨架抽象类和模板模式.
例如ProtocolHandler接口,有抽象类AbstractProtocolHandler,实现了协议处理层的骨架和通用逻辑,而具体实现类也有抽象基类,入HTTPProtocol和AjpProtocol.
Jetty中的Handler接口就有AbstractHandler,Connector有AbstractConnector,这些抽象类都实现了通用逻辑,定义抽象方法.
这是一个通用的设计规范,不管是Web容器还是Spring框架,甚至JDK本身都有很多类似的实现逻辑,例如AbstractSet,AbstractMap.
并且在JDK8开始接口也允许有default方法,甚至可以将通用逻辑放到接口中.