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

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

Tomcat架構圖

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

從這張圖中,咱們能夠看出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,能夠實現經過不一樣的端口號來訪問同一臺機器上部署的不一樣應用。app

其實,咱們能夠關注如下Tomcat中conf/web.xml的配置:源碼分析

下面,咱們來着重看一下鏈接器connector和容器container的內容.net

鏈接器Connector

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

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

  • 監聽網絡端口。
  • 接受網絡鏈接請求。
  • 讀取請求網絡字節流。
  • 根據具體應用層協議(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 (歡迎溝通交流)
相關文章
相關標籤/搜索