­

Tomcat源碼分析二:先看看Tomcat的整體架構

  • 2019 年 10 月 14 日
  • 筆記

Tomcat源碼分析二:先看看Tomcat的整體架構

Tomcat架構圖

我們先來看一張比較經典的Tomcat架構圖:

從這張圖中,我們可以看出Tomcat中含有Server、Service、Connector、Container等組件,接下來我們一起去大致的看看這些組件的作用和他們之間的相互聯繫。在這之前,我們先補充一個知識點,也就是Tomcat它實現的功能點是什麼呢?通過查找一些資料,這裡參考下極客時間《深入拆解Tomcat_Jetty》中的總結,即Tomcat 要實現 2 個核心功能:

  • 處理 Socket 連接,負責網路位元組流與 Request 和 Response 對象的轉化;
  • 載入和管理 Servlet,以及具體處理 Request 請求。

對應到架構圖中,Tomcat 設計了兩個核心組件:連接器(Connector)和容器(Container)來分別做這兩件事情。連接器負責對外交流,也就是處理Socket連接,容器負責內部處理。

各組件介紹

在介紹各組件之前,我們先關注一下下面這張關係圖:

從圖中可以看出,最頂層為Server(圖中未標明),也就是一個Tomcat實例。在一個Server下面可以有很多個Service服務,而每個Service服務又分為連接器和容器,也就是上面架構圖中Connector和Container,其中連接器可以有多個,而容器只有一個,連接器Connector和容器Container之間的交互是通過ServletRequest和ServletResponse通訊的。

Tomcat 內可能有多個 Service,這種設計是出於靈活性的考慮。通過在 Tomcat 中配置多個 Service,可以實現通過不同的埠號來訪問同一台機器上部署的不同應用。

其實,我們可以關注以下Tomcat中conf/web.xml的配置:

下面,我們來著重看一下連接器connector和容器container的內容

連接器Connector

Connector對 Servlet 容器屏蔽了協議類型及 I/O 模型等的區別,無論是 HTTP 還是 AJP,在容器中獲取到的都是一個標準的 ServletRequest 對象。先來看一下Connector的設計結構圖:

引用《深入拆解Tomcat_Jetty》中關於Connector的功能總結,主要有如下功能:

  • 監聽網路埠。
  • 接受網路連接請求。
  • 讀取請求網路位元組流。
  • 根據具體應用層協議(HTTP/AJP)解析位元組流,生成統一的 Tomcat Request 對象。
  • 將 Tomcat Request 對象轉成標準的 ServletRequest。
  • 調用 Servlet 容器,得到 ServletResponse。
  • 將 ServletResponse 轉成 Tomcat Response 對象。
  • 將 Tomcat Response 轉成網路位元組流。
  • 將響應位元組流寫回給瀏覽器。

從上面的結構圖中可以看出,在Connector中使用ProtocolHandler來處理請求,其主要包含3個組件,分別為Endpoint、Processor、Adapter等。我們來看下ProtocolHandler的介面及其子類的類圖:

關於連接器Connector的具體內容將在後期單獨做詳細介紹。

容器Container

Tomcat 設計了 4 種容器,分別是 Engine、Host、Context 和 Wrapper,其屬於父子關係。具體可以參考上文提及的Tomcat中conf/web.xml。其具體的關係可以參考下圖(來源:百度):

這四種容器的應用範圍為:

  • Engine:整個Catalina Servlet引擎;
  • Host:包含一個或多個Context容器的虛擬主機;
  • Context:表示一個Web應用程式,可以包含多個Wrapper;
  • Wrapper:表示一個獨立的Servlet;

關於容器Container的具體內容將在後期單獨做詳細介紹。

本文主要介紹了Tomcat 的大體架構,也大致介紹了Connector和Container的結構,後面將以源碼為基礎,詳細的介紹其中的組件內容及相關的技術實現。

參考資料

  • 《深入拆解Tomcat_Jetty》 極客時間

微信公眾號: 源碼灣

歡迎關注本人微信公眾號: 源碼灣。 本公眾號將不定期進行相關源碼及相關開發技術的分享,共同成長,共同進步~


Blog: