tomcat系统架构设计

本文详细解析了Tomcat的总体结构,包括核心组件Connector和Container的工作原理及生命周期管理,同时深入探讨了其设计模式如门面、观察者、责任链和命令模式的应用。文章还详细介绍了Container组件的层次结构及其各组件的功能,以及如何通过这些设计模式提高Tomcat的可扩展性和灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 11.1 tomcat的总体结构

    图 1.Tomcat 的总体结构

     

    tomcat核心组件是Connector Container,其中Connector组件可以被替换,多个Connector和一个Container组成组成一个ServiceServer统一管理多个Service的生命周期。所有组件的生命周期都是LifeCycle(观察者模式)的接口空控制。

    server主要完成一个让其他程序能够访问到对应service的接口,以及维护service的生命周期

     

    11.1 Connector组件

    负责接收浏览器发送过来的TCP请求,创建一个RequestResponse对象用于请求和交换数据。并产生一个线程处理这个请求,把RequestResponse对象传给处理这个请求的线程。

    图 6. Connector 处理一次请求顺序图

    Tomcat5中默认的ConnectorCoyote

    1. 初始化ServerSocket
    2. 初始化一个线程等待新的连接请求
    3. 创建线程池构建requestresponse对象
    4. 所有线程进入await
    5. 请求到来,将socket分配给HttpProcessor
    6. 激活线程,开始run方法
    7. 创建SocketInputStreaminputoutput对象(解析http协议,将Header装载到requestresponse对象中)
    8. requestresponse传给Container组件执行
    9. 返回requestresponse
    10. Output.flush()方法返回客户端
    11. 关闭当前socket

     

    11.2 Container组件

    责任链的设计模式

    包含4个组件:EngineHostContextWrapper

    为父子关系

    Host不是必须的,但运行war程序Host是必要的

    图 9. Engine 和 Host 处理请求的时序图

    1. ContainerBase调用invoke
    2. Request.getHost()方法获得主机
    3. host.getPipeline().invoke责任链

     

    11.2.1 Engine容器

    之定义一些基本的关联关系

    图 11. Engine 接口的类结构

     

    11.2.2 Host容器

    host是一个虚拟主机,一个虚拟主机可以运行多个应用,主要处理安装、展开、启动、结束web应用

     

    11.2.3 Context容器

    Context代表ServletContext,简单的Tomcat可以没有EngineHost

    Context主要的作用是管理Servlet实例,servletContext中是通过Wrapper出现的。

    contextreloadable设置成为true时,当war被修改后悔自动重新加载这个应用。会调用stop然后在调用start方法,完成context的一次重新加载。

     

    11.2.4 wrapper容器

    Wrapper容器代表一个servlet,负责servlet的装载、初始化、执行、资源回收。

     

    11.3 Tomcat的设计模式

    11.3.1 门面设计模式

    门面设计模式:多个子系统间相互通信,将对方感兴趣的属性暴露给子系统。在组件之间做隔离

    图 1. 门面示意图

     

    应用在:在 Request 和 Response 对象封装中、Standard Wrapper 到 ServletConfig 封装中、ApplicationContext 到 ServletContext 封装中。

     

    request中门面设计模式

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

     

    HttpRequestFacade封装了HttpRequest接口能够提供数据。通过HttpRequestFacade访问的数据都被代理到HttpRequest中。

     

    11.3.2 观察者设计模式

    观察者设计模式,事件监听机制。

    使用范围:LifeCycle,Servlet 实例的创建、Session 的管理、Container 等都是同样的原理

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

     

    LifecycleEvent是的可以定义事件类别,不同事件可区别处理

    LifecycleSupport代理了主题对多观察者的管理,将这个管理抽出来统一事件

     

    11.3.3 命令设计模式

    命令设计模式作用是封装命令,把发出命令的责任和执行命令的责任分开。

    Client:创建一个命令,并决定接受者

    Command 命令:命令接口定义一个抽象方法

    ConcreteCommand:具体命令,负责调用接受者的相应操作

    Invoker 请求者:负责调用命令对象执行请求

    Receiver 接受者:负责具体实施和执行一次请求

     

    体现: Connector 和 Container 组件之间

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

    Connector作为抽象请求者,HttpConnector作为具体请求者,HttpProcessor作为命令。Container作为命令的抽象接收这,ContainerBase作为具体的接受者。

    server创建命令请求者HttpConnector,然后创建HttpProcessor命令对象,把命令对象交给命令接受者ContainerBase,命令最终被Container执行。

     

    11.3.4 责任链模式

    责任链模式是tomcat Container设计的基础,责任链将请求正确传递给最终处理请求的那个Servlet

    抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对后继对象的引用。这个角色通常由一个抽象类或接口实现。

    具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给后继对象。由于具体处理者持有对后继对象的引用,因此,如果需要,具体处理者可以访问后继对象。

     

     

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

     

    Pipeline是责任链,Valve存放Container用于处理请求。

    每个容器都有一个 StandardXXXValve。只要涉及到这种有链式是处理流程这是一个非常值得借鉴的模式。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值