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