在分析Tomcat的源码之前,准备先看一下Tomcat的架构与一些核心类的简单分析,并简单介绍一下Tomcat是如何处理一次Http请求的。这部分内容有相当一部分来源于网络,在此,感谢原作者的贡献。
- Tomcat的总体架构
Tomcat的架构关系可以从Tomcat的配置文件server.xml中看到端倪。
从上图中可以看出Tomcat 的心脏是两个组件:Connector 和 Container,关于这两个组件将在后面详细介绍。Connector 组件是可以被替换,这样可以提供给服务器设计者更多的选择,因为这个组件是如此重要,不仅跟服务器的设计的本身,而且和不同的应用场景也十分相关,所以一个 Container 可以选择对应多个 Connector。多个 Connector 和一个 Container 就形成了一个 Service,Service 的概念大家都很熟悉了,有了 Service 就可以对外提供服务了,但是 Service 还要一个生存的环境,必须要有人能够给她生命、掌握其生死大权,那就非 Server 莫属了。所以整个 Tomcat 的生命周期由 Server 控制。
Connector又叫连接器,它的主要任务是接收浏览器发过来的Tcp连接请求(说白了就是上一章讲的Socket请求),根据请求行,请求头,请求正文信息创建一个Request和Response(这个Request和Response我想大家都再熟悉不过了,虽然他还不是真正的HttpServletRequest与HttpServletResponse,但确实是有关的,姑且现在就当它是。这部分内容在后面的章节后讲到)。然后会产生一个线程来处理这个请求并把产生的 Request 和 Response 对象传给处理这个请求的线程,处理这个请求的线程就是 Container 组件要做的事了。
在一个Service中,Connector可以有多个,每一个Connector对应了一种不同的处理协议,在Tomcat中默认支持的是Http与AJP协议,所以Tomcat中实现了HttpConnector与AjpConnector。但是Container只有一个。Connector与Container是多对一的关系。如下: