Tomcat 架构分析

Tomcat的源码其实不必要细致的看,大概看看就可以了。了解运行原理即可。主要弄清楚tomcat的keepalive,请求体处理,分块传输和contentlength,相应请求的大概流程,nio和自定义类加载器。这些可以在网上找到很多资源。这些细致的回头可以在来聊,现在主要是大局观下聊聊tomcat整体设计的思路和大体处理请求的流程。

下面是Tomcat的一个大体设计类图

Tomcat 架构分析

1、Server:接受请求并解析,完成相关任务,返回处理结果。通常情况下使用Socket监听服务器指定端口来实现该功能 

1)Start():启动服务器,打开socket连接,监听服务端口,接受客户端请求、处理、返回响应

2)Stop():关闭服务器,释放资源

一个Server包含多个Connector(链接器)和Container(容器)这样就把服务分成了接收和处理2大块。网络协议与请求处理分离

2、Connector:开启Socket并监听客户端请求,返回响应数据;

3、Container:负责具体的请求处理

一个Server可以包含多个Service,每一个Service都是独立的,他们共享一个JVM以及系统类库。

4、一个Service负责维护多个Connector和一个Container,这样来自Connector的请求只能有它所属的Service维护的Container处理。

在这里Container是一个通用的概念,可以理解成为一个容器。

5、Engine:引擎,容器中需要支持管理WEB应用,当接收到Connector的处理请求时,Engine容器能够找到一个合适的Web应用来处理

在tomcat中的server.xml中可以配置Engine和Host、Context、Wrapper。关系自上而下一对多。责任链设计模式。

通过server.xml可以看出来,一个Server可以配置多个Service,一个Service可以有多个Connector,但是只有一个Engine。一个Engine可以有多个Host。一个Host可以有多个Context,一个Context可以有多个Wrapper

Tomcat 架构分析

6、Host : 主机,主机里可以提供很多域名,每个域名可以对于多个web应用,如下图所示,一个host可以管理多个域名,每个域名可以对于多个web应用。而一个Engine下面可以配置多个Host

 Tomcat 架构分析

7、Context来表示一个WEB应用

8、Wrapper: 每个Context中可以包含多个servlet,这里用Wrapper包装类来代表Servlet。 

Engine、Host、Context、Wrapper 都代表一个容器 都是Container的子类,Container中有个backgroundProcessor 方法,这个方法每个30s就会扫描一下Host里面是否有部署的应用。

9、Connector : 连接器。 1)用来监听socket服务,读取请求消息;

                                             2)按照协议解析请求; tomcat支持http和ajp协议,IO方式有:BIO(8.0之前),NIO,NIO2,                                                          APR

                                             3)配置对应的容器来处理请求;

                                             4)通过socket返回响应

10、ProcessHandler : 处理器控制器

11、EndPoint : 接收请求,监听服务端口,接收到请求后通过ProcessorHandler去找到具体的Processor处理。

12、Processor:  处理器,读取发送来的数据,这个处理器需要根据请求去映射到指定的Container执行。这是需要一个适配器,能够识别请求对于的容器(Container)。

13、CoyoteAdapter 适配器。适配器映射就需要一个映射关系,这样就设计出了一个Mapper来维护映射关系。找到了映射,去相应容器去处理请求。 包括2种操作:寻找映射,给指定容器去处理请求。 适配器设计模式

14、Mapper:映射关系。

15、MapperListener:Mapper的监听器,用来监听Service,有新的应用发布到service的时候就会更新Mapper中的数据。将其注册进来。这样适配器就可以查找到了。

 

16、LifeCycle : 生命周期 ,里面有个方法addLifeCycleListener,用来监听每个组件的生命周期。当一个组件移除了,用removeLifeCycleListener用来移除生命周期。Connector、server、service、Container都有生命周期。

17、Executor:线程池,可以让tomcat支持并发请求,多线程去处理请求,所有的容器都共享一个线程池。

18、BootStrap:入口,用来启动Catalina

19、Catalina: 可以理解成就是Server。 

最后在给出一个简化的流程图:这里面的Pipeline就是数据的传输用的管道。FilterChain就是过滤器,一般编程序的时候整体过滤一个请求的时候都会用到。

Tomcat 架构分析

tomcat 处理socket的步骤主要分为几点 :

1、接收到socket,建立socket就不说了,一个socket连接如果没有close就一直复用,可以建立多个socket

2、将socket交给线程池

3、一个线程处理一个socket连接

4、开始从socket中获取数据

5、解析请求行

6、解析请求头

7、根据请求头解析Connection对应的值是keepalive还是close

8、请求行和请求头解析后会设置到Request对象中

9、将Request对象交给容器进行处理

10、容器最终会交给对应的servlet进行处理

11、servlet中可以获取请求的各种信息,包括获取请求体

12、servlet中可以使用response对象向客户端返回响应

13、servlet中的代码都执行完成后,相当于容器中已经处理完了请求,相当于请求的核心逻辑已经执行完毕了

14、处理InputBuffer中的pos和lastValid,以便能够处理下一个请求