首頁技術(shù)文章正文

一次請求的來龍去脈 - Tomcat架構(gòu)解析(一)

更新時間:2022-11-18 來源:黑馬程序員 瀏覽量:

IT培訓(xùn)班

  > Tomcat作為我們學(xué)習(xí)JavaEE的一個重要的web服務(wù)器,對整個請求的來龍去脈有所了解,將直接使得我們對JavaEE的學(xué)習(xí)更加的事半功倍。并且深入了解Tomcat架構(gòu)設(shè)計之后,將使得我們在以后搭建自己的項目架構(gòu)提供借鑒。那么接下來,我們先給大家闡述一下Tomcat的架構(gòu)是如何設(shè)計的,在設(shè)計的時候又是如何一步一步的考慮進(jìn)行的優(yōu)化升級。

      1.總體架構(gòu)

  > 其實只要我們使用過Tomcat,那么就應(yīng)該可以猜測得出,Tomcat其實是包含了兩個核心功能:

  處理socket請求,實現(xiàn)字節(jié)流數(shù)據(jù)和Request對象、Response對象的轉(zhuǎn)化

  管理Servlet,執(zhí)行servlet來處理請求,響應(yīng)請求

1668736839324_1.jpg

  2. 連接器

  > 為了更好的處理上面的兩件事情,Tomcat 設(shè)計出來了兩個組件:連接器和容器, 其中連接器用來接收請求,處理數(shù)據(jù),封裝成Request和response對象,對請求作出響應(yīng)。容器負(fù)責(zé)管理servlet,調(diào)用servlet,得到響應(yīng)返回給連接器,然后返回給客戶端。

1668736865093_2.jpg

  2.1 Service組件

  > 連接器和容器單獨工作,并不能完成所有的內(nèi)容。必須讓它們組合起來一起協(xié)作。為了更好的管理他們,Tomcat使用了叫做: Service的組件來包裝它們, Service并沒有任何的新鮮的功能,僅僅是包裝了連接器和容器而已。事實上,在Tomcat中,可以配置很多組service組件, 這樣就可以通過不同的端口號來訪問在Tomcat中部署的不同項目了。

1668736881254_3.jpg

  從上圖可以看出在在一個Tomcat可以包含一個Server實例,其實Server實例就是Tomcat實例。而一個Server實例可以擁有一個或者多個Service實例,一個 Service 中有多個連接器和一個容器。連接器之所以設(shè)計為多個,主要是為了方便客戶端可以通過不同的協(xié)議來發(fā)送請求。而容器只需要一份即可,因為它只需要管理servlet即可。連接器和容器是通過標(biāo)準(zhǔn)的ServletRequest和ServletResponse對象通訊的。

  2.1.1 連接器

  > 連接器的作用: 是為了接收客戶端的請求,并且對socket請求進(jìn)行數(shù)據(jù)讀取,分析,然后封裝成`ServletRequest` 對象,傳輸給容器。為了更好的實現(xiàn)功能內(nèi)聚、分工明確,Tomcat設(shè)計了3個組件來完成這些功能: Endpoint、Processor和Adapter。 為了更好的處理協(xié)議,Tomcat還使用 ProtocolHandler來對Endpoint和Processor進(jìn)行了封裝。

  Endpoint

  > Endpoint 作為通信端點,是一個接口 , 具體的 Socket 接收和發(fā)送處理器 ,屬于TCP/IP的具體實現(xiàn)。 具體的實現(xiàn)類有: AbstractEndpoint 。 它有兩個重要的組件:Acceptor 和 SocketProcessor 。 其中: Acceptor用來監(jiān)聽請求,SocketProcessor用來處理接收到的socket請求,它實現(xiàn)了Runnable接口,最終會被提交到線程池里面執(zhí)行。

  Processor

  > Processor則是實現(xiàn)Http協(xié)議的具體實現(xiàn)。負(fù)責(zé)把Endpoint接收到的請求里面的數(shù)據(jù)解析成Tomcat的Request對象。

  Adapter

  > 由于客戶端可以使用不同的協(xié)議來發(fā)送請求,Tomcat 接收到請求后,交由ProtocolHandler來解析并且封裝成Request對象。但是想要傳輸給Servlet,還需要經(jīng)過一次轉(zhuǎn)化。這個轉(zhuǎn)化的重任就落在了Adapter身上。

  >

  > 它的具體實現(xiàn)是: CoyoteAdapter,這個哥們屬于典型的適配器模式。把傳遞過來的Tomcat的Request類型轉(zhuǎn)化成了后續(xù)容器需要用到的ServletRequest對象。

1668736914203_4.jpg

  3. 總結(jié)

  Tomcat 的整體架構(gòu)包含了兩個核心組件連接器和容器。連接器負(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)用容器。

分享到:
在線咨詢 我要報名
和我們在線交談!