Tomcat系統(tǒng)架構(gòu)

一、Tomcat頂層架構(gòu)

先上一張Tomcat的頂層結(jié)構(gòu)圖(圖A)遏片,如下:


image.png

omcat中最頂層的容器是Server绰寞,代表著整個(gè)服務(wù)器,從上圖中可以看出泉手,一個(gè)Server可以包含至少一個(gè)Service黔寇,用于具體提供服務(wù)。
Service主要包含兩個(gè)部分:Connector和Container斩萌。從上圖中可以看出 Tomcat 的心臟就是這兩個(gè)組件啡氢,他們的作用如下:

1、Connector用于處理連接相關(guān)的事情术裸,并提供Socket與Request和Response相關(guān)的轉(zhuǎn)化; 
2倘是、Container用于封裝和管理Servlet,以及具體處理Request請(qǐng)求袭艺;

一個(gè)Tomcat中只有一個(gè)Server搀崭,一個(gè)Server可以包含多個(gè)Service,一個(gè)Service只有一個(gè)Container,但是可以有多個(gè)Connectors瘤睹,這是因?yàn)橐粋€(gè)服務(wù)可以有多個(gè)連接升敲,如同時(shí)提供Http和Https鏈接,也可以提供向相同協(xié)議不同端口的連接,示意圖如下(Engine轰传、Host驴党、Context下邊會(huì)說(shuō)到):


image.png

多個(gè) Connector 和一個(gè) Container 就形成了一個(gè) Service,有了 Service 就可以對(duì)外提供服務(wù)了获茬,但是 Service 還要一個(gè)生存的環(huán)境港庄,必須要有人能夠給她生命、掌握其生死大權(quán)恕曲,那就非 Server 莫屬了鹏氧!所以整個(gè) Tomcat 的生命周期由 Server 控制。

另外佩谣,上述的包含關(guān)系或者說(shuō)是父子關(guān)系把还,都可以在tomcat的conf目錄下的server.xml配置文件中看出,下圖是刪除了注釋內(nèi)容之后的一個(gè)完整的server.xml配置文件(Tomcat版本為8.0)

image.png

詳細(xì)的配置文件文件內(nèi)容可以到Tomcat官網(wǎng)查看:http://tomcat.apache.org/tomcat-8.0-doc/index.html
上邊的配置文件茸俭,還可以通過(guò)下邊的一張結(jié)構(gòu)圖更清楚的理解:
image.png

Server標(biāo)簽設(shè)置的端口號(hào)為8005吊履,shutdown=”SHUTDOWN” ,表示在8005端口監(jiān)聽(tīng)“SHUTDOWN”命令调鬓,如果接收到了就會(huì)關(guān)閉Tomcat率翅。一個(gè)Server有一個(gè)Service,當(dāng)然還可以進(jìn)行配置袖迎,一個(gè)Service有多個(gè),Service左邊的內(nèi)容都屬于Container的腺晾,Service下邊是Connector燕锥。

二、Tomcat頂層架構(gòu)小結(jié):

(1)Tomcat中只有一個(gè)Server悯蝉,一個(gè)Server可以有多個(gè)Service归形,一個(gè)Service可以有多個(gè)Connector和一個(gè)Container;
(2) Server掌管著整個(gè)Tomcat的生死大權(quán)鼻由;
(4)Service 是對(duì)外提供服務(wù)的暇榴;
(5)Connector用于接受請(qǐng)求并將請(qǐng)求封裝成Request和Response來(lái)具體處理;
(6)Container用于封裝和管理Servlet蕉世,以及具體處理request請(qǐng)求蔼紧;
知道了整個(gè)Tomcat頂層的分層架構(gòu)和各個(gè)組件之間的關(guān)系以及作用,對(duì)于絕大多數(shù)的開(kāi)發(fā)人員來(lái)說(shuō)Server和Service對(duì)我們來(lái)說(shuō)確實(shí)很遠(yuǎn)狠轻,而我們開(kāi)發(fā)中絕大部分進(jìn)行配置的內(nèi)容是屬于Connector和Container的奸例,所以接下來(lái)介紹一下Connector和Container。

三向楼、Connector和Container的微妙關(guān)系

由上述內(nèi)容我們大致可以知道一個(gè)請(qǐng)求發(fā)送到Tomcat之后查吊,首先經(jīng)過(guò)Service然后會(huì)交給我們的Connector谐区,Connector用于接收請(qǐng)求并將接收的請(qǐng)求封裝為Request和Response來(lái)具體處理,Request和Response封裝完之后再交由Container進(jìn)行處理逻卖,Container處理完請(qǐng)求之后再返回給Connector宋列,最后在由Connector通過(guò)Socket將處理的結(jié)果返回給客戶端,這樣整個(gè)請(qǐng)求的就處理完了评也!

Connector最底層使用的是Socket來(lái)進(jìn)行連接的炼杖,Request和Response是按照HTTP協(xié)議來(lái)封裝的,所以Connector同時(shí)需要實(shí)現(xiàn)TCP/IP協(xié)議和HTTP協(xié)議仇参!

