讓面試官顫抖的Tomcat系統(tǒng)架構(gòu)系列!

前言

俗話說,站在巨人的肩膀上看世界,一般學習的時候也是先總覽一下整體,然后逐個部分個個擊破,最后形成思路,了解具體細節(jié),Tomcat的結(jié)構(gòu)很復雜,但是 Tomcat 非常的模塊化,找到了 Tomcat最核心的模塊,問題才可以游刃而解,了解了Tomcat的整體架構(gòu)對以后深入了解Tomcat來說至關重要!

創(chuàng)新互聯(lián)建站是一家專業(yè)提供靈寶企業(yè)網(wǎng)站建設,專注與成都網(wǎng)站建設、成都網(wǎng)站設計、H5網(wǎng)站設計、小程序制作等業(yè)務。10年已為靈寶眾多企業(yè)、政府機構(gòu)等服務。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設公司優(yōu)惠進行中。

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

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

讓面試官顫抖的Tomcat系統(tǒng)架構(gòu)系列!

Tomcat中最頂層的容器是Server,代表著整個服務器,從上圖中可以看出,一個Server可以包含至少一個Service,用于具體提供服務。

Service主要包含兩個部分:Connector和Container。從上圖中可以看出 Tomcat 的心臟就是這兩個組件,他們的作用如下:

讓面試官顫抖的Tomcat系統(tǒng)架構(gòu)系列!

一個Tomcat中只有一個Server,一個Server可以包含多個Service,一個Service只有一個Container,但是可以有多個Connectors,這是因為一個服務可以有多個連接,如同時提供Http和Https鏈接,也可以提供向相同協(xié)議不同端口的連接,示意圖如下(Engine、Host、Context下邊會說到):

讓面試官顫抖的Tomcat系統(tǒng)架構(gòu)系列!

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

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

讓面試官顫抖的Tomcat系統(tǒng)架構(gòu)系列!

詳細的配置文件文件內(nèi)容可以到Tomcat官網(wǎng)查看:http://tomcat.apache.org/tomcat-8.0-doc/index.html

上邊的配置文件,還可以通過下邊的一張結(jié)構(gòu)圖更清楚的理解:

讓面試官顫抖的Tomcat系統(tǒng)架構(gòu)系列!

Server標簽設置的端口號為8005,shutdown=”SHUTDOWN” ,表示在8005端口監(jiān)聽“SHUTDOWN”命令,如果接收到了就會關閉Tomcat。一個Server有一個Service,當然還可以進行配置,一個Service有多個,Service左邊的內(nèi)容都屬于Container的,Service下邊是Connector。

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

(1)Tomcat中只有一個Server,一個Server可以有多個Service,一個Service可以有多個Connector和一個Container;

(2) Server掌管著整個Tomcat的生死大權(quán);

(4)Service 是對外提供服務的;

(5)Connector用于接受請求并將請求封裝成Request和Response來具體處理;

(6)Container用于封裝和管理Servlet,以及具體處理request請求;

知道了整個Tomcat頂層的分層架構(gòu)和各個組件之間的關系以及作用,對于絕大多數(shù)的開發(fā)人員來說Server和Service對我們來說確實很遠,而我們開發(fā)中絕大部分進行配置的內(nèi)容是屬于Connector和Container的,所以接下來介紹一下Connector和Container。

三、Connector和Container的微妙關系

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

Connector最底層使用的是Socket來進行連接的,Request和Response是按照HTTP協(xié)議來封裝的,所以Connector同時需要實現(xiàn)TCP/IP協(xié)議和HTTP協(xié)議!

Tomcat既然處理請求,那么肯定需要先接收到這個請求,接收請求這個東西我們首先就需要看一下Connector!

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

Connector用于接受請求并將請求封裝成Request和Response,然后交給Container進行處理,Container處理完之后在交給Connector返回給客戶端。

因此,我們可以把Connector分為四個方面進行理解:

讓面試官顫抖的Tomcat系統(tǒng)架構(gòu)系列!

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

讓面試官顫抖的Tomcat系統(tǒng)架構(gòu)系列!

Connector就是使用ProtocolHandler來處理請求的,不同的ProtocolHandler代表不同的連接類型,比如:Http11Protocol使用的是普通Socket來連接的,Http11NioProtocol使用的是NioSocket來連接的。

其中ProtocolHandler由包含了三個部件:Endpoint、Processor、Adapter。

