Tomcat的系统架构与设计模式
本文主要从Tomcat如何分发请求、如何处理多用户同时请求、它的多级容器是如何协调工作的角度分析Tomcat的工作原理。
Tomcat的两个核心组件:Connector & Container。
多个Connector和一个Container就形成了Service,而Service包括整个Tomcat的生命周期由Server控制。
Connector负责接受请求,Container负责处理这些请求,Service主要负责关联两者,同时会初始化它下面的其他组件。所有组件的声明周期在一个Lifecycle的接口中控制。
Server提供一个接口让其他程序能够访问到这个Service集合,同时要维护它包含的所有Service的生命周期,包括如何初始化、如何结束服务、如何找到别人要访问的Service。
Connector组件主要任务是负责接收浏览器发过来的TCP连接请求,创建一个Request和Response对象分别用于和请求端交换数据。然后产生一个线程来处理这个请求并把产生的Request和Response对象传给处理这个请求的线程,处理这个请求的线程就是Container组件要做的事情了。
HttpConnector启动(start方法)后,进入等待请求的状态,直到一个新的请求到来才会激活它继续执行,这个激活是在HttpProcessor的assign方法中。创建HttpProcessor对象时会把available为false,当请求到来时,将请求的Socket赋给当前处理的Socket,并将available设置为true,这样HttpProcessor的run方法将被激活,接下来会处理这次请求。
当Connector将Socket连接封装成Request和Response对象后,接下来的事情就交给Container来处理了。
Container是容器的父接口,所有子容器都必须实现这个接口,Container容器的设计用的是典型的责任链的设计模式。它由四个子容器组件构成,分别是Engine、Host、Context和Wrapper,这四个组件是父子关系,前者包含后者。
通常一个Servlet class 对应一个Wrapper。
Context还可以定义在父容器Host中,Host不是必需的,但是要运行war程序,就必需要用Host,因为war中必有web.xml文件,这个文件的解析就需要Host。如果要有多个Host就要定义一个top容器Engine。而Engine没有父容器了,一个Engine代表一个完整的Servlet引擎。
Engine容器只定义了一些基本的关联关系,标准实现类是StandardEngine。只能添加Host类型的子容器,初始化方法是初始化和它相关联的组件,以及一些事件的监听。
Host是Engine的子容器,一个Host在Engine中代表一个虚拟主机,这个虚拟主机的作用就是运行多个应用,它负责安装和展开这些应用,并且标识这个应用以便能够区分它们。它的子容器通常是Context,它除了关联子容器外,还有就是保存一个主机应该有的信息。
Context代表Servlet的Context,它具备了Servlet运行的基本环境。Context最重要的功能就是管理它里面的Servlet实例,Servlet实例在Context中是以Wrapper出现的。
Context准备Servlet的运行环境是从Start方法开始的,主要作用是设置各种资源属性和管理组件,还有一个非常重要的作用是启动子容器和Pipeline。
注:reloadable设置为true时,war被修改后Tomcat会自动重新加载这个应用。这个功能是在StandardContext的backgroundProcess方法中实现的,其实就是调用reload方法(先调用stop在调用start),完成Context的一次重新加载(这个方法是周期调用的,运行在一个后台线程中)。
Wrapper代表一个Servlet,它负责管理一个Servlet,包括Servlet的装载、初始化、执行及资源回收。Wrapper是最底层的容器了,没有子容器了。
Wrapper的实现类是StandardWrapper,该类还实现了拥有一个Servlet初始化信息的ServletConfig。Servlet可以获得的信息都在StandardWrapperFacade里封装,这些信息又是在StandardWrapper对象中拿到的,所以Servlet可以通过ServletConfig拿到有限的容器的信息。
当Servlet被初始化完成后,就等着StandardWrapperValve去调用它的Service方法了,调用Service方法之前要调用Servlet所有的filter。
安全组件security,日志组件logger,session,mbeans,naming
----------------------------------------------------------------------------------------------------------------------
下篇Servlet工作原理:https://blog.csdn.net/zangdaiyang1991/article/details/85044088
以上时序图来自《深入分析Java Web技术内幕》
参考书籍:
《深入分析Java Web技术内幕》