天天看點

Tomcat——Tomcat系統架構與原理分析

一、簡介

Tomcat伺服器是一個免費的開放源碼的Web應用伺服器,目前是應用比較廣泛的。

從Tomcat的7.0版本開始支援Servlet3.0規範規範,可以支援我們開發過程中不再配置web.xml。

浏覽器通路伺服器的流程

浏覽器通路伺服器使用的是http協定,http是應用層協定,用于定義資料通信的格式,具體的資料傳輸使用的是TCP/IP協定。

Tomcat——Tomcat系統架構與原理分析
  • 1、使用者向浏覽器發起http請求。
  • 2、浏覽器接收到使用者請求,向伺服器發起TCP連接配接請求。
  • 3、伺服器接收到浏覽器請求,并建立TCP連接配接。
  • 4、浏覽器生成HTTP資料包,向伺服器發送資料包。
  • 5、伺服器收到浏覽器發送過來的資料包必能解析,執行請求對應的具體邏輯,将傳回資料組裝成http格式包并傳回。
  • 6、浏覽器接收到伺服器傳回的http的資料包,解析http資料包,通過浏覽器将相應靜态資源呈現給使用者。
Tomcat——Tomcat系統架構與原理分析
Tomcat——Tomcat系統架構與原理分析
  • 1、使用者通過浏覽器進行了一個操作,比如輸入網址并回車,或者是點選連結,接着浏覽 器擷取了這個事件。
  • 2、浏覽器向服務端發出TCP連接配接請求。
  • 3、服務程式接受浏覽器的連接配接請求,并經過TCP三向交握建立連接配接。
  • 4、浏覽器将請求資料打包成一個HTTP協定格式的資料包。
  • 5、浏覽器将該資料包推入網絡,資料包經過網絡傳輸,最終達到端服務程式。
  • 6、服務端程式拿到這個資料包後,同樣以HTTP協定格式解包,擷取到用戶端的意圖。
  • 7、得知用戶端意圖後進行處理,比如提供靜态檔案或者調用服務端程式獲得動态結果。
  • 8、伺服器将響應結果(可能是HTML或者圖檔等)按照HTTP協定格式打包。
  • 9、伺服器将響應資料包推入網絡,資料包經過網絡傳輸最終達到到浏覽器。
  • 10、浏覽器拿到資料包後,以HTTP協定的格式解包,然後解析資料,假設這裡的資料是 HTML。
  • 11、浏覽器将HTML檔案展示在頁面上。

那我們想要探究的Tomcat作為一個HTTP伺服器,主要是接受連接配接、解析請求資料、處理請求和發送響應這幾個步驟。

Http伺服器請求處理

浏覽器發給服務端的是一個HTTP格式的請求,HTTP伺服器收到這個請求後,需要調用服務端程式來處理,所謂的服務端程式就是寫的Java類,一般來說不同的請求需要由不同 的Java類來處理。

HTTP伺服器不直接調用業務類,而是把請求交給容器來處理,容器通過Servlet接口調用業務類。是以Servlet接口和Servlet容器的出現,達到了HTTP伺服器與 業務類解耦的目的。而Servlet接口和Servlet容器這一整套規範叫作Servlet規範。 Tomcat按照Servlet規範的要求實作了Servlet容器,同時它們也具有HTTP伺服器的功能。作為Java程式員,如果我們要實作新的業務功能,隻需要實作一個Servlet,并把它注冊到Tomcat(Servlet容器)中,剩下的事情就由Tomcat幫我們處理了。

Tomcat——Tomcat系統架構與原理分析

Servlet容器工作流程

為了解耦,HTTP伺服器不直接調用Servlet,而是把請求交給Servlet容器來處理。當客戶請求某個資源時,HTTP伺服器會用一個ServletRequest對象把客戶的請求資訊封 裝起來,然後調用Servlet容器的service方法,Servlet容器拿到請求後,根據請求的URL 和Servlet的映射關系,找到相應的Servlet,如果Servlet還沒有被加載,就用反射機制創 建這個Servlet,并調用Servlet的init方法來完成初始化,接着調用Servlet的service方法 來處理請求,把ServletResponse對象傳回給HTTP伺服器,HTTP伺服器會把響應發送給 用戶端。

Tomcat——Tomcat系統架構與原理分析
Tomcat——Tomcat系統架構與原理分析

二、Tomcat整體架構

我們知道如果要設計一個系統,首先是要了解需求,我們已經了解了Tomcat要實作兩個核心功能:

  • 1、處理Socket連接配接,負責網絡位元組流與Request和Response對象的轉化。
  • 2、加載和管理Servlet,以及具體處理Request請求。

是以Tomcat設計了兩個核心元件連接配接器(Connector)和容器(Container)來分别做這兩件事情。連接配接器負責對外交流,容器負責内部處理。

Tomcat——Tomcat系統架構與原理分析

2.1、Tomcat連接配接器元件Coyote

2.1.1、連接配接器 - Coyote

