Tomcat 是如何运行的?整体架构又是怎样的?,java 面试经验技巧
在许多的高端开发的岗位中都会或多或少有要求面试人员要研究过一些常用中间件源码。这是因为一切的秘密都是藏在源码中,阅读源码能够让我们对框架或者中间件的理解更加深刻,而我们也能够在源码的研究中获得其中一些优秀的设计方式。而我们的中间件和源码那么多,我们该从何入手呢?其实大部分的中间件或者框架都有一些共性的部分,例如网络编程、多线程、反射和类加载等技术。所以深入研究透了一两个中间件的话,那么再回过头来看其它的中间件,那么就会很容易理解它里面所用的技术以及原理。而作为一个老牌的 WEB 端框架 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)解析字节流,生成统一的
Tomcat Request
t 对象将
Tomcat Reques
传给容器容器返回
Tomcat Response
对象将
Tomcat Response
对象转换为字节流将字节流返回给客户端
其实上面的细分都能总结为以下的三点
网络通信
应用层协议的解析
Tomcat 的
Request/Response
与ServletRequest/ServletResponse
对象的转化
而在 Tomcat 中它也用了三个类来实现上面的三个功能,分别
对应如下
EndPoint
Processor
Adapter
评论