Tomcat系列 - 整体架构
整体架构
我们想要了解一个框架,首先要了解它是干什么的,Tomcat我们都知道,是用于处理连接过来的Socket请求的。那么Tomcat就会有两个功能:
-
- 对外处理连接,将收到的字节流转化为自己想要的Request和Response对象
- 对内处理Servlet,将对应的Request请求分发到相应的Servlet中
那么我们整体的骨架就出来了,Tomcat其实就分为两大部分,一部分是连接器(Connnector)处理对外连接和容器(Container)管理对内的Servelet。
大体的关系图如下:
描述:
最外层的大框就是代表一个Tomcat服务,一个Tomcat服务可以对应多个Service。每个Service都有连接器和容器。
这些对应的关系我们也可以打开在Tomcat目录配置文件中 server.xml
中看出来。
<Server port="8006" shutdown="SHUTDOWN"> <Service name ="Catalina"> <Connector port ="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/> <Connector port="8010" protocol="AJP/1.3" redirectPort="8443"/> <Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> Realm> <Host name="localhost" appBase="webapps">Host> Engine> Service> Server>
这里我们可以看到连接器其实就是 Connector
,一个Service中可以有多个连接器,容器其实对应的就是 Engine
。
Tomcat的整体架构简单来说就是这样的对应关系。接下来我们简单的介绍连接器的整体架构和容器的整体架构。
连接器
我们可以看到上图中连接器传给容器的是 ServletRequest
对象,而容器传给连接器的是 ServletResponse
对象,这些在网络传输过程中是肯定不行的,因为网络传输中传送的字节流。
所以连接器的功能需求我们大概能总结出来以下几点。
-
- Socket连接
- 读取请求网络中的字节流
- 根据相应的协议(Http/AJP)解析字节流,生成统一的
TomcatRequest
t对象 - 将
TomcatReques
传给容器 - 容器返回
TomcatResponse
对象 - 将
TomcatResponse
对象转换为字节流 - 将字节流返回给客户端
其实上面的细分都能总结为以下的三点
-
- 网络通信
- 应用层协议的解析
- Tomcat的
Request/Response
与ServletRequest/ServletResponse
对象的转化
而在Tomcat中它也用了三个类来实现上面的三个功能,分别对应如下
-
- EndPoint
- Processor
- Adapter
用图表示他们的关系的话就是这样