tomcat 源碼總結

一、Tomcat的功能
        對於一個web開發者而言,Tomcat 是一個請求處理的第一步,然後再進行我們業務處理。如下圖:
       

    從上圖可以看出,Tomcat有2大塊非常重要的功能:1、HTTP服務器的功能:socket 通信、解析報文。2、servlet 容器的功能。
下面我們具體看下這2部分的功能(本文主要關注coyote、Catalina模塊,對於EL、Jasper沒做分析)。

二、Tomcat的架構
     Tomcat 爲了完成上述的功能,封裝了很對的組件,各個組件之間的關係就形成了Tomcat的架構。下面我們首先看下官網提供的一個架構圖,根據上面提供的組件我們逐個分析。
 

除了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等,下面我們看下組件的初始化和啓動流程:

這裏的 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請求的,一個流程圖可以先看下:

對於請求的流程關注一下 Poller 線程拿到數據後,然後通過processor和adapter處理成ServletRequest 和 ServletResponse 後交給了容器,然後在根據對應請求URL想找到相應的Host、context、servlet,然後構造一個filterchain,經過一系列filter後,最後執行到service方法。
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章