Tomcat既然處理請(qǐng)求嘹叫,那么肯定需要先接收到這個(gè)請(qǐng)求,接收請(qǐng)求這個(gè)東西我們首先就需要看一下Connector诈乒!

四罩扇、Connector架構(gòu)分析

Connector用于接受請(qǐng)求并將請(qǐng)求封裝成Request和Response,然后交給Container進(jìn)行處理怕磨,Container處理完之后在交給Connector返回給客戶端喂饥。

因此,我們可以把Connector分為四個(gè)方面進(jìn)行理解:
(1)Connector如何接受請(qǐng)求的肠鲫?
(2)如何將請(qǐng)求封裝成Request和Response的员帮?
(3)封裝完之后的Request和Response如何交給Container進(jìn)行處理的?
(4)Container處理完之后如何交給Connector并返回給客戶端的导饲?

首先看一下Connector的結(jié)構(gòu)圖(圖B)捞高,如下所示:


image.png

Connector就是使用ProtocolHandler來(lái)處理請(qǐng)求的,不同的ProtocolHandler代表不同的連接類(lèi)型渣锦,比如:Http11Protocol使用的是普通Socket來(lái)連接的硝岗,Http11NioProtocol使用的是NioSocket來(lái)連接的。
其中ProtocolHandler由包含了三個(gè)部件:Endpoint袋毙、Processor型檀、Adapter。

(1)Endpoint用來(lái)處理底層Socket的網(wǎng)絡(luò)連接听盖,Processor用于將Endpoint接收到的Socket封裝成Request胀溺,Adapter用于將Request交給Container進(jìn)行具體的處理。

(2)Endpoint由于是處理底層的Socket網(wǎng)絡(luò)連接皆看,因此Endpoint是用來(lái)實(shí)現(xiàn)TCP/IP協(xié)議的仓坞,而Processor用來(lái)實(shí)現(xiàn)HTTP協(xié)議的,Adapter將請(qǐng)求適配到Servlet容器進(jìn)行具體的處理腰吟。

(3)Endpoint的抽象實(shí)現(xiàn)AbstractEndpoint里面定義的Acceptor和AsyncTimeout兩個(gè)內(nèi)部類(lèi)和一個(gè)Handler接口扯躺。Acceptor用于監(jiān)聽(tīng)請(qǐng)求,AsyncTimeout用于檢查異步Request的超時(shí),Handler用于處理接收到的Socket录语,在內(nèi)部調(diào)用Processor進(jìn)行處理倍啥。

至此,我們應(yīng)該很輕松的回答(1)(2)(3)的問(wèn)題了澎埠,但是(4)還是不知道虽缕,那么我們就來(lái)看一下Container是如何進(jìn)行處理的以及處理完之后是如何將處理完的結(jié)果返回給Connector的?

五蒲稳、Container架構(gòu)分析

Container用于封裝和管理Servlet氮趋,以及具體處理Request請(qǐng)求,在Connector內(nèi)部包含了4個(gè)子容器江耀,結(jié)構(gòu)圖如下(圖C):


image.png

4個(gè)子容器的作用分別是:

(1)Engine:引擎剩胁,用來(lái)管理多個(gè)站點(diǎn),一個(gè)Service最多只能有一個(gè)Engine祥国; 
(2)Host:代表一個(gè)站點(diǎn)昵观,也可以叫虛擬主機(jī),通過(guò)配置Host就可以添加站點(diǎn)舌稀; 
(3)Context:代表一個(gè)應(yīng)用程序啊犬,對(duì)應(yīng)著平時(shí)開(kāi)發(fā)的一套程序,或者一個(gè)WEB-INF目錄以及下面的web.xml文件壁查; 
(4)Wrapper:每一Wrapper封裝著一個(gè)Servlet觉至;

下面找一個(gè)Tomcat的文件目錄對(duì)照一下,如下圖所示:


image.png

Context和Host的區(qū)別是Context表示一個(gè)應(yīng)用睡腿,我們的Tomcat中默認(rèn)的配置下webapps下的每一個(gè)文件夾目錄都是一個(gè)Context语御,其中ROOT目錄中存放著主應(yīng)用,其他目錄存放著子應(yīng)用席怪,而整個(gè)webapps就是一個(gè)Host站點(diǎn)应闯。

我們?cè)L問(wèn)應(yīng)用Context的時(shí)候,如果是ROOT下的則直接使用域名就可以訪問(wèn)何恶,例如:www.ledouit.com,如果是Host(webapps)下的其他應(yīng)用,則可以使用www.ledouit.com/docs進(jìn)行訪問(wèn)嚼黔,當(dāng)然默認(rèn)指定的根應(yīng)用(ROOT)是可以進(jìn)行設(shè)定的细层,只不過(guò)Host站點(diǎn)下默認(rèn)的主營(yíng)用是ROOT目錄下的。

