tomcat原理解决

来源:互联网 发布:淘宝零食批发市场 编辑:程序博客网 时间:2024/06/05 01:51

问题

         说说 tomcat或你了解的 web 容器的实现原理。

总体结构

核心组件

         包括server  service  container 和 connector

         Connector:负责和外部打交道,男方

        Container: 负责处理connector的请求,女方

        Service:结婚证,完成Connector和Container的组装,有一个Container,多个Connector。 实现类是StandardService,实现了Service和LifeStyle接口

        Server: 家, 对Service进行管理,如add和delete,find等。 实现类是StandardServer,实现了Server和LifeStyle MbeanRegistration 接口

基本关系

         多个 Connector和一个 Container 组成一个 Service, Service 就可以对外提供服务,但是 Service 还要一个生存的环境,必须要有人能够给她生命、掌握其生死大权,那就非 Server 莫属了。所以整个 Tomcat 的生命周期由 Server 控制。

    

组件的生命线

         组件要被控制,需要实现LifeStyle接口,该接口定义了start end 和 监听机制(在启动和停止时进行一些处理,类似于struts的Interceptor)

         组件被父组件管理,根组件是Server

Connector 组件

作用

    接收浏览器发来的tcp链接

    根据链接,创建request和response对象

    创建线程,并将request和response赋值给线程

container进行线程的处理

序列图

 

    

    HttpConnector初始化后,创建一定大小的线程池,使用socket机制接收远程请求,当请求进来后,生成线程HttpProcessor。HttpProcessor创建并初始化request和response,并调用container完成处理

    tomcat5 默认的connector是 coyote。

Container组件

Container是容器的父接口,使用责任链模式,有四个字容器Engine  Host  Context  Wrapper。 ,Engine 包含 Host, Host 包含 Context,Context 包含Wrapper。通常一个 Servlet class 对应一个Wrapper , Context对应一个web工程.。

Engine

         标准实现是StandardEngine,其没有父容器

Host

          代表一个虚拟主机,作用是运行多个web程序;保存主机信息。接口的标准实现是StandardEngine

Context

         代表servlet的context,作用是管理它里面的 Servlet 实例,Servlet 实例在 Context 中是以 Wrapper 出现的。

Wrapper

         代表一个 Servlet,它负责管理一个 Servlet,包括的 Servlet 的装载、初始化、执行以及资源回收。Wrapper 的实现类是 StandardWrapper,StandardWrapper 还实现了拥有一个 Servlet 初始化信息的 ServletConfig,由此看出 StandardWrapper 将直接和 Servlet 的各种信息打交。

          wrapper基本上描述了对 Servlet的操作,当装载了 Servlet 后就会调用 Servlet 的 init 方法,同时会传一个 StandardWrapperFacade 对象给 Servlet,这个对象包装了 StandardWrapper

         当Servlet被初始化完成后,就等着 StandardWrapperValve 去调用它的 service 方法了,调用 service 方法之前要调用 Servlet 所有的 filter。

 

时序图

    

 

Pipeline 和 Valve

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

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

         Tomcat 会挨个执行这些 Valve,而且四个组件都有自己的一套 Valve集合, 在server.xml 和context.xml 中可以定义Valve,如FastCommonAccessLogValve 完成access_log的保存。 容器使用各自的StandardXXValve将请求传递到 wrapper中。   

其它组件

         Tomcat还有其它重要的组件,如安全组件 security、logger 日志组件、session、mbeans、naming 等其它组件。这些组件共同为 Connector 和 Container 提供必要的服务

原创粉丝点击