Coyote 是Tomcat的連接配接器架構的名稱 , 是Tomcat伺服器提供的供用戶端通路的外部接口。用戶端通過Coyote與伺服器建立連接配接、發送請求并接受響應 。

  • 1、Coyote 封裝了底層的網絡通信(Socket 請求及響應處理),為Catalina 容器提供了統一 的接口,使Catalina 容器與具體的請求協定及IO操作方式完全解耦。
  • 2、Coyote 将Socket 輸 入轉換封裝為 Request 對象,交由Catalina 容器進行處理,處理請求完成後,Catalina 通 過Coyote 提供的Response 對象将結果寫入輸出流 。
  • 3、Coyote 作為獨立的子產品,隻負責具體協定和IO的相關操作,與Servlet 規範實作沒有直接關系,是以即便是Request 和 Response 對象也并未實作Servlet規範對應的接口,而是在Catalina中将他們進一步封裝為ServletRequest和ServletResponse 。
Tomcat——Tomcat系統架構與原理分析

2.1.2、IO模型與協定

在Coyote中,Tomcat支援的多種I/O模型和應用層協定,具體包含哪些IO模型和應用層協定,請看下表:

Tomcat 支援的IO模型(自8.5/9.0 版本起,Tomcat 移除了 對 BIO 的支援):

IO模型 描述
NIO 非阻塞I/O,采用Java NIO類庫實作。
NIO2 異步I/O,采用JDK 7最新的NIO2類庫實作。
APR 采用Apache可移植運作庫實作,是C/C++編寫的本地庫。如果選擇該方 案,需要單獨安裝APR庫。

Tomcat 支援的應用層協定 :

應用層協定 描述
HTTP/1.1 這是大部分Web應用采用的通路協定。
AJP 用于和Web伺服器內建(如Apache),以實作對靜态資源的優化以及 叢集部署,目前支援AJP/1.3。
HTTP/2 HTTP 2.0大幅度的提升了Web性能。下一代HTTP協定 , 自8.5以及9.0 版本之後支援。

協定分層 :

Tomcat——Tomcat系統架構與原理分析

在 8.0 之前 , Tomcat 預設采用的I/O方式為 BIO , 之後改為 NIO。 無論 NIO、NIO2 還是 APR, 在性能方面均優于以往的BIO。 如果采用APR, 甚至可以達到 Apache HTTP Server 的影響性能。

Tomcat為了實作支援多種I/O模型和應用層協定,一個容器可能對接多個連接配接器,就好比一個房間有多個門。但是單獨的連接配接器或者容器都不能對外提供服務,需要把它們組裝起來才能工作,組裝後這個整體叫作Service元件。這裡請你注意,Service本身沒有做什麼重要的事情,隻是在連接配接器和容器外面多包了一層,把它們組裝在一起。Tomcat内可能有多個Service,這樣的設計也是出于靈活性的考慮。通過在Tomcat中配置多個Service,可以實作通過不同的端口号來通路同一台機器上部署的不同應用。

2.1.3、 連接配接器元件

Tomcat——Tomcat系統架構與原理分析

連接配接器中的各個元件的作用如下:

EndPoint
  • 1、EndPoint : Coyote 通信端點,即通信監聽的接口,是具體Socket接收和發送處理 器,是對傳輸層的抽象,是以EndPoint用來實作TCP/IP協定的。
  • 2、Tomcat 并沒有EndPoint 接口,而是提供了一個抽象類AbstractEndpoint , 裡面定 義了兩個内部類:Acceptor和SocketProcessor。Acceptor用于監聽Socket連接配接請求。 SocketProcessor用于處理接收到的Socket請求,它實作Runnable接口,在Run方法裡 調用協定處理元件Processor進行處理。為了提高處理能力,SocketProcessor被送出到 線程池來執行。而這個線程池叫作執行器(Executor),我在後面的專欄會詳細介紹 Tomcat如何擴充原生的Java線程池。
Processor

Processor:Coyote 協定處理接口 ,如果說EndPoint是用來實作TCP/IP協定的,那麼 Processor用來實作HTTP協定,Processor接收來自EndPoint的Socket,讀取位元組流解 析成Tomcat Request和Response對象,并通過Adapter将其送出到容器處理, Processor是對應用層協定的抽象。

ProtocolHandler

ProtocolHandler: Coyote 協定接口, 通過Endpoint 和 Processor , 實作針對具體協 議的處理能力。Tomcat 按照協定和I/O 提供了6個實作類 : AjpNioProtocol , AjpAprProtocol, AjpNio2Protocol , Http11NioProtocol ,Http11Nio2Protocol , Http11AprProtocol。我們在配置tomcat/conf/server.xml 時 , 至少要指定具體的 ProtocolHandler , 當然也可以指定協定名稱 , 如 : HTTP/1.1 ,如果安裝了APR,那麼 将使用Http11AprProtocol , 否則使用 Http11NioProtocol 。

Adapter

