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