浅谈Tomcat之Tomcat结构

2,367 阅读7分钟

Tomcat的整体结构介绍

Tomcat的整体架构图下:

Aaron Swartz

相关组件的大致介绍如下:

  1. Server组件:Server组件是最顶级的组件,它代表Tomcat的运行实例,在一个JVM中只会包含一个Server。在Server的整个生命周期中,Server组件中的Listener组件实现事件的监听并完成相应的任务,此外Server中包含的GlobalNamingResources组件是为了方便在Tomcat中集成JNDI。除了这两个组件,Server的核心组件就是Service组件
  2. Service组件:Service是服务的抽象,它代表请求从接收到处理的所有组件的集合,一个Server组件可以包含多个Service组件,每一个Service组件都包含了若干的用于接受客户端消息的Connector组件和处理请求的Engine组件以及一些Executor组件。其中不同的Connector组件使用不同的通信协议,如Http协议和AJP协议等。Executor组件是一个线程池,主要是为Service内的所有组件提供任务所需的线程池。

连接器组件

  1. Connector组件:Connector组件的主要职责就是接受客户端的连接并且接受消息报文,消息报文经由Connector的解析之后送往Container组件处理。Tomcat可以处理Http协议和AJP协议等,因此Connector的分类主要由Http和AJP两种协议的Connector组件。Service组件和Connector组件的关系图如下:
    Aaron Swartz
    ,此外,Connector组件中还包含有Mapper组件和CoyoteAdapter组件。 Mapper组件:客户端请求的路由导航组件,通过它能够对一个完整的请求地址进行路由,从而根据请求地址找到对应的Servlet。 CoyoteAdapter组件:一个将Connector和Container适配起来的适配器。

容器组件

Tomcat内部有4个级别的容器,分别是Engine、Host、Context和Wrapper。

Engine组件:

Engine代表全局的Servlet引擎,每一个Service组件只能包含一个Engine容器组件,但是一个Engine组件可以包含多个Host组件,除了Host组件之外,还包含以下的组件。

1. Listener组件:可以在Tomcat生命周期中完成某一些Engine容器相关工作的监听器
2. AccessLog组件:客户端的访问日志,所有客户端访问都会被记录
3. Cluster组件:提供集群功能,可以将Engine容器需要共享的数据同步到集群中的其他班的Tomcat实例上。
4. Pipline组件:Engine容器对请求进行处理的管道
5. Realm组件:提供了Engine容器级别的权限认证的功能。

Host组件:

Tomcat中Host组件代表的是虚拟主机,其中存放着若干的抽象的Web应用。Host组件除了包含Context组件之外还包含以下的组件

1. Listener组件:可以在Tomcat生命周期中完成某一些Host容器相关工作的监听器
2. AccessLog组件:客户端的访问日志,用于记录指定虚拟主机上所有Web应用的访问。
3. Cluster组件:提供集群功能,可以将Host容器需要共享的数据同步到集群中的其他班的Tomcat实例上。
4. Pipline组件:Host容器对请求进行处理的管道
5. Realm组件:提供了Host容器级别的权限认证的功能。

Context组件:

Context组件是Web应用的抽象,其包含了各种静态资源、若干Servlet(Wrapper容器)以及各种其他动态资源。其除了包含主要的Wrapper组件之外还包括以下的组件:

1. Listener组件:可以在Tomcat生命周期中完成某一些Context容器相关工作的监听器
2. AccessLog组件:客户端的访问日志,用于记录对特定Web应用的访问
3. Pipline组件:Context容器对请求进行处理的管道
4. Realm组件:提供了Context容器级别的权限认证的功能。
5. Loader组件:Loader组件是Web应用的加载器,用于加载Web应用的资源并实现在不同Web应用之间资源的隔离
6. Manager组件:会话管理器,用于管理对应Web容器的会话,包括维护会话的生成、更新和销毁。
7. NamingResource组件:进行资源的命名,其负责将Tomcat配置文件的server.xml和Web应用的context.xml资源和属性映射到内存中
8. Mapper组件:Servlet映射器,负责Context容器内部请求的路由导航

Wrapper组件:

一个Wrapper组件对应着一个Servlet,其主要包含以下的组件

1. Servlet组件:Servlet是请求处理的基本单元
2. ServletPool组件:Servlet对象池,用于保证Servlet对象的线程安全。
3. Pipeline组件:Wrapper容器对请求进行处理的管道

小结

总之,Tomcat从功能上可以抽象的看做是由连接器组件(Connector)和容器组件(Container)组成。Connector组件负责在服务器端处理客户端的连接,包括接受客户端的连接、接受客户端的消息,对消息报文进行解析。Container组件负责对客户端的请求进行逻辑处理然后把结果返回给客户端

说说Tomcat的Connector组件

Connector组件主要是完成对请求报文进行解析生成Request对象、对响应报文进行解析生成Response对象。

Connector组件的架构图如下:

Aaron Swartz

其包括的主要组件如下:

Protocol组件:对不同协议(如Http协议、AJP协议等)的处理做了抽象。其包含的Endpoint组件是接收端的抽象,对于不同的I/O模式,Endpoint也存在多种类型的Endpoint,如BIO模式下的JIoEndpoint,NIO模式下的NioEndpoint和本地库I/O模式下的AprEndpoint。Endpoint包含的组件Acceptor是专门用于处理客户端连接的接收器组件,Executor是处理客户端请求的连接池组件。Processor组件是处理客户端请求的处理器。

Protocol组件的类型有:Http11Protocol、Http11NioProtocol、Http11AprProtocol、AjpProtocol、AjpNioProtocol、AjpAprProtocol

Mapper组件:又称请求URI映射器Mapper,提供对客户端请求URL地址的映射功能,Tomcat通过Connector中包含的Mapper组件将请求转发给对应的Host组件、Context组件和Wrapper组件,最终实现Tomcat将客户端的请求路由到处理业务逻辑的Servlet上。Mapper组件又被分成为两类:

  1. Connector中的Mapper负责全局路由。在程序的编写过程中,应用程序与应用程序之间的重定向redirect就是采用的全局Mapper映射。
  2. Context中的Mapper负责局部路由,局部路由Mapper只存在于Context容器中,负责记录访问资源与Wrapper之间的映射。在程序的编写过程中,应用程序内部的转发forward就是采用的局部Mapper映射。

Mapper组件进行路由的时候,首先将3个级别的容器进行树状划分,然后一级一级的寻找到最终的Wrapper组件(Servlet)进行逻辑的处理。

CoyoteAdapter组件:作为Connector组件和Engine容器之间的适配器。

一个Service组件实例可以包含多个Connector实例(端口都是不同的),一个Connector实例处理一个端口上的请求。

说说Tomcat的Container组件

Tomcat的第二大核心组件就是Container(容器)组件,Tomcat中主要由四个级别的容器组件。

  1. Engine容器:为全局引擎容器,其标准实现为StandardEngine。Engine是一个全局Servlet容器,一个Engine容器可以包含多个Host容器。
  2. Host容器:Host组件是Engine容器的子组件,它代表一个虚拟主机,其标准实现为StandardHost。一个Host容器可以包含多个Context容器。
  3. Context容器:一个Context组件对应一个Web应用程序,Context容器可以实现将Web项目中包含的组件转化成容器中的组件。
  4. Wrapper容器:一个Wrapper组件对应一个Servlet对象或者一个Servlet对象池。Wrapper组件用于处理请求的具体逻辑,