Tomcat的系統架構與工作流程簡介-深入分析Java Web技術內幕

Tomcat的系統架構與設計模式

本文主要從Tomcat如何分發請求、如何處理多用戶同時請求、它的多級容器是如何協調工作的角度分析Tomcat的工作原理。

1、Tomcat總體結構

Tomcat的兩個核心組件:Connector & Container。

多個Connector和一個Container就形成了Service,而Service包括整個Tomcat的生命週期由Server控制。

Connector負責接受請求,Container負責處理這些請求,Service主要負責關聯兩者,同時會初始化它下面的其他組件。所有組件的聲明週期在一個Lifecycle的接口中控制。

Server提供一個接口讓其他程序能夠訪問到這個Service集合,同時要維護它包含的所有Service的生命週期,包括如何初始化、如何結束服務、如何找到別人要訪問的Service。

 

(1)、Connector組件

Connector組件主要任務是負責接收瀏覽器發過來的TCP連接請求,創建一個Request和Response對象分別用於和請求端交換數據。然後產生一個線程來處理這個請求並把產生的Request和Response對象傳給處理這個請求的線程,處理這個請求的線程就是Container組件要做的事情了。

HttpConnector啓動(start方法)後,進入等待請求的狀態,直到一個新的請求到來纔會激活它繼續執行,這個激活是在HttpProcessor的assign方法中。創建HttpProcessor對象時會把available爲false,當請求到來時,將請求的Socket賦給當前處理的Socket,並將available設置爲true,這樣HttpProcessor的run方法將被激活,接下來會處理這次請求。

當Connector將Socket連接封裝成Request和Response對象後,接下來的事情就交給Container來處理了。

 

(2)、Servlet容器Container

Container是容器的父接口,所有子容器都必須實現這個接口,Container容器的設計用的是典型的責任鏈的設計模式。它由四個子容器組件構成,分別是Engine、Host、Context和Wrapper,這四個組件是父子關係,前者包含後者。

通常一個Servlet class 對應一個Wrapper。

A、容器的總體設計

Context還可以定義在父容器Host中,Host不是必需的,但是要運行war程序,就必需要用Host,因爲war中必有web.xml文件,這個文件的解析就需要Host。如果要有多個Host就要定義一個top容器Engine。而Engine沒有父容器了,一個Engine代表一個完整的Servlet引擎。

 

B、Engine容器

Engine容器只定義了一些基本的關聯關係,標準實現類是StandardEngine。只能添加Host類型的子容器,初始化方法是初始化和它相關聯的組件,以及一些事件的監聽。

C、Host容器

Host是Engine的子容器,一個Host在Engine中代表一個虛擬主機,這個虛擬主機的作用就是運行多個應用,它負責安裝和展開這些應用,並且標識這個應用以便能夠區分它們。它的子容器通常是Context,它除了關聯子容器外,還有就是保存一個主機應該有的信息。

D、Context容器

Context代表Servlet的Context,它具備了Servlet運行的基本環境。Context最重要的功能就是管理它裏面的Servlet實例,Servlet實例在Context中是以Wrapper出現的。

Context準備Servlet的運行環境是從Start方法開始的,主要作用是設置各種資源屬性和管理組件,還有一個非常重要的作用是啓動子容器和Pipeline。

注:reloadable設置爲true時,war被修改後Tomcat會自動重新加載這個應用。這個功能是在StandardContext的backgroundProcess方法中實現的,其實就是調用reload方法(先調用stop在調用start),完成Context的一次重新加載(這個方法是週期調用的,運行在一個後臺線程中)。

E、Wrapper容器

Wrapper代表一個Servlet,它負責管理一個Servlet,包括Servlet的裝載、初始化、執行及資源回收。Wrapper是最底層的容器了,沒有子容器了。

Wrapper的實現類是StandardWrapper,該類還實現了擁有一個Servlet初始化信息的ServletConfig。Servlet可以獲得的信息都在StandardWrapperFacade裏封裝,這些信息又是在StandardWrapper對象中拿到的,所以Servlet可以通過ServletConfig拿到有限的容器的信息。

當Servlet被初始化完成後,就等着StandardWrapperValve去調用它的Service方法了,調用Service方法之前要調用Servlet所有的filter。

 

(3) 其他組件

安全組件security,日誌組件logger,session,mbeans,naming

 

以上時序圖來自《深入分析Java Web技術內幕》

參考書籍:

《深入分析Java Web技術內幕》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章