Tomcat整體介紹
來源
本文整理自 <Tomcat核心設計剖析>、<Tomcat結構解析>
Tomcat 整體架構
如上圖所示:包含了Tomcat內部的主要元件,每個元件之間的層次包含關係很清楚。Tomcat大體上可以看成由 Connector 和 Container 元件組成。Connector元件負責在伺服器端處理客戶端連線(客戶端連線、接收客戶端訊息報文、訊息報文的解析等),Container負責對客戶端的請求進行邏輯處理,並把結果返回給客戶端。
對應的server.xml中節點
<Server> <Listener/> <GlobalNamingResources> <Resource/> </GlobalNamingResources> <Service> <Executor/> <Connector/> <Engine> <Cluster/> <Realm/> <Host> <Context/> </Host> </Engine> </Service> </Server>
Tomcat內部元件
Server元件
Server是最頂級的元件,代表Tomcat的執行例項,一個JVM中只會有一個Server。
- Listener元件:在Tomcat生命週期中完成不同的工作。
- GlobalNamingResources元件:整合JNDI
Service元件
是服務的抽象,代表請求從接收到處理的所有的元件的集合。每個Service包含若干個用於接收客戶端的Connector元件和處理請求的Engine元件。還包含了若干個Executor元件,每個都是一個執行緒池。
Connector元件
Connector 主要負責接收客戶端連線並接收請求報文、解析報文轉交給 Container容器去處理。為了實現不同的通訊協議,所以有多個 Connector元件,每種協議對應一個Connector元件,目前有 Http協議、AJP協議兩種Connector元件。
在阻塞I/O方式下:Connector的結構如圖:
在非阻塞I/O方式下:Connector的結構如圖:
- Protocol元件:是協議的抽象,包含接收客戶端連線、接收客戶端訊息報文、報文解析處理、對客戶端的響應等過程,主要包含:
- Endpoint:內部的 Acceptor 會對埠進行監聽,有請求會丟到 Executor,然後轉交給 Processor元件。
- Processor: Processor元件對協議進行解析並傳遞到 Engine容器進行處理。
- Mapper元件:對請求地址進行路由。
- CoyoteAdaptor元件:一個將Connector 和 Container 聯絡起來的介面卡。
在 BIO和NIO下,使用的元件有所不同,並且NIO多了一個 Poller元件(輪詢多個客戶端連線,不斷檢測,處理各種事件。)
Engine元件
Engine 代表全域性Servlet引擎,每一個 Service 只能包含一個 Engine容器元件,但是Engine元件 可以包含很多個Host容器元件,還包含如下元件:
- Listener元件:在Tomcat生命週期中完成某些Engine容器相關工作。
- AccessLog元件:客戶端的訪問日誌,所有客戶端訪問都會被記錄。
- Cluster元件:提供叢集功能,可將Engine容器需要共享的資料同步到叢集中的其他Tomcat例項上。
- Pipeline元件:Engine容器對請求進行處理的管道。
- Realm元件:提供Engine容器級別的使用者--密碼--許可權的資料物件,配合資源認證模組使用。
Host元件
Host元件代表虛擬主機,這些虛擬主機可以存放若干Web應用的抽象(Context容器),還有以下元件:
- Listener元件:在Tomcat生命週期中完成某些Host容器相關工作。
- AccessLog元件:客戶端的訪問日誌,對該虛擬主機上所有WEB應用的訪問都會被記錄。
- Cluster元件:提供叢集功能,可將Host容器需要共享的資料同步到叢集中的其他Tomcat例項上。
- Pipeline元件:Host容器對請求進行處理的管道。
- Realm元件:提供Host容器級別的使用者--密碼--許可權的資料物件,配合資源認證模組使用。
Context元件
Context元件是WEB應用的抽象,WEB應用部署到Tomcat後執行會轉成Context物件。
- Listener元件:在Tomcat生命週期中完成某些Context容器相關工作。
- AccessLog元件:客戶端的訪問日誌,對該WEB應用的訪問都會被記錄。
- Pipeline元件:Context容器對請求進行處理的管道。
- Realm元件:提供Context容器級別的使用者--密碼--許可權的資料物件,配合資源認證模組使用。
- Loader元件:WEB應用載入器,用於載入WEB應用的資源,要保證不同WEB應用之間的資源隔離。
- Manager元件:會話管理器,用於管理對應WEB容器的會話,包括維護會話的生成、更新、銷燬。
- NamingResource元件:命名資源,負責將Tomcat配置檔案的Server.xml和Web應用的context.xml資源和屬性對映到記憶體中。
- Mapper元件:Servlet對映器,屬於Context內部的路由對映器,只負責該Context容器的路由。
- Wrapper元件:Context的子容器。
Wrapper元件
一個Wrapper對應一個 Servlet,包含以下元件:
- Servlet元件:
- ServletPool元件:當WEB應用實現了 SingleThreadModel 介面時,會在Wrapper中產生一個Servlet物件池。執行緒執行,先從物件池中獲取一個Servlet物件,能保證執行緒安全。
- Pipeline元件:Wrapper容器對請求進行處理的管道。