tomcat源码分析(一)从tomcat架构说起
首先dowload源码并导入到Eclipse中,导入后代码代码的层次如下图所示。先简单来看下tomcat源码的结构。javax这个包主要是有关JavaEE规范的,比如Servlet等等,并不是我们主要分析的。需要分析有org.apache下的子包,其中catalina中很重要,其中tomcat的启动就在该包下中的startup包下,
catalina下还定义了tomcat容器(server,service,engine,host,context)的接口。其中对接口的实现也在该包下,org.apache.catalina.core下。包括tomcat管道机制,各个wraper的实现也在这个包下,因此这也是tomcat最为核心东一个包。
我们再来看下connector,见名知意,这个包是负责处理请求的,最终请求会进入到这个包下的CoyoteAdapter中service方法来处理。
我们继续来说下coyote这个包,这个包偏底层一些,其会对socket传输来的数据进行包装,然后再转给实现来Adapter接口的类,其中具体实现也是由catalina下的CoyoteAdapter来实现,这个包下主要是对TCP/IP传输来东数据进行处理,其由两种实现方式,一种是采用ajp协议,另外一种则是采用http协议,简单来说,这个包就是把TCP/IP(通过Socket)层传输来的对象进行包装,包装为ajp或者http的对象,然后转发到catalina下的connector中进行处理。
接下来我们简单对tomcat这个包做下分析,其中核心在于util包下,其中threads包下是tomcat对线程池做了自己的扩展(在Executor框架基础上)。其中最核心的地方在于net包下,这个包是真正来出来网络的,即请求过来会首先来到这个包下(注意:现在还是处于TCP/IP层面上并没有到来http层面),其中JIOEndpoint也是由我们核心去分析的,该类是实际处理Socket请求,其中如何接受请求并将请求转到工作线程去处理都是在这个包下来实现。
说完了tomcat的代码package组织,我们继续来看看Tomcat的架构图,下图是我从网上搜到的一幅架构图,基本能完整的说明其架构。
我们开始详细来说明一下Tomcat的各个结构。在这张架构图中我们看到了tomcat的容器机构,其最大的容器为server,server下包含1至N个service容器,service容器下又包含1至N个Engine容器,Engine容器下则包含1至N个Host容器(Host即对应我们的域名),同样,Host容器则包含1至N个Context容器(Context也就是我们通常的JavaWeb应用)。在实际生成环境中,我们通常只会有一个Server容器,一个Service容器,一个Engine容器,但经常会有多个Host容器,多个Context容器(往往也是一个Host下只有一个Context),尤其是在分布式的环境下,往往是多个Host容器。在这里还要特殊说明一下Connector,Connector是在Service容器之中,tomcat默认会配置两个Connector,一个Connector是负责处理http协议,另一个Connector则是负责处理tomcat自身的一种协议ajp,后续我们会对http协议的Connector作为详细阐述。
凡是用过Tomcat的开发者一定也会对tomcat下conf文件夹中的server.xml文件有一定的了解。其server.xml大致如下。其中server.xml的最大的父节点是server,该server其接口规范是由org.apache.catalina.Server这个接口定义,其具体实现由org.apache.catalina.core.StandardServer实现,在后续的文章中我们会对其进行具体阐述。同理,Engine、Host、Context容器也在org.apache.catalina该包下有其特定的接口规范,其实现都在org.apache.catalina.core这个包下。
下一节我们会对Tomcat的父子容器进行具体的阐述。