看到這里我們知道Container是什么唬涧,但是還是不知道Container是如何進(jìn)行處理的以及處理完之后是如何將處理完的結(jié)果返回給Connector的疫赎?別急!下邊就開(kāi)始探討一下Container是如何進(jìn)行處理的碎节!

六捧搞、Container如何處理請(qǐng)求的

Container處理請(qǐng)求是使用Pipeline-Value管道來(lái)處理的!

Pipeline-Value是責(zé)任鏈模式,責(zé)任鏈模式是指在一個(gè)請(qǐng)求處理的過(guò)程中有很多處理者依次對(duì)請(qǐng)求進(jìn)行處理胎撇,每個(gè)處理者負(fù)責(zé)做自己相應(yīng)的處理介粘,處理完之后將處理后的請(qǐng)求返回,再讓下一個(gè)處理著繼續(xù)處理晚树。


image.png

但是姻采!Pipeline-Value使用的責(zé)任鏈模式和普通的責(zé)任鏈模式有些不同!區(qū)別主要有以下兩點(diǎn):

(1)每個(gè)Pipeline都有特定的Value爵憎,而且是在管道的最后一個(gè)執(zhí)行慨亲,這個(gè)Value叫做BaseValue,BaseValue是不可刪除的宝鼓;
(2)在上層容器的管道的BaseValue中會(huì)調(diào)用下層容器的管道刑棵。

我們知道Container包含四個(gè)子容器,而這四個(gè)子容器對(duì)應(yīng)的BaseValue分別在:StandardEngineValue愚铡、StandardHostValue蛉签、StandardContextValue、StandardWrapperValue茂附。

Pipeline的處理流程圖如下(圖D):


image.png

(1)Connector在接收到請(qǐng)求后會(huì)首先調(diào)用最頂層容器的Pipeline來(lái)處理正蛙,這里的最頂層容器的Pipeline就是EnginePipeline(Engine的管道);
(2)在Engine的管道中依次會(huì)執(zhí)行EngineValue1营曼、EngineValue2等等乒验,最后會(huì)執(zhí)行StandardEngineValue,在StandardEngineValue中會(huì)調(diào)用Host管道蒂阱,然后再依次執(zhí)行Host的HostValue1锻全、HostValue2等,最后在執(zhí)行StandardHostValue录煤,然后再依次調(diào)用Context的管道和Wrapper的管道鳄厌,最后執(zhí)行到StandardWrapperValue。
(3)當(dāng)執(zhí)行到StandardWrapperValue的時(shí)候妈踊,會(huì)在StandardWrapperValue中創(chuàng)建FilterChain了嚎,并調(diào)用其doFilter方法來(lái)處理請(qǐng)求,這個(gè)FilterChain包含著我們配置的與請(qǐng)求相匹配的Filter和Servlet廊营,其doFilter方法會(huì)依次調(diào)用所有的Filter的doFilter方法和Servlet的service方法歪泳,這樣請(qǐng)求就得到了處理!
(4)當(dāng)所有的Pipeline-Value都執(zhí)行完之后露筒,并且處理完了具體的請(qǐng)求呐伞,這個(gè)時(shí)候就可以將返回的結(jié)果交給Connector了,Connector在通過(guò)Socket的方式將結(jié)果返回給客戶端慎式。

總結(jié)

至此伶氢,我們已經(jīng)對(duì)Tomcat的整體架構(gòu)有了大致的了解趟径,從圖A、B癣防、C蜗巧、D可以看出來(lái)每一個(gè)組件的基本要素和作用。我們?cè)谀X海里應(yīng)該有一個(gè)大概的輪廓了劣砍!


--- 轉(zhuǎn)載自微信公眾號(hào)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末惧蛹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子刑枝,更是在濱河造成了極大的恐慌香嗓,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件装畅,死亡現(xiàn)場(chǎng)離奇詭異靠娱,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)掠兄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)像云,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蚂夕,你說(shuō)我怎么就攤上這事迅诬。” “怎么了婿牍?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵侈贷,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我等脂,道長(zhǎng)俏蛮,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任上遥,我火速辦了婚禮搏屑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘粉楚。我一直安慰自己辣恋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布模软。 她就那樣靜靜地躺著伟骨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪撵摆。 梳的紋絲不亂的頭發(fā)上底靠,一...
    開(kāi)封第一講書(shū)人閱讀 49,842評(píng)論 1 290
  • 那天害晦,我揣著相機(jī)與錄音特铝,去河邊找鬼暑中。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鲫剿,可吹牛的內(nèi)容都是我干的鳄逾。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼灵莲,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼雕凹!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起政冻,我...
    開(kāi)封第一講書(shū)人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤枚抵,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后明场,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體汽摹,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年苦锨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逼泣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡舟舒,死狀恐怖拉庶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情秃励,我是刑警寧澤氏仗,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站莺治,受9級(jí)特大地震影響廓鞠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谣旁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一床佳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧榄审,春花似錦砌们、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至饼问,卻和暖如春影兽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背莱革。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工峻堰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留讹开,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓捐名,卻偏偏與公主長(zhǎng)得像旦万,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子镶蹋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容