Tomcat详解

Tomcat系统架构如下图:

Tomcat有两个核心组件:Connector和Container,Connector组件可以被替换掉,它不仅跟服务器本身的设计有关,而且和不同的应用场景也十分相关。一个Container可以选择对应多个Connector。多个Connector和一个Container就形成了一个Service,Service对外提供服务。同时Server来管理Service的生命周期等。

Service:

Service主要的作用是连接Connector和Container,把它们组装在一起向外提供服务。一个Service只能包含一个Container,但是可以有多个Connector。

Service接口中定义了关联Connector和Container,同时初始化它下面的其他组件的方法。但在接口中并没有规定一定要控制它下面的组件的生命周期。所有组件的生命周期在一个Lifecycle的接口中并控制。这里用到了观察者模式。

lifecycleListener代表的是抽象观察者,它定义了一个lifecycleEvent方法,这个方法就是当主题变化时要执行的方法。ServerLifecycleListener代表的是具体的观察者,他实现了LifecycleListener借口的方法,就是这个具体的观察者具体的实现方式。Lifecycle接口代表的是抽象主题,它定义了管理观察者的方法和它要做的其它方法。而StandardServer代表的是具体主题,他实现了抽象主题的所有方法。

Server:

server提供一个接口让其他程序能够访问到这个Service集合,同时要维护它所包含的所有Service的生命周期,包括如何初始化、如何结束服务、如何找到别人要访问的Service。

Connect组件:

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

Container组件:

Container是容器的父接口,所有子容器都必须实现这个接口,Container容器采用的是典型的责任链的设计模式,它由4个子容器组件构成,分别是Engine、Host、Content和Wrapper,这4个组件不是平行的,而是父子关系,Engine包含Host,Host包含Context,Context包含Wrapper。通常一个Servlet class对应一个Wrapper,如果有多个Servlet,则可以定义多个Wrapper。

在责任链中Pipeline和Valve扩展了这个链的功能,使得在链向下传递的过程中,能够接收外界的干预,也就是对里面的Request和Response对象传递做干预:

Container的总体设计:

Context还可以定义在父容器Host中,Host不是必须的,但是要运行war程序,就必须要用Host,因为在war中必有web.xml文件,这个文件的解析就需要Host。一个Engine代表一个完整的Servlet引擎。

Engine容器:

Engine容器比较简单,他只定义了一些基本的关联关系,他没有父类容器。

Host容器:

Host是Engine的子容器,一个Host在Engine中代表一个虚拟主机,这个虚拟主机的作用就是运行多个应用,并且标识这个应用以便能够区分它们。它的子容器通常是Context,他除了关联子容器外,还保存一个主机应有的信息。

Context容器:

Context代表Servlet的Context,它具备了Servlet运行的基本环境,理论上只要有Context就能运行Servlet了。Context最重要的功能就是管理它里面的Servlet实例,Servlet实例在Context中是以Wrapper出现的。还有一点就是Context如何才能找到正确的Servlet来执行它,这个功能是通过Request来分配的。

Wrapper容器:

Wrapper代表一个Servlet,他负责管理一个Servlet,包括Servlet的装载,初始化、执行及资源回收。Wrapper是最底层的容器,它没有子容器了。

Wrapper的实现类是StandardWrapper,StandardWrapper还实现了拥有一个Servlet初始化信息的ServletConfig,由此看出StandardWrapper将直接和Servlet的各种信息打交道

推荐阅读更多精彩内容