tomcat 源码总结

一、Tomcat的功能
        对于一个web开发者而言,Tomcat 是一个请求处理的第一步,然后再进行我们业务处理。如下图:
       tomcat 源码总结_第1张图片

    从上图可以看出,Tomcat有2大块非常重要的功能:1、HTTP服务器的功能:socket 通信、解析报文。2、servlet 容器的功能。
下面我们具体看下这2部分的功能(本文主要关注coyote、Catalina模块,对于EL、Jasper没做分析)。

二、Tomcat的架构
     Tomcat 为了完成上述的功能,封装了很对的组件,各个组件之间的关系就形成了Tomcat的架构。下面我们首先看下官网提供的一个架构图,根据上面提供的组件我们逐个分析。
 tomcat 源码总结_第2张图片

除了Connetor和Catalina组件外,Tomcat还定义了很多其他的组件来工作,如:server->servcie->connector/Container->engine->host->context->wrapper。这些个组件采用一层套用一层的方式组成了 Tomcat 的架构,这个结构同时也是和serve.xml配置中的标签结构一样的。PS:如果一个组件包含了其他组件,那么也可以把这个组件成为容器。

1、server:

2、service:

3、engine和host:

4、context:

5、wrapper:

三、组件的初始化
        Tomcat的各个组件初始化以及启动都是通过生命周期来控制的,每个组件都直接或者间接的实现了 Lifecycle 接口。这里有个从Tomcat 开源出去的一个解析XML工具 Digster 把我们的server.XML 配置文件中的节点都解析成了相应的对象,如:StandardServer、StandardService等,下面我们看下组件的初始化和启动流程:
tomcat 源码总结_第3张图片

这里的 init 和 start 就是一层调用一层的进行,这里主要记录一下 在Engine 调用 HOST 的时候使用线程池并发进行的,如果我们server.xml 没有对 context 等配置,那么是如果对 host 后面的组件context等进行启动的呢?      
这里有个生命周期监听接口 : LifecycleListener。我们在StandardEngine 的 startInternal 方法中最终是调用了父类ContainerBase的 startInternal 方法。在这个方法的后面有一个状态设置:
setState(LifecycleState.STARTING); 这个通过修改状态触发了监听,最终通过从而完成了context等的启动。即Host 拉起Context 是通过HostConfig 监听实现,同理Context 拿到具体web.xml的servlet 是通过ContextConfig来实现。
如果对Tomcat的类加载机制有兴趣可以了解StandardContext。 

四、请求的处理流程
 对于一个 Tomcat是如果处理一个HTTP请求的,一个流程图可以先看下:
tomcat 源码总结_第4张图片

对于请求的流程关注一下 Poller 线程拿到数据后,然后通过processor和adapter处理成ServletRequest 和 ServletResponse 后交给了容器,然后在根据对应请求URL想找到相应的Host、context、servlet,然后构造一个filterchain,经过一系列filter后,最后执行到service方法。
 

 

你可能感兴趣的:(tomcat)