淺談Tomcat之Tomcat結構

FuyunWang發表於2018-02-13

Tomcat的整體結構介紹

Tomcat的整體架構圖下:

Aaron Swartz

相關元件的大致介紹如下:

  1. Server元件:Server元件是最頂級的元件,它代表Tomcat的執行例項,在一個JVM中只會包含一個Server。在Server的整個生命週期中,Server元件中的Listener元件實現事件的監聽並完成相應的任務,此外Server中包含的GlobalNamingResources元件是為了方便在Tomcat中整合JNDI。除了這兩個元件,Server的核心元件就是Service元件
  2. Service元件:Service是服務的抽象,它代表請求從接收到處理的所有元件的集合,一個Server元件可以包含多個Service元件,每一個Service元件都包含了若干的用於接受客戶端訊息的Connector元件和處理請求的Engine元件以及一些Executor元件。其中不同的Connector元件使用不同的通訊協議,如Http協議和AJP協議等。Executor元件是一個執行緒池,主要是為Service內的所有元件提供任務所需的執行緒池。

聯結器元件

  1. Connector元件:Connector元件的主要職責就是接受客戶端的連線並且接受訊息報文,訊息報文經由Connector的解析之後送往Container元件處理。Tomcat可以處理Http協議和AJP協議等,因此Connector的分類主要由Http和AJP兩種協議的Connector元件。Service元件和Connector元件的關係圖如下:
    Aaron Swartz
    ,此外,Connector元件中還包含有Mapper元件和CoyoteAdapter元件。 Mapper元件:客戶端請求的路由導航元件,通過它能夠對一個完整的請求地址進行路由,從而根據請求地址找到對應的Servlet。 CoyoteAdapter元件:一個將Connector和Container適配起來的介面卡。

容器元件

Tomcat內部有4個級別的容器,分別是Engine、Host、Context和Wrapper。

Engine元件:

Engine代表全域性的Servlet引擎,每一個Service元件只能包含一個Engine容器元件,但是一個Engine元件可以包含多個Host元件,除了Host元件之外,還包含以下的元件。

1. Listener元件:可以在Tomcat生命週期中完成某一些Engine容器相關工作的監聽器
2. AccessLog元件:客戶端的訪問日誌,所有客戶端訪問都會被記錄
3. Cluster元件:提供叢集功能,可以將Engine容器需要共享的資料同步到叢集中的其他班的Tomcat例項上。
4. Pipline元件:Engine容器對請求進行處理的管道
5. Realm元件:提供了Engine容器級別的許可權認證的功能。
複製程式碼

Host元件:

Tomcat中Host元件代表的是虛擬主機,其中存放著若干的抽象的Web應用。Host元件除了包含Context元件之外還包含以下的元件

1. Listener元件:可以在Tomcat生命週期中完成某一些Host容器相關工作的監聽器
2. AccessLog元件:客戶端的訪問日誌,用於記錄指定虛擬主機上所有Web應用的訪問。
3. Cluster元件:提供叢集功能,可以將Host容器需要共享的資料同步到叢集中的其他班的Tomcat例項上。
4. Pipline元件:Host容器對請求進行處理的管道
5. Realm元件:提供了Host容器級別的許可權認證的功能。
複製程式碼

Context元件:

Context元件是Web應用的抽象,其包含了各種靜態資源、若干Servlet(Wrapper容器)以及各種其他動態資源。其除了包含主要的Wrapper元件之外還包括以下的元件:

1. Listener元件:可以在Tomcat生命週期中完成某一些Context容器相關工作的監聽器
2. AccessLog元件:客戶端的訪問日誌,用於記錄對特定Web應用的訪問
3. Pipline元件:Context容器對請求進行處理的管道
4. Realm元件:提供了Context容器級別的許可權認證的功能。
5. Loader元件:Loader元件是Web應用的載入器,用於載入Web應用的資源並實現在不同Web應用之間資源的隔離
6. Manager元件:會話管理器,用於管理對應Web容器的會話,包括維護會話的生成、更新和銷燬。
7. NamingResource元件:進行資源的命名,其負責將Tomcat配置檔案的server.xml和Web應用的context.xml資源和屬性對映到記憶體中
8. Mapper元件:Servlet對映器,負責Context容器內部請求的路由導航
複製程式碼

