Tomcat

數(shù)據(jù)存儲(chǔ)和消息隊(duì)列

Tomcat

1. Tomcat的基礎(chǔ)架構(gòu)(Server、Service、Connector、Container)

Tomcat的頂層容器是Server代表整個(gè)服務(wù)器。一個(gè)Server可以包含至少一個(gè)Service,用于提供具體服務(wù)。
Service包含兩部分:Connectior:用于處理連接相關(guān)的事情,并提供Socket與Request和Response相關(guān)的轉(zhuǎn)化。以及Container:用于封裝和管理Servlet以及處理具體Request請求。

一個(gè)Tomcat中只有一個(gè)Server,一個(gè)Server可以包含多個(gè)Service,一個(gè)Service只有一個(gè)Container但可以存在多個(gè)Connectors,因?yàn)榉?wù)可以由多個(gè)連接(如同時(shí)提供Http和Https連接,也可以提供向相同協(xié)議不同端口的鏈接)。

多個(gè)Connector和一個(gè)Container形成了一個(gè)Service。Service對外提供服務(wù),而整個(gè)Tomcat的生命周期由Server控制。我們開發(fā)中絕大部分進(jìn)行配置的內(nèi)容是屬于Connector和Container的。

請求流程:

  1. 請求發(fā)送到Tomcat之后,首先經(jīng)過Service然后教給Connector
  2. Connector接收請求并將接收的請求封裝為Request和Response來具體處理,封裝完成后再交由Container進(jìn)行處理。
  3. Container處理完請求之后再返回給Connector,由Connector通過Socket將處理的結(jié)果返回給客戶端。

Connector使用ProtocolHandler來處理請求的,不同的ProtocolHandler代表不同的連接類型。它包含了三個(gè)組件:
--> Endpoint:用于處理底層Socket的網(wǎng)絡(luò)連接,實(shí)現(xiàn)TCP/IP協(xié)議,它的抽象實(shí)現(xiàn)AbstractEndpoint里面定義了Acceptor和AsyncTimeout兩個(gè)內(nèi)部類和一個(gè)Handler接口。Acceptor用于監(jiān)聽請求,,AsyncTimeout用于檢查異步Request的超時(shí),Handler用于處理接收到的Socket,在內(nèi)部調(diào)用Processor進(jìn)行處理。
--> Processor:用于將Endpoint接收到的Socket封裝成Request,它實(shí)現(xiàn)Http協(xié)議。
--> Adapter:用于將Request交給Container進(jìn)行具體的處理。

Container內(nèi)部包含四個(gè)子容器:
--> Engine:引擎。用來管理多個(gè)站點(diǎn)。一個(gè)Service最多只能有一個(gè)Engine。
--> Host:代表一個(gè)站點(diǎn),虛擬主機(jī),通過配置Host就可以添加站點(diǎn)。
--> Context:代表一個(gè)應(yīng)用程序,對應(yīng)著平時(shí)開發(fā)的一套程序,或者一個(gè)WEB-INF目錄以及下面的web.xml文件。Tomcat默認(rèn)的配置下webapp下的每一個(gè)文件夾目錄都是一個(gè)Context,ROOT目錄存放主應(yīng)用,其他目錄存放子應(yīng)用。而整個(gè)webapp就是一個(gè)Host站點(diǎn)。
--> Wrapper:每一個(gè)Wrapper封裝著一個(gè)Servlet

2. Tomcat如何加載Servlet的

請參見下面第三題最后部分(從FilterChain部分開始)。

3. Pipeline-Valve機(jī)制

Pipeline-value屬于責(zé)任鏈模式。
普通責(zé)任鏈模式指在一個(gè)請求處理的過程中有很多處理者依次對請求進(jìn)行處理,每個(gè)處理者負(fù)責(zé)做自己相應(yīng)的處理,處理完成之后將處理后的請求返回,再讓下一個(gè)處理者繼續(xù)處理。

但Pipeline-Value使用的責(zé)任鏈模式與普通責(zé)任鏈有不同。

  1. 每個(gè)PipeLine都有特定的value。而且是在管道的最后一個(gè)執(zhí)行。這個(gè)value叫做BaseValue,它是不可刪除的。
  2. 上層容器的管道的BaseValue中會(huì)調(diào)用下層容器的管道。

Connector接到請求后首先調(diào)用最頂層容器的Pipeline來處理(EnginePipeline)。在Engine的管道中依次執(zhí)行EngineValue1,EngineValue2等等,最后執(zhí)行StandardEngineValue,在這里會(huì)調(diào)用Host管道,再依次執(zhí)行HostValue1,HostValue2,最后執(zhí)行StandardHostValue,然后再依次調(diào)用Context和Wrapper的管道。

最后執(zhí)行StandaradWrapperValue時(shí),在其中創(chuàng)建FilterChain,并調(diào)用其doFilter方法來處理請求。這個(gè)FilterChain包含著我們配置的與請求相匹配的Filter和Servlet。其doFilter方法會(huì)依次調(diào)用所有的Filter的doFilter方法和Servlet的service方法,這樣請求就得到了處理。這時(shí)將返回結(jié)果交還給Connector,Connector再通過Socket的方式將結(jié)果返回給客戶端。

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

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

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