(1)Endpoint用來處理底層Socket的網(wǎng)絡連接,Processor用于將Endpoint接收到的Socket封裝成Request,Adapter用于將Request交給Container進行具體的處理。

(2)Endpoint由于是處理底層的Socket網(wǎng)絡連接,因此Endpoint是用來實現(xiàn)TCP/IP協(xié)議的,而Processor用來實現(xiàn)HTTP協(xié)議的,Adapter將請求適配到Servlet容器進行具體的處理。

(3)Endpoint的抽象實現(xiàn)AbstractEndpoint里面定義的Acceptor和AsyncTimeout兩個內(nèi)部類和一個Handler接口。Acceptor用于監(jiān)聽請求,AsyncTimeout用于檢查異步Request的超時,Handler用于處理接收到的Socket,在內(nèi)部調(diào)用Processor進行處理。

至此,我們應該很輕松的回答(1)(2)(3)的問題了,但是(4)還是不知道,那么我們就來看一下Container是如何進行處理的以及處理完之后是如何將處理完的結(jié)果返回給Connector的?

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

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

讓面試官顫抖的Tomcat系統(tǒng)架構(gòu)系列!

4個子容器的作用分別是:

讓面試官顫抖的Tomcat系統(tǒng)架構(gòu)系列!

下面找一個Tomcat的文件目錄對照一下,如下圖所示:

讓面試官顫抖的Tomcat系統(tǒng)架構(gòu)系列!

Context和Host的區(qū)別是Context表示一個應用,我們的Tomcat中默認的配置下webapps下的每一個文件夾目錄都是一個Context,其中ROOT目錄中存放著主應用,其他目錄存放著子應用,而整個webapps就是一個Host站點。

我們訪問應用Context的時候,如果是ROOT下的則直接使用域名就可以訪問,例如:www.ledouit.com,如果是Host(webapps)下的其他應用,則可以使用www.ledouit.com/docs進行訪問,當然默認指定的根應用(ROOT)是可以進行設定的,只不過Host站點下默認的主營用是ROOT目錄下的。

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

六、Container如何處理請求的

Container處理請求是使用Pipeline-Valve管道來處理的!(Valve是閥門之意)

Pipeline-Valve是責任鏈模式,責任鏈模式是指在一個請求處理的過程中有很多處理者依次對請求進行處理,每個處理者負責做自己相應的處理,處理完之后將處理后的請求返回,再讓下一個處理著繼續(xù)處理。

讓面試官顫抖的Tomcat系統(tǒng)架構(gòu)系列!

但是!Pipeline-Valve使用的責任鏈模式和普通的責任鏈模式有些不同!區(qū)別主要有以下兩點:

讓面試官顫抖的Tomcat系統(tǒng)架構(gòu)系列!

我們知道Container包含四個子容器,而這四個子容器對應的BaseValve分別在:StandardEngineValve、StandardHostValve、StandardContextValve、StandardWrapperValve。

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

讓面試官顫抖的Tomcat系統(tǒng)架構(gòu)系列!

(1)Connector在接收到請求后會首先調(diào)用最頂層容器的Pipeline來處理,這里的最頂層容器的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)當執(zhí)行到StandardWrapperValve的時候,會在StandardWrapperValve中創(chuàng)建FilterChain,并調(diào)用其doFilter方法來處理請求,這個FilterChain包含著我們配置的與請求相匹配的Filter和Servlet,其doFilter方法會依次調(diào)用所有的Filter的doFilter方法和Servlet的service方法,這樣請求就得到了處理!

(4)當所有的Pipeline-Valve都執(zhí)行完之后,并且處理完了具體的請求,這個時候就可以將返回的結(jié)果交給Connector了,Connector在通過Socket的方式將結(jié)果返回給客戶端。

總結(jié)

至此,我們已經(jīng)對Tomcat的整體架構(gòu)有了大致的了解,從圖A、B、C、D可以看出來每一個組件的基本要素和作用。我們在腦海里應該有一個大概的輪廓了!如果你面試的時候,讓你簡單的聊一下Tomcat,上面的內(nèi)容你能脫口而出嗎?當你能夠脫口而出的時候,這位面試官一定會對你刮目相看的!

本文名稱:讓面試官顫抖的Tomcat系統(tǒng)架構(gòu)系列!
文章起源:http://www.muchs.cn/article4/jdosie.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、用戶體驗、移動網(wǎng)站建設、響應式網(wǎng)站、網(wǎng)站設計公司虛擬主機

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設