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