xiaobaoqiu Blog

Think More, Code Less

Tomcat架构

主要整理Tomcat的整体架构.分析各个主要模块的功能.

1.整体结构

Tomcat基本结构图如下所示:

简单介绍:

1.一个serve包括多个service;
2.一个service包含两个核心部件:一个容器(Container)和多个连接器(Connector),Connector主要负责对外交流,Container主要处理Connector接受的请求,主要是处理内部事务;
3.Tomcat基于JMX(Java Management Extensions,即Java管理扩展,是一个为应用程序、设备、系统等植入管理功能的框架)管理这些组件,另外实现以上接口的组件也实现了代表生存期的接口Lifecycle,使其组件履行固定的生存期,在其整个生存期的过程中通过事件侦听LifecycleEvent实现扩展;

2.核心部件

Tomcat的核心类图如下所示:

其中Container是一个接口,定义一些容器的行为, 比如addChild(),getPipeline()等.每个Container都有一个Pipeline,其中包含一系列的表示请求处理器的Valve,注意Pipeline不是通过server.xml配置产生的,是必须有的,在pipeline上配置不同的valve,当需要调用此容器实现逻辑时,就会按照顺序将此pipeline上的所有valve调用一遍,类似于责任链模式.Engine,Host,Context和Wrapper都是实现了Container这个接口.Container还包含用来处理安全里授权与认证Realm等组件.

Tomcat(Container)的容器分成4个等级,如下:

假设访问的URL是 http://www.mydomain.com/app/index.html 各个容器处理的详细情况如图所示:

Wrapper封装了具体的访问资源,例如 index.html Context 封装了各个wrapper资源的集合,例如 app Host 封装了各个context资源的集合,例如 www.mydomain.com

下面简单介绍一下各个类:

2.1 Bootstrap

Bootstrap简单说就是Tomcat的启动类,它只负责创建Catalina实例并将输入参数传递给Catalina实例;

2.2 Catalina

Catalina是Tomcat实际的入口,执行Tomcat的初始化,启动,停止等关键逻辑; (1).初始化的逻辑中初始化一个解析配置文件的Digester,这个Digester使用SAX方式解析xml文件,它获取解析conf目录下的server.xml这个配置文件并会生成Server等实例;并执行Server的初始化;Server会顺序往后执行Service,Connector,Containner等的初始化. (2).启动逻辑就是调用Server的启动; (3).停止逻辑就是调用Server的停止;

2.3 Server

Server(参考StandardServer类)是整个Tomcat组件的容器,包含一个或多个Service.

1
public void addService(Service service);

2.4 Service

Service(参考StandardService类)是包含Connector和Container的集合,Service用适当的Connector接收用户的请求,再发给相应的Container来处理.

2.5 Connector

Connector是网络socket相关接口模块,默认实现HTTP、AJP等协议的.connector主要作用包括:

(1).接收socket
(2).从socket获取数据包,并解析成HttpServletRequest对象
(3).从engine容器开始走调用流程,经过各层valve,最后调用servlet完成业务逻辑
(4).返回response,关闭socket

connector配置举例为:

1
2
3
<Connector port="80" URIEncoding="UTF-8" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="7443" />

其中protocol的选择包括 (1).BIO实现: org.apache.coyote.http11.Http11Protocol (2).NIO实现 org.apache.coyote.http11.Http11NioProtocol

以Http11Protocol举例解析connector结构:

Http11ConnectionHandler对象维护了一个Http11Processor对象池, 完成http request的解析和分派.

JIoEndpoint维护了两个线程池,Acceptor及Worker Acceptor是接收socket,然后从Worker线程池中找出空闲的线程处理socket,如果worker线程池没有空闲线程,则Acceptor将阻塞;Worker是典型的线程池实现.Worker线程拿到socket后,就从Http11Processor对象池中获取Http11Processor对象;

Mapper维护了一个从Host到Wrapper的各级容器的快照.它主要是为了,当http request被解析后,能够将http request绑定到相应的servlet进行业务处理.

CoyoteAdapter将http request解析成HttpServletRequest对象,之后绑定相应的容器,然后从engine开始逐层调用.

2.6 Engine

Engine(参考StandardEngine类)

2.7 Host

Host(参考StandardHost类)就是我们所理解的虚拟主机.

2.8 Context

Context(参考StandardContext类)就是我们所部属的具体Web应用的上下文,每个请求都在是相应的上下文里处理的.

2.9 Wrapper

Wrapper(参考StandardWrapper类)Wrapper是针对每个Servlet的Container,每个Servlet都有相应的Wrapper来管理.

它封装的处理资源的每个具体的servlet,除了上面提到的Pipeline和Valve之外,还包含我们熟悉的servlet对象.

wrapper主要包括三大类

(1).处理静态资源的一个wrapper:例如html, jpg.对应wrapper为org.apache.catalina.servlets.DefaultServlet
(2).处理jsp文件,对应wrapper为org.apache.jasper.servlet.JspServlet
(3).自定义的servlet对象. 在web.xml中定义的serlvet

2.10 Pipeline和Valve

Pipeline(参考StandardPipeline类),Pipeline就是一串Valve.请求到达当前容器,则从前往后执行每个Valve的逻辑.

Valve实现具体业务逻辑单元.可以定制化valve(实现特定接口),然后配置在server.xml里.对其包含的所有host里的应用有效.定制化的valve是可选的,但是每个容器有一个缺省的valve,例如engine的StandardEngineValve,是在StandardEngine里自带的,它主要实现了对其子host对象的StandardHostValve的调用,以此类推.

缺省的valve的Valve实在Pipeline的最后面.