11.1 tomcat的总体结构
tomcat核心组件是Connector 和 Container,其中Connector组件可以被替换,多个Connector和一个Container组成组成一个Service。Server统一管理多个Service的生命周期。所有组件的生命周期都是LifeCycle(观察者模式)的接口空控制。
server主要完成一个让其他程序能够访问到对应service的接口,以及维护service的生命周期
11.1 Connector组件
负责接收浏览器发送过来的TCP请求,创建一个Request和Response对象用于请求和交换数据。并产生一个线程处理这个请求,把Request和Response对象传给处理这个请求的线程。
Tomcat5中默认的Connector是Coyote。
- 初始化ServerSocket
- 初始化一个线程等待新的连接请求
- 创建线程池构建request,response对象
- 所有线程进入await
- 请求到来,将socket分配给HttpProcessor
- 激活线程,开始run方法
- 创建SocketInputStream为input和output对象(解析http协议,将Header装载到request和response对象中)
- 将request和response传给Container组件执行
- 返回request和response
- Output.flush()方法返回客户端
- 关闭当前socket
11.2 Container组件
责任链的设计模式
包含4个组件:Engine,Host,Context,Wrapper
为父子关系
Host不是必须的,但运行war程序Host是必要的
- ContainerBase调用invoke
- Request.getHost()方法获得主机
- host.getPipeline().invoke责任链
11.2.1 Engine容器
之定义一些基本的关联关系
11.2.2 Host容器
host是一个虚拟主机,一个虚拟主机可以运行多个应用,主要处理安装、展开、启动、结束web应用
11.2.3 Context容器
Context代表Servlet的Context,简单的Tomcat可以没有Engine和Host。
Context主要的作用是管理Servlet实例,servlet在Context中是通过Wrapper出现的。
当context中reloadable设置成为true时,当war被修改后悔自动重新加载这个应用。会调用stop然后在调用start方法,完成context的一次重新加载。
11.2.4 wrapper容器
Wrapper容器代表一个servlet,负责servlet的装载、初始化、执行、资源回收。
11.3 Tomcat的设计模式
11.3.1 门面设计模式
门面设计模式:多个子系统间相互通信,将对方感兴趣的属性暴露给子系统。在组件之间做隔离
应用在:在 Request 和 Response 对象封装中、Standard Wrapper 到 ServletConfig 封装中、ApplicationContext 到 ServletContext 封装中。
request中门面设计模式
HttpRequestFacade封装了HttpRequest接口能够提供数据。通过HttpRequestFacade访问的数据都被代理到HttpRequest中。
11.3.2 观察者设计模式
观察者设计模式,事件监听机制。
使用范围:LifeCycle,Servlet 实例的创建、Session 的管理、Container 等都是同样的原理
LifecycleEvent是的可以定义事件类别,不同事件可区别处理
LifecycleSupport代理了主题对多观察者的管理,将这个管理抽出来统一事件
11.3.3 命令设计模式
命令设计模式作用是封装命令,把发出命令的责任和执行命令的责任分开。
Client:创建一个命令,并决定接受者
Command 命令:命令接口定义一个抽象方法
ConcreteCommand:具体命令,负责调用接受者的相应操作
Invoker 请求者:负责调用命令对象执行请求
Receiver 接受者:负责具体实施和执行一次请求
体现: Connector 和 Container 组件之间
Connector作为抽象请求者,HttpConnector作为具体请求者,HttpProcessor作为命令。Container作为命令的抽象接收这,ContainerBase作为具体的接受者。
server创建命令请求者HttpConnector,然后创建HttpProcessor命令对象,把命令对象交给命令接受者ContainerBase,命令最终被Container执行。
11.3.4 责任链模式
责任链模式是tomcat Container设计的基础,责任链将请求正确传递给最终处理请求的那个Servlet。
抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对后继对象的引用。这个角色通常由一个抽象类或接口实现。
具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给后继对象。由于具体处理者持有对后继对象的引用,因此,如果需要,具体处理者可以访问后继对象。
Pipeline是责任链,Valve存放Container用于处理请求。
每个容器都有一个 StandardXXXValve。只要涉及到这种有链式是处理流程这是一个非常值得借鉴的模式。
tomcat系统架构设计
最新推荐文章于 2020-11-02 10:12:06 发布