Tomcat 學習進階歷程之Tomcat架構與核心類分析

weixin_34336292發表於2017-05-04
前面的http及socket兩部分內容。主要是為了後面看Tomcat原始碼而學習的一些網路基礎。從這章開始,就開始實際深入到Tomcat的‘內在’去看一看。


在分析Tomcat的原始碼之前,準備先看一下Tomcat的架構與一些核心類的簡單分析,並簡介一下Tomcat是怎樣處理一次Http請求的。這部分內容有相當一部分來源於網路,在此。感謝原作者的貢獻。

  1. Tomcat的整體架構


Tomcat的架構關係能夠從Tomcat的配置檔案server.xml中看到端倪。

從上圖中能夠看出Tomcat 的心臟是兩個元件:Connector 和 Container,關於這兩個元件將在後面具體介紹。Connector 元件是能夠被替換,這樣能夠提供給server設計者很多其它的選擇。由於這個元件是如此重要,不僅跟server的設計的本身,並且和不同的應用場景也十分相關,所以一個 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是多對一的關係。例如以下:


說白了。Service 僅僅是在 Connector 和 Container 外面多包一層,把它們組裝在一起,向外面提供服務,一個 Service 能夠設定多個 Connector。可是僅僅能有一個 Container 容器。

2.  Tomcat處理一次請求的過程


上面的圖形簡單描繪了Tomcat解析一次請求的大致過程。圖中僅僅簡單描繪了Tomcat處理的幾個重要節點,裡面包含對的非常多其它元件,比方:processor。Engine,Host。Context等都沒有描繪出來,這些細節在後面的章節一邊學習一面總結。

在Container接收到Request後,依據Request中請求的URL,解析出要請求的Servlet,依據配置檔案(一般為應用中web.xml中的Servlet或其它可訪問資源)獲得起路徑後,使用對應的類載入器載入Servlet,然後呼叫其Service方法。餘下的就是客戶自己編寫的Servlet進行工作了。


3、Tomcat核心類


Tomcat程式碼看似非常龐大,但從結構上看卻非常清晰和簡單,它主要由一堆元件組成,如Server、Service、Connector等。並基於JMX管理這些元件。另外實現以上介面的元件也實現了代表生存期的介面Lifecycle,使其元件履行固定的生存期,在其整個生存期的過程中通過事件偵聽LifecycleEvent實現擴充套件。

Catalina:與開始/關閉shell指令碼互動的主類,因此假設要研究啟動和關閉的過程,就從這個類開始看起。

Server:是整個Tomcat元件的容器,包括一個或多個Service

ServiceService是包括ConnectorContainer的集合。Service用適當的Connector接收使用者的請求。再發給對應的Container來處理。

Connector:實現某一協議的聯結器。如預設的有實現HTTPHTTPSAJP協議的。

Container:能夠理解為處理某型別請求的容器,處理的方式一般為把處理請求的處理器包裝為Valve物件,並按一定順序放入型別為Pipeline的管道里。Container有多種子型別:EngineHostContextWrapper,這幾種子型別Container依次包括,處理不同粒度的請求。

另外Container裡包括一些基礎服務。如LoaderManagerRealm

EngineEngine包括HostContext。接到請求後仍給對應的Host在對應的Context裡處理。

Host:就是我們所理解的虛擬主機。

Context:就是我們所部屬的詳細Web應用的上下文,每一個請求都在是對應的上下文裡處理的。

WrapperWrapper是針對每一個ServletContainer。每一個Servlet都有對應的Wrapper來管理。

能夠看出ServerServiceConnectorContainerEngineHostContextWrapper這些核心元件的作用範圍是逐層遞減,並逐層包括。

參考:

Tomcat 系統架構與設計模式。第 1 部分: 工作原理

CSDN cutesource部落格 Tomcat原始碼分析

上一篇:Tomcat 學習進階歷程之Socket

下一篇:Tomcat 學習進階歷程之Tomcat啟動過程分析

相關文章