Tomcat系統(tǒng)架構(gòu)介紹_第1頁
Tomcat系統(tǒng)架構(gòu)介紹_第2頁
Tomcat系統(tǒng)架構(gòu)介紹_第3頁
Tomcat系統(tǒng)架構(gòu)介紹_第4頁
Tomcat系統(tǒng)架構(gòu)介紹_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、 Tomcat系統(tǒng)架構(gòu)介紹Tomcat的結(jié)構(gòu)很復(fù)雜,但它非常的模塊化,找到Tomcat最核心的模塊,問題就可以游刃而解。了解Tomcat的整體架構(gòu)對日后深入了解Tomcat來說至關(guān)重要!一、Tomcat頂層架構(gòu)先上一張Tomcat的頂層結(jié)構(gòu)圖(圖A),如下:(圖A)Tomcat中最頂層的容器是Server,代表著整個服務(wù)器,從上圖中可以看出,一個Server可以包含至少一個Service,用于具體提供服務(wù)。Service主要包含兩個部分:Connector和Container。從上圖中可以看出 Tomcat 的心臟就是這兩個組件,它們的作用如下:Connector用于處理連接相關(guān)的事情,并提供

2、Socket與Request和Response相關(guān)的轉(zhuǎn)化;Container用于封裝和管理Servlet,以及具體處理Request請求。一個Tomcat中只有一個Server,一個Server可以包含多個Service,一個Service只有一個Container,但是可以有多個Connectors,這是因?yàn)橐粋€服務(wù)可以有多個連接,如同時提供Http和Https鏈接,也可以提供向相同協(xié)議不同端口的連接,示意圖如下(Engine、Host、Context下邊會說到):多個 Connector 和一個 Container 就形成了一個 Service,有了 Service 就可以對外提供服務(wù)了。

3、但 Service 還要一個生存的環(huán)境,必須要有人能夠給它生命、掌握其生死大權(quán),而這就非 Server 莫屬。所以,整個 Tomcat 的生命周期由 Server 控制。另外,上述的包含關(guān)系或者說是父子關(guān)系,都可以在Tomcat的conf目錄下的server.xml配置文件中看出,下圖是刪除了注釋內(nèi)容之后的一個完整的server.xml配置文件(Tomcat版本為8.0)詳細(xì)的配置文件文件內(nèi)容可以到Tomcat官網(wǎng)查看:/tomcat-8.0-doc/index.html上邊的配置文件,還可以通過下面這張結(jié)構(gòu)圖更清楚地理解:Server標(biāo)簽設(shè)置的端口號為8005,shutdown=”SHUTD

4、OWN” ,表示在8005端口監(jiān)聽“SHUTDOWN”命令,如果接收到了就會關(guān)閉Tomcat。一個Server有一個Service,當(dāng)然還可以進(jìn)行配置,一個Service有多個,Service左邊的內(nèi)容都屬于Container的,Service下邊是Connector。二、Tomcat頂層架構(gòu)小結(jié)Tomcat中只有一個Server,一個Server可以有多個Service,一個Service可以有多個Connector和一個Container;Server掌管著整個Tomcat的生死大權(quán);Service 是對外提供服務(wù)的;Connector用于接受請求并將請求封裝成Request和Respon

5、se來具體處理;Container用于封裝和管理Servlet,以及具體處理request請求。以上是整個Tomcat頂層的分層架構(gòu)和各個組件之間的關(guān)系以及作用,對于絕大多數(shù)的開發(fā)人員來說,Server和Service對我們來說確實(shí)很遠(yuǎn),而開發(fā)中絕大部分進(jìn)行配置的內(nèi)容是屬于Connector和Container的,所以接下來介紹一下Connector和Container。三、Connector和Container的微妙關(guān)系由上述內(nèi)容我們大致可以知道:一個請求發(fā)送到Tomcat之后,首先經(jīng)過Service然后會交給我們的Connector,Connector用于接收請求,并將接收的請求封裝為Re

6、quest和Response來具體處理。Request和Response封裝完之后再交由Container進(jìn)行處理,Container處理完請求之后再返回給Connector,最后在由Connector通過Socket將處理的結(jié)果返回給客戶端,這樣整個請求的就處理完了!Connector最底層使用的是Socket來進(jìn)行連接的,Request和Response是按照HTTP協(xié)議來封裝的,所以Connector同時需要實(shí)現(xiàn)TCP/IP協(xié)議和HTTP協(xié)議。Tomcat既然處理請求,那么肯定需要先接收到這個請求,而想要接收請求這個東西,我們首先就需要看一下Connector。四、Connector架構(gòu)

7、分析Connector用于接受請求并將請求封裝成Request和Response,然后交給Container進(jìn)行處理,Container處理完之后在交給Connector返回給客戶端。因此,我們可以把Connector分為四個方面進(jìn)行理解:(1)Connector如何接受請求的?(2)如何將請求封裝成Request和Response的?(3)封裝完之后的Request和Response如何交給Container進(jìn)行處理的?(4)Container處理完之后如何交給Connector并返回給客戶端的?首先看一下Connector的結(jié)構(gòu)圖(圖B):(圖B)Connector就是使用Protocol

