Tomcat总体架构:连接器与容器

连接器与容器

Tomcat其实总得来说就分成两个部分:

  • 连接器:用来接受请求,并将请求转化为Request对象
  • 容器:接收连接器传来的request对象,并调用相关的Servlet进行处理

其实就是这两个,一个负责对外,一个负责对内

连接器

连接器中有三个核心组件:EndPoint,Processor,Adapter

EndPoint

EndPoint负责进行IO操作(NI0,NIO2或者叫AIO),它就主要负责接受请求传来的信息,比如说如果是HTTP请求,就会传来一个HTTP报文段嘛。那么就是在EndPoint里进行接受

Processor

Processor就负责将接受到的数据转化为对应的TomcatRequest。在这个组件里面就实现不同的协议,比如说像HTTP1.1还有AJP协议,会使用不同的转换方法,转化成的TomcatRequest,它并不符合Servlet规范,所以它还需要传给下一个组件

Adapter

在这里就负责将Processor生成的TomcatRequest转换为符合Servlet规范的ServletRequest,然后再作为参数传给容器。

那么连接器整体的一个大致逻辑就是这么简单。
ps:其实EndPoint和Processor是属于一个叫做ProctocalHandler组件的两个部分,但是这个按照逻辑进行划分
Tomcat总体架构:连接器与容器

容器

容器这里就是真正根据Request去调用Servlet的地方。其实它有一个Mapper组件,通过Mapper组件来完成URL对Servlet的映射。简单来说是这样,但是实际上,这个过程涉及到多个层面的映射。比如说,一个Tomcat可以有多个虚拟结点Host(或者说叫不同的域名),一个Tomcat可以部署多个Web应用(Context),还有就是一个Web应用里面有多个Servlet,这其实涉及多次映射。那在容器里面,其实是通过一个责任链模式来完成这个层层的映射,最终到达目的Servlet上的。

Tomcat总体架构:连接器与容器

Q1:Tomcat的Catalina类是干什么的?
A:Catalina类其实就是Tomcat里面的一个类似于创造者的角色。它就负责解析server.xml的配置文件,并且对结点进行逐个创建。因为Tomcat里面实际上有很多个结点。比如说一个Tomcat可以有多个虚拟站点(或者说是域名),一个虚拟站点是一个Host结点。然后一个Tomcat里面还可以部署多个Web应用嘛,那一个Web应用就是一个Context结点,web应用里面还有多个Serlet,每个Servlet都是一个Wrapper结点。所以Catalina实际上就是去创建这些东西。
另外,Catalina还与Tomcat的关闭有关。它还会创建一个socket来监听8005端口,并且会一直循环地监听,如果收到一个SHUTDOWN信号,那么它就会通知JVM进行一些必要的操作,比如说脏数据的刷新,还有内存的回收这些事情