俗話說(shuō),站在巨人的肩膀上看世界,一般學(xué)習(xí)的時(shí)候也是先總覽一下整體,然后逐個(gè)部分個(gè)個(gè)擊破,最后形成思路,了解具體細(xì)節(jié),Tomcat的結(jié)構(gòu)很復(fù)雜,但是 Tomcat 非常的模塊化,找到了 Tomcat最核心的模塊,問(wèn)題才可以游刃而解,了解了Tomcat的整體架構(gòu)對(duì)以后深入了解Tomcat來(lái)說(shuō)至關(guān)重要!
創(chuàng)新互聯(lián)建站是一家專(zhuān)業(yè)提供靈寶企業(yè)網(wǎng)站建設(shè),專(zhuān)注與成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、H5網(wǎng)站設(shè)計(jì)、小程序制作等業(yè)務(wù)。10年已為靈寶眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。
先上一張Tomcat的頂層結(jié)構(gòu)圖(圖A),如下:
Tomcat中最頂層的容器是Server,代表著整個(gè)服務(wù)器,從上圖中可以看出,一個(gè)Server可以包含至少一個(gè)Service,用于具體提供服務(wù)。
Service主要包含兩個(gè)部分:Connector和Container。從上圖中可以看出 Tomcat 的心臟就是這兩個(gè)組件,他們的作用如下:
一個(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ō)到):
多個(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)
詳細(xì)的配置文件文件內(nèi)容可以到Tomcat官網(wǎng)查看:http://tomcat.apache.org/tomcat-8.0-doc/index.html
上邊的配置文件,還可以通過(guò)下邊的一張結(jié)構(gòu)圖更清楚的理解:
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。
(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。
由上述內(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用于接受請(qǐng)求并將請(qǐng)求封裝成Request和Response,然后交給Container進(jìn)行處理,Container處理完之后在交給Connector返回給客戶端。
因此,我們可以把Connector分為四個(gè)方面進(jìn)行理解:
首先看一下Connector的結(jié)構(gòu)圖(圖B),如下所示:
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用于封裝和管理Servlet,以及具體處理Request請(qǐng)求,在Connector內(nèi)部包含了4個(gè)子容器,結(jié)構(gòu)圖如下(圖C):
4個(gè)子容器的作用分別是:
下面找一個(gè)Tomcat的文件目錄對(duì)照一下,如下圖所示:
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-Valve管道來(lái)處理的?。╒alve是閥門(mén)之意)
Pipeline-Valve是責(zé)任鏈模式,責(zé)任鏈模式是指在一個(gè)請(qǐng)求處理的過(guò)程中有很多處理者依次對(duì)請(qǐng)求進(jìn)行處理,每個(gè)處理者負(fù)責(zé)做自己相應(yīng)的處理,處理完之后將處理后的請(qǐng)求返回,再讓下一個(gè)處理著繼續(xù)處理。
但是!Pipeline-Valve使用的責(zé)任鏈模式和普通的責(zé)任鏈模式有些不同!區(qū)別主要有以下兩點(diǎn):
我們知道Container包含四個(gè)子容器,而這四個(gè)子容器對(duì)應(yīng)的BaseValve分別在:StandardEngineValve、StandardHostValve、StandardContextValve、StandardWrapperValve。
Pipeline的處理流程圖如下(圖D):
(1)Connector在接收到請(qǐng)求后會(huì)首先調(diào)用最頂層容器的Pipeline來(lái)處理,這里的最頂層容器的Pipeline就是EnginePipeline(Engine的管道);
(2)在Engine的管道中依次會(huì)執(zhí)行EngineValve1、EngineValve2等等,最后會(huì)執(zhí)行StandardEngineValve,在StandardEngineValve中會(huì)調(diào)用Host管道,然后再依次執(zhí)行Host的HostValve1、HostValve2等,最后在執(zhí)行StandardHostValve,然后再依次調(diào)用Context的管道和Wrapper的管道,最后執(zhí)行到StandardWrapperValve。
(3)當(dāng)執(zhí)行到StandardWrapperValve的時(shí)候,會(huì)在StandardWrapperValve中創(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-Valve都執(zhí)行完之后,并且處理完了具體的請(qǐng)求,這個(gè)時(shí)候就可以將返回的結(jié)果交給Connector了,Connector在通過(guò)Socket的方式將結(jié)果返回給客戶端。
至此,我們已經(jīng)對(duì)Tomcat的整體架構(gòu)有了大致的了解,從圖A、B、C、D可以看出來(lái)每一個(gè)組件的基本要素和作用。我們?cè)谀X海里應(yīng)該有一個(gè)大概的輪廓了!如果你面試的時(shí)候,讓你簡(jiǎn)單的聊一下Tomcat,上面的內(nèi)容你能脫口而出嗎?當(dāng)你能夠脫口而出的時(shí)候,這位面試官一定會(huì)對(duì)你刮目相看的!
本文名稱(chēng):讓面試官顫抖的Tomcat系統(tǒng)架構(gòu)系列!
文章起源:http://jinyejixie.com/article4/jdosie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷(xiāo)推廣、用戶體驗(yàn)、移動(dòng)網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站、網(wǎng)站設(shè)計(jì)公司、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)