8、Handler來處理請求的,不同的ProtocolHandler代表不同的連接類型,比如:Http11Protocol使用的是普通Socket來連接的,Http11NioProtocol使用的是NioSocket來連接的。其中ProtocolHandler由包含了三個部件:Endpoint、Processor、Adapter。Endpoint用來處理底層Socket的網(wǎng)絡(luò)連接,Processor用于將Endpoint接收到的Socket封裝成Request,Adapter用于將Request交給Container進(jìn)行具體的處理。Endpoint由于是處理底層的Socket網(wǎng)絡(luò)連接,因此Endp

9、oint是用來實(shí)現(xiàn)TCP/IP協(xié)議的,而Processor用來實(shí)現(xiàn)HTTP協(xié)議的,Adapter將請求適配到Servlet容器進(jìn)行具體的處理。Endpoint的抽象實(shí)現(xiàn)AbstractEndpoint里面定義的Acceptor和AsyncTimeout兩個內(nèi)部類和一個Handler接口。Acceptor用于監(jiān)聽請求,AsyncTimeout用于檢查異步Request的超時,Handler用于處理接收到的Socket,在內(nèi)部調(diào)用Processor進(jìn)行處理。至此,我們應(yīng)該很輕松回答了(1)(2)(3)的問題,但(4)還是不知道。接下來我們就來看一下Container是如何進(jìn)行處理的,以及處理完之后

10、是如何將處理完的結(jié)果返回給Connector的。五、Container架構(gòu)分析Container用于封裝和管理Servlet,以及具體處理Request請求,在Connector內(nèi)部包含了4個子容器,結(jié)構(gòu)圖如下(圖C):(圖C)4個子容器的作用分別是:(1)Engine:引擎,用來管理多個站點(diǎn),一個Service最多只能有一個Engine;(2)Host:代表一個站點(diǎn),也可以叫虛擬主機(jī),通過配置Host就可以添加站點(diǎn);(3)Context:代表一個應(yīng)用程序,對應(yīng)著平時開發(fā)的一套程序,或者一個WEB-INF目錄以及下面的web.xml文件;(4)Wrapper:每一Wrapper封裝著一個Ser

11、vlet。下面找一個Tomcat的文件目錄對照一下:Context和Host的區(qū)別是Context表示一個應(yīng)用,我們的Tomcat中默認(rèn)的配置下webapps下的每一個文件夾目錄都是一個Context,其中ROOT目錄中存放著主應(yīng)用,其他目錄存放著子應(yīng)用,而整個webapps就是一個Host站點(diǎn)。我們訪問應(yīng)用Context的時候,如果是ROOT下的則直接使用域名就可以訪問,例如:,如果是Host(webapps)下的其他應(yīng)用,則可以使用/docs進(jìn)行訪問。當(dāng)然默認(rèn)指定的根應(yīng)用(ROOT)是可以進(jìn)行設(shè)定的,只不過Host站點(diǎn)下默認(rèn)的主營用是ROOT目錄下的??吹竭@里我們知道Container是什

12、么,但還是不知道Container是如何進(jìn)行處理的,以及處理完之后是如何將處理完的結(jié)果返回給Connector的。別急,下邊就開始探討一下Container是如何進(jìn)行處理的。六、Container如何處理請求的Container處理請求是使用Pipeline-Valve管道來處理的?。╒alve是閥門之意)Pipeline-Valve是責(zé)任鏈模式,責(zé)任鏈模式是指在一個請求處理的過程中有很多處理者依次對請求進(jìn)行處理,每個處理者負(fù)責(zé)做自己相應(yīng)的處理,處理完之后將處理后的請求返回,再讓下一個處理著繼續(xù)處理。但是,Pipeline-Valve使用的責(zé)任鏈模式和普通的責(zé)任鏈模式有些不同,區(qū)別主要有以下兩

13、點(diǎn):(1)每個Pipeline都有特定的Valve,而且是在管道的最后一個執(zhí)行,這個Valve叫做BaseValve,BaseValve是不可刪除的;(2)在上層容器的管道的BaseValve中會調(diào)用下層容器的管道。我們知道Container包含四個子容器,而這四個子容器對應(yīng)的BaseValve分別在:StandardEngineValveStandardHostValveStandardContextValveStandardWrapperValvePipeline的處理流程圖如下(圖D):(圖D)(1)Connector在接收到請求后會首先調(diào)用最頂層容器的Pipeline來處理,這里的最頂

14、層容器的Pipeline就是EnginePipeline(Engine的管道)。(2)在Engine的管道中依次會執(zhí)行EngineValve1、EngineValve2等等,最后會執(zhí)行StandardEngineValve,在StandardEngineValve中會調(diào)用Host管道,然后再依次執(zhí)行Host的HostValve1、HostValve2等,最后在執(zhí)行StandardHostValve,然后再依次調(diào)用Context的管道和Wrapper的管道,最后執(zhí)行到StandardWrapperValve。(3)當(dāng)執(zhí)行到StandardWrapperValve的時候,會在StandardWrapperValve中創(chuàng)建FilterChain,并調(diào)用其doFilter方法來處理請求,這個FilterChain包含著我們配置的與請求相匹配的Filter和Servlet,其doFilter方法會依次調(diào)用所有的Filter的doFilter方法和Servlet的service方法,這樣請求就得到了

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論