Tomcat原理整理
目錄接口
功能組件
Tomcat 的核心功能有兩個(gè),分別是負(fù)責(zé)接收和反饋外部請(qǐng)求的連接器 Connector,和負(fù)責(zé)處理請(qǐng)求的容器 Container。其中連接器和容器相輔相成,多個(gè) Connector 和一個(gè) Container 一起構(gòu)成了基本的 web 服務(wù) Service。每個(gè) Server可以管理多個(gè) Service,整個(gè) Tomcat 的生命周期由 Server 控制。
Connector:負(fù)責(zé)對(duì)外接收反饋請(qǐng)求。是tomcat與外界的交通樞紐,監(jiān)聽端口接收外界請(qǐng)求,并將請(qǐng)求處理后傳遞給容器做業(yè)務(wù)處理。最后將容器處理后的結(jié)果反饋給外界。
Container:負(fù)責(zé)對(duì)內(nèi)處理業(yè)務(wù)邏輯。內(nèi)部由Engine、Host、Context、Wrapper四個(gè)容器組成,用于管理和調(diào)用Servlet相關(guān)邏輯。
Service:對(duì)外提供的Web服務(wù)。主要包含連接器和容器兩個(gè)核心組件,以及其他功能組件,Tomcat可以管理多個(gè)Service,且各Service之間相互獨(dú)立。
Tomcat 還有其它重要的組件,如安全組件 security、logger 日志組件、session、mbeans、naming 等其它組件。這些組件共同為 Connector 和 Container 提供必要的服務(wù)
Connector
1,監(jiān)聽網(wǎng)絡(luò)端口,接收和響應(yīng)網(wǎng)絡(luò)請(qǐng)求
Connector 最重要的功能就是接收連接請(qǐng)求然后分配線程讓 Container 來處理這個(gè)請(qǐng)求
2,將收到的請(qǐng)求(網(wǎng)絡(luò)字節(jié)流)轉(zhuǎn)換成Request 和Response,分配線程來處理,同時(shí)將Request 和 Response 傳給線程,處理這個(gè)請(qǐng)求的線程是在?Container 容器中(Container 將請(qǐng)求轉(zhuǎn)換為ServletRequest ,ServletResponse)完成處理。
請(qǐng)求處理時(shí)序圖:
Container
每個(gè) Service 會(huì)包含一個(gè)容器。容器由一個(gè)引擎可以管理多個(gè)虛擬主機(jī)。每個(gè)虛擬主機(jī)可以管理多個(gè) Web 應(yīng)用。每個(gè) Web 應(yīng)用會(huì)有多個(gè) Servlet 包裝器。Engine、Host、Context 和 Wrapper,四個(gè)容器之間屬于父子關(guān)系。
通常一個(gè) Servlet class 對(duì)應(yīng)一個(gè) Wrapper。
Engine:引擎,管理多個(gè)虛擬主機(jī),子容器是Host。
Host:虛擬主機(jī),負(fù)責(zé)Web應(yīng)用的部署。Host 是 Engine 的字容器,一個(gè) Host 在 Engine 中代表一個(gè)虛擬主機(jī),這個(gè)虛擬主機(jī)的作用就是運(yùn)行多個(gè)應(yīng)用,它負(fù)責(zé)安裝和展開這些應(yīng)用,并且標(biāo)識(shí)這個(gè)應(yīng)用以便能夠區(qū)分它們。它的子容器通常是 Context,它除了關(guān)聯(lián)子容器外,還有就是保存一個(gè)主機(jī)應(yīng)該有的信息。
Context:Web應(yīng)用,包含多個(gè)Servlet封裝器。Context 最重要的功能就是管理它里面的 Servlet 實(shí)例,Servlet 實(shí)例在 Context 中是以 Wrapper 出現(xiàn)的,還有一點(diǎn)就是 Context 如何才能找到正確的 Servlet 來執(zhí)行它呢? Tomcat5 以前是通過一個(gè) Mapper 類來管理的,Tomcat5 以后這個(gè)功能被移到了 request 中,在前面的時(shí)序圖中就可以發(fā)現(xiàn)獲取子容器都是通過 request 來分配的。
Wrapper:封裝器,容器的最底層,沒有子容器,Wrapper 代表一個(gè) Servlet,它負(fù)責(zé)管理一個(gè) Servlet,包括的 Servlet 的裝載、初始化、執(zhí)行以及資源回收。
容器的請(qǐng)求處理過程就是在 Engine、Host、Context 和 Wrapper 這四個(gè)容器之間層層調(diào)用,最后在 Servlet 中執(zhí)行對(duì)應(yīng)的業(yè)務(wù)邏輯。各容器都會(huì)有一個(gè)通道 Pipeline,每個(gè)通道上都會(huì)有一個(gè) Basic Valve(如StandardEngineValve), 類似一個(gè)閘門用來處理 Request 和 Response 。其流程圖如下。
Engine 和 Host 處理請(qǐng)求的時(shí)序圖:
Context 和 wrapper 的處理請(qǐng)求時(shí)序圖:
從 Tomcat5 開始,子容器的路由放在了 request 中,request 中保存了當(dāng)前請(qǐng)求正在處理的 Host、Context 和 wrapper。
Tomcat請(qǐng)求整體處理:
假設(shè)客戶端發(fā)送請(qǐng)求:http://mp.csdn.net/postedit/hello.jsp
請(qǐng)求被發(fā)送到本機(jī)端口8080,被在那里偵聽的Coyote HTTP/1.1 Connector獲得
1)Connector的主要任務(wù)是負(fù)責(zé)接收瀏覽器的發(fā)過來的 tcp 連接請(qǐng)求,創(chuàng)建一個(gè) Request 和 Response 對(duì)象分別用于和請(qǐng)求端交換數(shù)據(jù),然后會(huì)產(chǎn)生一個(gè)線程來處理這個(gè)請(qǐng)求并把產(chǎn)生的?Request?和?Response?對(duì)象傳給處理這個(gè)請(qǐng)求的線程
2) Connector把該請(qǐng)求交給它所在的Service的Engine來處理,并等待來自Engine的回應(yīng)
3) Engine獲得請(qǐng)求mp.csdn.net/postedit/hello.jsp,匹配它所擁有的所有虛擬主機(jī)Host
4) Engine匹配到名為localhost的Host(即使匹配不到也把請(qǐng)求交給該Host處理,因?yàn)樵揌ost被定義為該Engine的默認(rèn)主機(jī))
5) localhost Host獲得請(qǐng)求/postedit/hello.jsp,匹配它所擁有的所有Context
6) Host匹配到路徑為/hello.jsp的Context(如果匹配不到就把該請(qǐng)求交給路徑名為”"的Context去處理)
7) path=”/postedit”的Context獲得請(qǐng)求/postedit/hello.jsp,在它的mapping table中尋找對(duì)應(yīng)的servlet
8) Context匹配到URL PATTERN為*.jsp的servlet,對(duì)應(yīng)于JspServlet類
9) 構(gòu)造HttpServletRequest對(duì)象和HttpServletResponse對(duì)象,作為參數(shù)調(diào)用JspServlet的doGet或doPost方法
10)Context把執(zhí)行完了之后的HttpServletResponse對(duì)象返回給Host
11)Host把HttpServletResponse對(duì)象返回給Engine
12)Engine把HttpServletResponse對(duì)象返回給Connector
13)Connector把HttpServletResponse對(duì)象返回給客戶browser
總結(jié)
以上是生活随笔為你收集整理的Tomcat原理整理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [LeetCode]题解(python)
- 下一篇: Atlas应用程序调试技巧