一堤撵、Tomcat整體設(shè)計(jì)
-
簡(jiǎn)單版
tomcat設(shè)計(jì)1.png -
使用了Container表示容器咏瑟,Container可以添加并維護(hù)子容器庭猩,因此Engine狞山、Host、Context绩郎、Wrapper均繼承自Container絮识。不過Service持有的是Engine。Container可以進(jìn)行后臺(tái)處理嗽上,如定期執(zhí)行一些異步處理。
tomcat設(shè)計(jì)2.png -
所有的組件均存在啟動(dòng)熄攘、停止等生命周期方法兽愤,擁有生命周期管理的特性,針對(duì)此現(xiàn)象抽象了一個(gè)Lifecycle通用接口挪圾,該接口定義了生命周期管理的核心方法浅萧。同時(shí)該接口支持組件狀態(tài)及狀態(tài)之間的轉(zhuǎn)換,支持添加事件監(jiān)聽器用于監(jiān)聽組件的狀態(tài)變化哲思。如此洼畅,可以采用一致的機(jī)制來初始化、啟動(dòng)棚赔、停止及銷毀各個(gè)組件帝簇。它還將自身注冊(cè)為Bean,以便Tomcat管理工具進(jìn)行動(dòng)態(tài)維護(hù)靠益。
tomcat設(shè)計(jì)3.png -
Pipeline(管道)用于構(gòu)建職責(zé)連丧肴,Valve(閥)代表職責(zé)鏈上的每個(gè)處理器。Pipeline中維護(hù)了一個(gè)基礎(chǔ)的Valve胧后,它始終位于Pipeline的末端(即最后執(zhí)行)芋浮,封裝了具體的請(qǐng)求處理和輸出響應(yīng)的過程。我們可以添加Valve壳快,后添加的Valve位于基礎(chǔ)Valve之前纸巷,并按照添加順序執(zhí)行。Pipeline通過獲得首個(gè)Valve來啟動(dòng)整條鏈條的執(zhí)行眶痰。每個(gè)層級(jí)的容器都維護(hù)了一個(gè)Pipeline實(shí)例瘤旨。
tomcat設(shè)計(jì)4.png Connector需完成一下功能:
(1)監(jiān)聽服務(wù)器端口,讀取來自客戶端的請(qǐng)求凛驮。
(2)將請(qǐng)求數(shù)據(jù)按照指定的協(xié)議進(jìn)行解析裆站。
(3)根據(jù)請(qǐng)求地址匹配正確的容器進(jìn)行處理。
(4)將響應(yīng)返回給客戶端。
ProtocolHandle表示一個(gè)協(xié)議處理器宏胯,它包含一個(gè)Endpoint用于啟動(dòng)Socket監(jiān)聽和一個(gè)Processor用于按照指定的協(xié)議讀取數(shù)據(jù)羽嫡,并將請(qǐng)求交由容器處理。之后通過Mappper映射到具體的容器進(jìn)行處理肩袍。MapperListener進(jìn)行容器組件的注冊(cè)和銷毀杭棵。
-
在Tomcat中,Endpoint會(huì)啟動(dòng)一組線程來監(jiān)聽Socket端口氛赐,當(dāng)接受到客戶端的請(qǐng)求后魂爪,會(huì)創(chuàng)建請(qǐng)求處理對(duì)象,并由線程池處理艰管,由此支持并發(fā)處理請(qǐng)求滓侍。
tomcat設(shè)計(jì)6.png -
Tomcat通過類Catalina提供了一個(gè)Shell程序,用于解析server.xml創(chuàng)建各個(gè)組件牲芋,同時(shí)負(fù)責(zé)啟動(dòng)撩笆、停止應(yīng)用服務(wù)器。
Tomcat提供了Bootstrap作為應(yīng)用服務(wù)器啟動(dòng)入口缸浦。Bootstrap負(fù)責(zé)創(chuàng)建Catalina實(shí)例夕冲,根據(jù)相關(guān)參數(shù)調(diào)用Catalina相關(guān)方法完成操作。
tomcat設(shè)計(jì)7.png
-
tomcat組件說明
tomcat組件.png -
請(qǐng)求處理過程
tomcat請(qǐng)求處理.png
二裂逐、tomcat類加載器
(1)Common:Tomcat應(yīng)用服務(wù)器和Web應(yīng)用的公用類加載器歹鱼。
(2)Catalina:加載Tomcat應(yīng)用服務(wù)器的類加載器。
(3)Shared:所有Web應(yīng)用的公共加載器
(4)Web應(yīng)用:只對(duì)當(dāng)前的Web應(yīng)用可見卜高。加載/WEB-INF/classes目錄下的未壓縮的Class和資源文件以及/WEB-INF/lib目錄下的jar包弥姻。
Web應(yīng)用類加載器默認(rèn)加載順序如下:
(1)從緩存中加載。
(2)若沒有掺涛,從JVM的Bootstrap類加載器加載蚁阳。
(3)若沒有,從當(dāng)前類加載器加載(按照/WEB-INF/classes鸽照、/WEB-INF/lib的順序)螺捐。
(4)若沒有,從父類加載器加載(System矮燎、Common定血、Shared)。
可修改delegate屬性為true诞外,采用Java默認(rèn)的委派模式:
(1)從緩存中加載澜沟。
(2)若沒有,從JVM的Bootstrap類加載器加載峡谊。
(3)若沒有茫虽,從父類加載器加載(System刊苍、Common、Shared)濒析。
(4)若沒有正什,從當(dāng)前類加載器加載(按照/WEB-INF/classes、/WEB-INF/lib的順序)号杏。