1. 程式人生 > >Tomcat原始碼分析二:先看看Tomcat的整體架構

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

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:

  • 簡書: https://www.jianshu.com/u/91378a397ffe
  • csdn: https://blog.csdn.net/ZhiyouWu
  • 開源中國: https://my.oschina.net/u/3204088
  • 掘金: https://juejin.im/user/5b5979efe51d451949094265
  • 部落格園: https://www.cnblogs.com/zhiyouwu/
  • 微信公眾號: 原始碼灣
  • 微信: WZY1782357529 (歡迎溝通交流)