深入理解Tomcat(三)架構(gòu)及組件

前言

Tomcat的前身為Catalina,而Catalina又是一個(gè)輕量級(jí)的Servlet容器。在美國(guó),catalina是一個(gè)很美的小島。所以Tomcat作者的寓意可能是想把Tomcat設(shè)計(jì)成一個(gè)優(yōu)雅美麗且輕量級(jí)的web服務(wù)器。Tomcat從4.x版本開始除了作為支持Servlet的容器外,額外加入了很多的功能,比如:jsp、el、naming等等,所以說(shuō)Tomcat不僅僅是Catalina。

既然Tomcat首先是一個(gè)Servlet容器,我們應(yīng)該更多的關(guān)心Servlet。

那么,什么是Servlet呢?

在互聯(lián)網(wǎng)興起之初,當(dāng)時(shí)的Sun公司(后面被Oracle收購(gòu))已然看到了這次機(jī)遇,于是設(shè)計(jì)出了Applet來(lái)對(duì)Web應(yīng)用的支持。不過(guò)事實(shí)卻并不是預(yù)期那么得好,Sun悲催地發(fā)現(xiàn)Applet并沒(méi)有給業(yè)界帶來(lái)多大的影響。經(jīng)過(guò)反思,Sun就想既然機(jī)遇出現(xiàn)了,市場(chǎng)前景也非常不錯(cuò),總不能白白放棄了呀,怎么辦呢?于是又投入精力去搞一套規(guī)范出來(lái),這時(shí)Servlet誕生了!

所謂Servlet,其實(shí)就是Sun為了讓Java能實(shí)現(xiàn)動(dòng)態(tài)可交互的網(wǎng)頁(yè),從而進(jìn)入Web編程領(lǐng)域而制定的一套標(biāo)準(zhǔn)!

一個(gè)Servlet主要做下面三件事情:

  1. 創(chuàng)建并填充Request對(duì)象,包括:URI、參數(shù)、method、請(qǐng)求頭信息、請(qǐng)求體信息等
  2. 創(chuàng)建Response對(duì)象
  3. 執(zhí)行業(yè)務(wù)邏輯,將結(jié)果通過(guò)Response的輸出流輸出到客戶端

Servlet沒(méi)有main方法,所以,如果要執(zhí)行,則需要在一個(gè)容器里面才能執(zhí)行,這個(gè)容器就是為了支持Servlet的功能而存在,Tomcat其實(shí)就是一個(gè)Servlet容器的實(shí)現(xiàn)。

整體架構(gòu)圖

整體架構(gòu)圖

從上圖我們看出,最核心的兩個(gè)組件--連接器(Connector)和容器(Container)起到心臟的作用,他們至關(guān)重要!下面我們逐一來(lái)分析其功能:

  1. Server表示服務(wù)器,提供了一種優(yōu)雅的方式來(lái)啟動(dòng)和停止整個(gè)系統(tǒng),不必單獨(dú)啟停連接器和容器
  2. Service表示服務(wù),Server可以運(yùn)行多個(gè)服務(wù)。比如一個(gè)Tomcat里面可運(yùn)行訂單服務(wù)、支付服務(wù)、用戶服務(wù)等等
  3. 每個(gè)Service可包含多個(gè)Connector一個(gè)Container。因?yàn)槊總€(gè)服務(wù)允許同時(shí)支持多種協(xié)議,但是每種協(xié)議最終執(zhí)行的Servlet卻是相同的
  4. Connector表示連接器,比如一個(gè)服務(wù)可以同時(shí)支持AJP協(xié)議、Http協(xié)議和Https協(xié)議,每種協(xié)議可使用一種連接器來(lái)支持
  5. Container表示容器,可以看做Servlet容器
    • Engine -- 引擎
    • Host -- 主機(jī)
    • Context -- 上下文
    • Wrapper -- 包裝器
  6. Service服務(wù)之下還有各種支撐組件,下面簡(jiǎn)單羅列一下這些組件
    • Manager -- 管理器,用于管理會(huì)話Session
    • Logger -- 日志器,用于管理日志
    • Loader -- 加載器,和類加載有關(guān),只會(huì)開放給Context所使用
    • Pipeline -- 管道組件,配合Valve實(shí)現(xiàn)過(guò)濾器功能
    • Valve -- 閥門組件,配合Pipeline實(shí)現(xiàn)過(guò)濾器功能
    • Realm -- 認(rèn)證授權(quán)組件

除了連接器和容器,管道組件和閥門組件也很關(guān)鍵,我們通過(guò)一張圖來(lái)看看這兩個(gè)組件

pipeline+valve

換位思考Tomcat架構(gòu)

我們從大的方向來(lái)看下Tomcat架構(gòu),大體涉及到下面3個(gè)方面。

  1. 基于組件的架構(gòu)
  2. 基于JMX
  3. 基于生命周期

首先,我們說(shuō)一下什么是基于組件的架構(gòu)

通過(guò)上一小節(jié),我們知道了組成Tomcat的是各種各樣的組件,每個(gè)組件各司其職,組件與組件之間有明確的職責(zé)劃分,同時(shí)組件與組件之間又通過(guò)一定的聯(lián)系相互通信。Tomcat整體就是一個(gè)個(gè)組件的堆砌!

其次,我們說(shuō)一下為什么是基于JMX

我們?cè)诤罄m(xù)閱讀Tomcat源碼的時(shí)候,會(huì)發(fā)現(xiàn)代碼里充斥著大量的類似于下面的代碼。
Registry.getRegistry(null, null).invoke(mbeans, "init", false);
Registry.getRegistry(null, null).invoke(mbeans, "start", false);
而這實(shí)際上就是通過(guò)JMX來(lái)管理相應(yīng)對(duì)象的代碼。這兒我們不會(huì)詳細(xì)講述什么是JMX,我們只是簡(jiǎn)單地說(shuō)明一下JMX的概念,參考JMX百度百科。
JMX(Java Management Extensions,即Java管理擴(kuò)展)是一個(gè)為應(yīng)用程序、設(shè)備、系統(tǒng)等植入管理功能的框架。JMX可以跨越一系列異構(gòu)操作系統(tǒng)平臺(tái)、系統(tǒng)體系結(jié)構(gòu)網(wǎng)絡(luò)傳輸協(xié)議,靈活的開發(fā)無(wú)縫集成的系統(tǒng)、網(wǎng)絡(luò)和服務(wù)管理應(yīng)用。

最后,我們說(shuō)一下為什么是基于生命周期。

我們?cè)诘诙恼轮薪榻B了Lifecycle接口。如果我們查閱各個(gè)組件的源代碼,會(huì)發(fā)現(xiàn)絕大多數(shù)組件實(shí)現(xiàn)了該接口,這也就是我們所說(shuō)的基于生命周期。生命周期的各個(gè)階段的觸發(fā)又是基于事件的方式。
參考link:深入理解Tomcat(二)Lifecycle

總結(jié)

好了,我們已經(jīng)從整體上看到了Tomcat的結(jié)構(gòu),但是對(duì)于每個(gè)組件我們并沒(méi)有詳細(xì)分析。后續(xù)章節(jié)我們會(huì)從幾個(gè)方面來(lái)學(xué)習(xí)Tomcat:

  1. 逐一分析各個(gè)組件
  2. 通過(guò)斷點(diǎn)的方式來(lái)跟蹤Tomcat代碼中的一次完整請(qǐng)求

希望通過(guò)這種方式加深自己對(duì)Tomcat的理解,同時(shí)給想要深入學(xué)習(xí)Tomcat的同學(xué)帶來(lái)一些幫助。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容