深入分析JavaWeb内幕读书笔记——(七)

Tomcat的系统架构与设计模式

一个或多个service服务运行在server服务器上,service服务有两个核心组件分别是Connector和Container,一个Container对应多个Connector,多个Connector和一个Container就形成了一个service,就可以对外提供服务了,service的生命周期就由server服务器来管理。
将Connector、Container比作一个整体,例如一堆情侣,Connector负责对外交流,就像男孩;Container主要处理Connector接受的请求和内部事务,就像女孩;Service就是连接他们的结婚证,将他们连接在一起,共同组成家庭。service只是在Connector和Container外面多包一层,把他们组装在一起向外线提供服务。server就像是民政局,它提供一个接口让其他程序可以访问到这个Service集合,同时维护它所包含的所有Service的生命周期,包括初始化、服务结束、找到要访问的service等等。
Service和Server通过Lifecycle接口来控制管理它们下面组件的生命周期。组件只要继承Lifecycle接口并实现其中 方法,就可以被拥有它的组件控制,这样一层一层地传递,知道一个最高级的组件就可以控制Tomcat中所有组件的生命周期,这个最高级的组件就是server,控制server的就是Startup,也就是tomcat的启动和关闭。除了控制Start和Stop方法外,还有一个监听机制,在生命周期开始和结束时做一些额外的操作。监听的代码会包围Service组件的启动过程**(BEFORE_START_EVENT,START_EVENT,AFTER_START_EVENT)**,简单地循环启动所有Service的Start方法。

Connector组件

Connector的主要任务是接受浏览器发过来的TCP连接请求,创建一个Request和Response对象分别用于和请求端交换数据。然后产生一个线程来处理这个请求并把产生的Request和Response对象交个处理这个请求的线程,处理这个请求的线程就是Container要做的事。

大体流程如下:

用户发送请求->
Connector调用initialize方法初始化一个ServerSocket->
初始化一个线程,等待新的连接请求->
创建一定大小的线程池,构建Request和Response对象->
所有线程进入await->
请求到来,将socket分配给process->
激活线程,run方法执行->
创建SocketInputStream为input、output对象,其中包括解析Http协议,封装model到Request和Response中,便于它们在到达Container时有足够的连接信息->
将Request和Response传个Container执行->
Container执行servlet处理->
返回Request和Response对象->
output.flush结果返回给客户端->
Request和Response生命周期结束,关闭当前socket。

Servlet容器Container

Container是容器的父接口,所有子容器都必须实现这个借口,Container容器的设计是用的典型的责任链模式,由4个Engine、Host、Context和Wrapper四个子容器组件构成,这个四个组件之间是父子关系,Engine包含Host,Host包含Context,Context包含Wrapper。通常一个Servlet Class对应一个Wrapper,如果有多个Servlet,则可以定义多个Wrapper。如果有多个Wrapper,则要定义一个更高的Container,如Context,就像在Server.xml中最常见的配置<Context path="/library" docBase="D:\project\library\deploy\target\library.war" reloadable="true" />

当Connector接受一个连接请求时,会将请求交给Container,该请求的流程如下:

  1. 通过Connector.getContainer()调用StandardEngine
  2. StandardEngine调用并返回自己的invoke
  3. StandardEngine调用并返回ContainerBase的默认实现
  4. ContainerBase的默认实现调用StrandardEngineValue
  5. StrandardEngineValve通过request.getHost调用并返回Request
  6. StrandardEngineValve通过host.getPipeline调用StandardHost
  7. StandardHost调用自己的invoke
  8. StandardHost返回默认实现调用到Container
  9. ContainerBase调用并返回StandardHostValve
Engine容器

Engine容器的标准实现类是StandardEngine,它没有父容器,同时它添加的子容器也只能是Host类型的。他的初始化方法也就是初始化和它相关联的组件,以及一些事件的监听。

他的流程如下:

  1. StandardHostValve执行request.getContext获取Request
  2. StandardHostValve执行context.getPipeline调用StandardContext
  3. StandardContext应用目录检查WEB-INf
  4. StandardContext容器开始事件监听
  5. StandardContext执行request.getWrapper()获取wrapper
  6. StandardContext执行wrapper.getPipeline获取StandardWrapper
  7. StandardWrapper调用StandardWrapperValve
  8. StandardWrapperValve加载servlet,执行init方法
  9. StandardWrapperValve创建filter链
  10. StandardWrapperValve执行servlet的Service方法
  11. StandardWrapperValve释放所有资源
  12. StandardContext容器结束事件监听
Host容器

Host容器是Engine的子容器,一个Host在Engine中代表一个虚拟主机,虚拟主机的左右就是运行多个应用,它负责安装和展开这些应用,并标识它们便于区分。他的子容器通常是Context,同时还保存一个主机应有的信息。

Context容器

Context代表Servlet的Context,具备Servlet运行的基本环境,理论上只要有了Context就能运行Servlet。

Context最重要的功能就是管理它里面的servlet实例,servlet实例在Context中是以Wrapper出现的。

Context准备Servlet的运行环境是从Start方法开始,它的主要作用是设置各种资源属性和管理组件,还有一个非常重要的作用就是启动子容器和Pipeline。

Wrapper容器

Wrapper代表一个Servlet,它负责管理一个Servlet,包括Servlet的装载、初始化、执行和资源回收,它是最底层的容器,不能再调用它的addChild方法了。它的实现类是StanddardWrapper,同时该实现类还实现了一个拥有Servlet初始化信息的ServletConfig,StanddardWrapper将直接和servlet的各种信息打交道。

Tomcat中的设计模式

门面模式

门面模式就是将一个东西或一组特定的数据封装成一个门面,好于其他模块更容易的交流,就像一个国家的外交部一样。在Tomcat中HTTPRequestFacade类封装了HTTPRequest接口,能够提供数据,通过HTTPRequestFacade访问到的数据都被代理到HTTPRequest中,通常被封装的对象都被设为Private或者protected,以防止在Facade中被直接访问。

观察者模式

观察者模式又称为发布-订阅模式,也就是事件监听机制。例如:在微博关注某个博主,每当博主发布信息时,你这个关注人就作为观察者将会收到该信息,可能做出评论或点赞等操作。被关注也可以把你拉黑,也就是说你将会在被关注人那里登记。在Tomcat中
控制组件生命周期的Lifecycle就是这种模式的体现,还有对Servlet实例的创建、Session的管理、Container等都是同样的原理。

命令设计模式

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

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

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

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

责任链模式

很多个对象由每个对象对其下架的引用而连接起来形成一条链,请求在这条链上传递,知道链上的某个对象处理此请求,或者每个对象都可以处理请求,并传给“下家”,知道链上的每个对象都处理完,这样可以在不影响客户端的情况下,而能够在链上增加任意处理节点。

Tomcat的容器设置就是责任链模式,从Engine到Host再到Context一直到Wrapper都通过一个链传递请求。


自己使用整理收集,如有侵权 请联系删除!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值