Wrapper元件:

一個Wrapper元件對應著一個Servlet,其主要包含以下的元件

1. Servlet元件:Servlet是請求處理的基本單元
2. ServletPool元件:Servlet物件池,用於保證Servlet物件的執行緒安全。
3. Pipeline元件:Wrapper容器對請求進行處理的管道
複製程式碼

小結

總之,Tomcat從功能上可以抽象的看做是由聯結器元件(Connector)和容器元件(Container)組成。Connector元件負責在伺服器端處理客戶端的連線,包括接受客戶端的連線、接受客戶端的訊息,對訊息報文進行解析。Container元件負責對客戶端的請求進行邏輯處理然後把結果返回給客戶端

說說Tomcat的Connector元件

Connector元件主要是完成對請求報文進行解析生成Request物件、對響應報文進行解析生成Response物件。

Connector元件的架構圖如下:

Aaron Swartz

其包括的主要元件如下:

Protocol元件:對不同協議(如Http協議、AJP協議等)的處理做了抽象。其包含的Endpoint元件是接收端的抽象,對於不同的I/O模式,Endpoint也存在多種型別的Endpoint,如BIO模式下的JIoEndpoint,NIO模式下的NioEndpoint和本地庫I/O模式下的AprEndpoint。Endpoint包含的元件Acceptor是專門用於處理客戶端連線的接收器元件,Executor是處理客戶端請求的連線池元件。Processor元件是處理客戶端請求的處理器。

Protocol元件的型別有:Http11Protocol、Http11NioProtocol、Http11AprProtocol、AjpProtocol、AjpNioProtocol、AjpAprProtocol

Mapper元件:又稱請求URI對映器Mapper,提供對客戶端請求URL地址的對映功能,Tomcat通過Connector中包含的Mapper元件將請求轉發給對應的Host元件、Context元件和Wrapper元件,最終實現Tomcat將客戶端的請求路由到處理業務邏輯的Servlet上。Mapper元件又被分成為兩類:

  1. Connector中的Mapper負責全域性路由。在程式的編寫過程中,應用程式與應用程式之間的重定向redirect就是採用的全域性Mapper對映。
  2. Context中的Mapper負責區域性路由,區域性路由Mapper只存在於Context容器中,負責記錄訪問資源與Wrapper之間的對映。在程式的編寫過程中,應用程式內部的轉發forward就是採用的區域性Mapper對映。

Mapper元件進行路由的時候,首先將3個級別的容器進行樹狀劃分,然後一級一級的尋找到最終的Wrapper元件(Servlet)進行邏輯的處理。

CoyoteAdapter元件:作為Connector元件和Engine容器之間的介面卡。

一個Service元件例項可以包含多個Connector例項(埠都是不同的),一個Connector例項處理一個埠上的請求。

說說Tomcat的Container元件

Tomcat的第二大核心元件就是Container(容器)元件,Tomcat中主要由四個級別的容器元件。

  1. Engine容器:為全域性引擎容器,其標準實現為StandardEngine。Engine是一個全域性Servlet容器,一個Engine容器可以包含多個Host容器。
  2. Host容器:Host元件是Engine容器的子元件,它代表一個虛擬主機,其標準實現為StandardHost。一個Host容器可以包含多個Context容器。
  3. Context容器:一個Context元件對應一個Web應用程式,Context容器可以實現將Web專案中包含的元件轉化成容器中的元件。
  4. Wrapper容器:一個Wrapper元件對應一個Servlet物件或者一個Servlet物件池。Wrapper元件用於處理請求的具體邏輯,

相關文章