更新時間:2022-11-18 來源:黑馬程序員 瀏覽量:
> Tomcat作為我們學習JavaEE的一個重要的web服務器,對整個請求的來龍去脈有所了解,將直接使得我們對JavaEE的學習更加的事半功倍。并且深入了解Tomcat架構設計之后,將使得我們在以后搭建自己的項目架構提供借鑒。那么接下來,我們先給大家闡述一下Tomcat的架構是如何設計的,在設計的時候又是如何一步一步的考慮進行的優化升級。
1.總體架構
> 其實只要我們使用過Tomcat,那么就應該可以猜測得出,Tomcat其實是包含了兩個核心功能:
處理socket請求,實現字節流數據和Request對象、Response對象的轉化
管理Servlet,執行servlet來處理請求,響應請求
2. 連接器
> 為了更好的處理上面的兩件事情,Tomcat 設計出來了兩個組件:連接器和容器, 其中連接器用來接收請求,處理數據,封裝成Request和response對象,對請求作出響應。容器負責管理servlet,調用servlet,得到響應返回給連接器,然后返回給客戶端。
2.1 Service組件
> 連接器和容器單獨工作,并不能完成所有的內容。必須讓它們組合起來一起協作。為了更好的管理他們,Tomcat使用了叫做: Service的組件來包裝它們, Service并沒有任何的新鮮的功能,僅僅是包裝了連接器和容器而已。事實上,在Tomcat中,可以配置很多組service組件, 這樣就可以通過不同的端口號來訪問在Tomcat中部署的不同項目了。
從上圖可以看出在在一個Tomcat可以包含一個Server實例,其實Server實例就是Tomcat實例。而一個Server實例可以擁有一個或者多個Service實例,一個 Service 中有多個連接器和一個容器。連接器之所以設計為多個,主要是為了方便客戶端可以通過不同的協議來發送請求。而容器只需要一份即可,因為它只需要管理servlet即可。連接器和容器是通過標準的ServletRequest和ServletResponse對象通訊的。
2.1.1 連接器
> 連接器的作用: 是為了接收客戶端的請求,并且對socket請求進行數據讀取,分析,然后封裝成`ServletRequest` 對象,傳輸給容器。為了更好的實現功能內聚、分工明確,Tomcat設計了3個組件來完成這些功能: Endpoint、Processor和Adapter。 為了更好的處理協議,Tomcat還使用 ProtocolHandler來對Endpoint和Processor進行了封裝。
Endpoint
> Endpoint 作為通信端點,是一個接口 , 具體的 Socket 接收和發送處理器 ,屬于TCP/IP的具體實現。 具體的實現類有: AbstractEndpoint 。 它有兩個重要的組件:Acceptor 和 SocketProcessor 。 其中: Acceptor用來監聽請求,SocketProcessor用來處理接收到的socket請求,它實現了Runnable接口,最終會被提交到線程池里面執行。
Processor
> Processor則是實現Http協議的具體實現。負責把Endpoint接收到的請求里面的數據解析成Tomcat的Request對象。
Adapter
> 由于客戶端可以使用不同的協議來發送請求,Tomcat 接收到請求后,交由ProtocolHandler來解析并且封裝成Request對象。但是想要傳輸給Servlet,還需要經過一次轉化。這個轉化的重任就落在了Adapter身上。
>
> 它的具體實現是: CoyoteAdapter,這個哥們屬于典型的適配器模式。把傳遞過來的Tomcat的Request類型轉化成了后續容器需要用到的ServletRequest對象。
3. 總結
Tomcat 的整體架構包含了兩個核心組件連接器和容器。連接器負責對外交流,容器負責內部處理。連接器用 ProtocolHandler 接口來封裝通信協議和 I/O 模型的差異,ProtocolHandler 內部又分為 Endpoint 和 Processor 模塊,Endpoint 負責底層 Socket 通信,Processor 負責應用層協議解析。連接器通過適配器 Adapter 調用容器。