由于協定不同,用戶端發過來的請求資訊也不盡相同,Tomcat定義了自己的Request類 來“存放”這些請求資訊。ProtocolHandler接口負責解析請求并生成Tomcat Request類。 但是這個Request對象不是标準的ServletRequest,也就意味着,不能用Tomcat Request作為參數來調用容器。Tomcat設計者的解決方案是引入CoyoteAdapter,這是 擴充卡模式的經典運用,連接配接器調用CoyoteAdapter的Sevice方法,傳入的是Tomcat Request對象,CoyoteAdapter負責将Tomcat Request轉成ServletRequest,再調用容 器的Service方法。

2.3、容器 - Catalina

Tomcat是一個由一系列可配置的元件構成的Web容器,而Catalina是Tomcat的servlet容器。Catalina是Servlet容器實作,包含了之前講到的所有的容器元件,以及後續涉及到 的安全、會話、叢集、管理等Servlet 容器架構的各個方面。它通過松耦合的方式內建 Coyote,以完成按照請求協定進行資料讀寫。同時,它還包括我們的啟動入口、Shell程 序等。

2.3.1、Catalina依賴關系

Tomcat——Tomcat系統架構與原理分析

從另一個角度來說,Tomcat本質上就是一款Servlet容器,因為Catalina才是Tomcat的核心,其他子產品都是為Catalina提供支撐的。比如:通過Coyote子產品提供連接配接通信,Jasper子產品提供JSP引擎,Naming提供JNDI服務,Juli提供日志服務。

2.3.2、Catalina 結構

Catalina 的主要元件結構如下:

Tomcat——Tomcat系統架構與原理分析

如上圖所示,Catalina負責管理Server,而Server表示着整個伺服器。Server下面有多個 服務Service,每個服務都包含着多個連接配接器元件Connector(Coyote 實作)和一個容器 元件Container。在Tomcat 啟動的時候, 會初始化一個Catalina的執行個體。

Catalina 各個元件的職責:

元件 職責
Catalina 負責解析Tomcat的配置檔案 , 以此來建立伺服器Server元件,并根據 指令來對其進行管理
Server 伺服器表示整個Catalina Servlet容器以及其它元件,負責組裝并啟動 Servlet引擎,Tomcat連接配接器。Server通過實作Lifecycle接口,提供了 一種優雅的啟動和關閉整個系統的方式
Service 服務是Server内部的元件,一個Server包含多個Service。它将若幹個 Connector元件綁定到一個Container(Engine)上
Connector 連接配接器,處理與用戶端的通信,它負責接收客戶請求,然後轉給相關 的容器處理,最後向客戶傳回響應結果
Container 容器,負責處理使用者的servlet請求,并傳回對象給web使用者的子產品

2.3.3、 Container結構

Tomcat設計了4種容器,分别是Engine、Host、Context和Wrapper。這4種容器不是平行關系,而是父子關系。, Tomcat通過一種分層的架構,使得Servlet容器具有很好的靈 活性。

Tomcat——Tomcat系統架構與原理分析
Tomcat——Tomcat系統架構與原理分析

各個元件的含義 :

容器 描述
Engine 表示整個Catalina的Servlet引擎,用來管理多個虛拟站點,一個Service 最多隻能有一個Engine,但是一個引擎可包含多個Host
Host 代表一個虛拟主機,或者說一個站點,可以給Tomcat配置多個虛拟主 機位址,而一個虛拟主機下可包含多個Context
Context 表示一個Web應用程式, 一個Web應用可包含多個Wrapper
Wrapper 表示一個Servlet,Wrapper 作為容器中的最底層,不能包含子容器

我們也可以再通過Tomcat的server.xml配置檔案來加深對Tomcat容器的了解。Tomcat 采用了元件化的設計,它的構成元件都是可配置的,其中最外層的是Server,其他元件按照一定的格式要求配置在這個頂層容器中。

<Server>
	<Service>
		<Connector>
		</Connector>
		<Engine>
			<Host>
				<Context></Context>
			</Host>
		</Engine>
	</Service>
</Server>
           

這些容器具有父子關系,形成一個樹形結構,Tomcat通過組合模式來管理這些容器。

具體實作方法是,所有容器元件都實作了Container接口,是以組合模

式可以使得使用者對單容器對象群組合容器對象的使用具有一緻性。這裡單容器對象指的

是最底層的Wrapper,組合容器對象指的是上面的Context、Host或者Engine。

Tomcat——Tomcat系統架構與原理分析

Container 接口中提供了以下方法(截圖中知識一部分方法) :

Tomcat——Tomcat系統架構與原理分析

在上面的接口看到了getParent、SetParent、addChild和removeChild等方法。

Container接口擴充了LifeCycle接口,LifeCycle接口用來統一管理各元件的生命周期。

參考:

https://blog.csdn.net/qq_37551917/article/details/119681753

https://www.cnblogs.com/yifengGG/p/13124816.html

繼續閱讀