说说 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。
接收浏览器发来的tcp链接
根据链接,创建request和response对象
创建线程,并将request和response赋值给线程
container进行线程的处理
HttpConnector初始化后,创建一定大小的线程池,使用socket机制接收远程请求,当请求进来后,生成线程HttpProcessor。HttpProcessor创建并初始化request和response,并调用container完成处理
tomcat5 默认的connector是 coyote。
Container是容器的父接口,使用责任链模式,有四个字容器Engine Host Context Wrapper。 ,Engine 包含 Host, Host 包含 Context,Context 包含Wrapper。通常一个 Servlet class 对应一个Wrapper , Context对应一个web工程.。
标准实现是StandardEngine,其没有父容器
代表一个虚拟主机,作用是运行多个web程序;保存主机信息。接口的标准实现是StandardEngine
代表servlet的context,作用是管理它里面的 Servlet 实例,Servlet 实例在 Context 中是以 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 就是连接每个子容器 的管子,里面传递的 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 提供必要的服务