Tomcat 整体架构分析

1. 整体架构简析#如果将Tomca它的结构高度抽象的话 , 那么Tomcat其实可以看成只是有连接器(Connector)和容器(Container)两个组件构成 。其中Connector组件负责在服务器端处理客户端连接 , 包括接收客户端连接、接收客户端的消息报文以及消息报文的解析等工作 , 而Container组件则负责对客户端的请求进行逻辑处理 , 并把结果返回给客户端 。Container组件其实可以再细分 , 分成Engine组件、Host组件、Context组件和WrApper组件 。

Tomcat 整体架构分析

文章插图
 
从Tomcat服务器配置文件server.xml的内容格式看 , 它所描述的Tomcat也符合上图的层级结构 , 以下便是server.xml简洁的配置节点 , 所以从server.xml文件也能看出Tomcat的大体结构:
<? xml version='1.0' encoding='utf-8'? ><Server><Listener/><GlobalNamingResources><Resource/></GlobalNamingResources><Service><Executor/><Connector/><Engine><Cluster/><Realm/><Host><Context/></Host></Engine></Service></Server>2. Server组件#Server是最顶级的组件 , 它代表Tomcat的运行实例 , 在一个JVM中只会包含一个Server 。在Server的整个生命周期中 , 不同阶段会有不同的事情要完成 。为了方便扩展 , 它引入了监听器方式 , 所以它也包含了Listener组件 。另外 , 为了方便在Tomcat中集成JNDI , 引入了GlobalNamingResources组件 。同时 , 还包含了Service核心组件 。
<? xml version='1.0' encoding='utf-8'? ><Server><!-- 配置一个或多个Listener --><Listener/><!-- 配置JNDI资源 --><GlobalNamingResources><Resource/></GlobalNamingResources><!--配置一个或多个Service--><!--注意一个Tomcat实例中可以配置多个Service , 这些Service通过监听不同的端口来区分--><Service>...</Service></Server>Server组件在Tomcat中的实现类是StandardServer , 除了表示Service的一个对象数组外 , 主要是一些关于Tomcat的属性 , 比如port , address等 。
3. Service组件#Service组件是连接器(Connector)和容器(Container)的组合 。一个Tomcat实例中可以有多个Service组件 , 它们彼此独立 。StandardService是Service组件的实现类 。如果上面的Server组件代表Tomcat服务器实例的话 , 那么Service组件就是这个服务器上面对外提供的一个个具体的服务 。这个服务监听着不同的端口 , 你要访问哪些服务必须指定这些服务对应的端口 。这样一类比的话就和具体的硬件服务器很像 。
public class StandardService extends LifecycleMBeanBase implements Service{private Server server = null;protected Connector connectors[] = new Connector[0];private Engine engine =null;protected final Mapper mapper = new Mapper();}server表示其所属Server , Engine作为处理该service中Connector的容器 。Mapper可以看作是映射器 , 要来处理请求地址到处理该请求的容器及Servlet的映射 。
Tomcat 整体架构分析

文章插图
 
另外 , service组件还有一个Executor组件 , 这个线程池组件可以让多个连接器组件共享 , 而不是每个连接器组件都使用自己的线程池 。
4. Connector组件#
Tomcat 整体架构分析

文章插图
 
表示Tomcat中的连接器 , 其主要作用是监听并转化Socket请求 , 并交由Container处理 。其实就是对不同协议及协议处理器进行的封装 。下面是我们需要关注的几个属性域:
public class Connector extends LifecycleMBeanBase { protected Service service = null;protected final ProtocolHandler protocolHandler;}不同的协议会对应不同的Connector , 目前Tomcat支持HTTP(HTTPS)和AJP两种协议的Connector 。另外同一种协议的内部也会根据网络IO方式的不同分为阻塞IO和非阻塞IO 。下面以HTTP协议为例子简单介绍:
Tomcat 整体架构分析

文章插图