溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎樣解析Tomcat內(nèi)部結(jié)構(gòu)和請求過程

發(fā)布時間:2022-01-12 17:42:07 來源:億速云 閱讀:157 作者:柒染 欄目:服務(wù)器

怎樣解析Tomcat內(nèi)部結(jié)構(gòu)和請求過程,針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

概述

Tomcat是一個JSP/Servlet容器。其作為Servlet容器,有三種工作模式:獨立的Servlet容器、進程內(nèi)的Servlet容器和進程外的Servlet容器。

Tomcat的組織結(jié)構(gòu)

Tomcat是一個基于組件的服務(wù)器,它的構(gòu)成組件都是可配置的,其中最外層的是Catalina  servlet容器,其他組件按照一定的格式要求配置在這個頂層容器中。

Tomcat的各種組件都是在Tomcat安裝目錄下的/conf/server.xml文件中配置的。

由Server.xml的結(jié)構(gòu)看Tomcat的體系結(jié)構(gòu)

怎樣解析Tomcat內(nèi)部結(jié)構(gòu)和請求過程

由上可得出Tomcat的體系結(jié)構(gòu):

怎樣解析Tomcat內(nèi)部結(jié)構(gòu)和請求過程

Tomcat的體系結(jié)構(gòu)

由上圖可看出Tomca的心臟是兩個組件:Connecter和Container。一個Container可以選擇多個Connecter,多個Connector和一個Container就形成了一個Service。Service可以對外提供服務(wù),而Server服務(wù)器控制整個Tomcat的生命周期。

  • 組件的生命線“Lifecycle”

  • Service 和 Server 管理它下面組件的生命周期。

  • Tomcat 中組件的生命周期是通過 Lifecycle  接口來控制的,組件只要繼承這個接口并實現(xiàn)其中的方法就可以統(tǒng)一被擁有它的組件控制了,這樣一層一層的直到一個最高級的組件就可以控制 Tomcat  中所有組件的生命周期,這個最高的組件就是 Server,而控制 Server 的是 Startup,也就是您啟動和關(guān)閉 Tomcat。

Tomca的兩大組件:Connecter和Container

Connecter組件

一個Connecter將在某個指定的端口上偵聽客戶請求,接收瀏覽器的發(fā)過來的 tcp 連接請求,創(chuàng)建一個 Request 和 Response  對象分別用于和請求端交換數(shù)據(jù),然后會產(chǎn)生一個線程來處理這個請求并把產(chǎn)生的 Request 和 Response  對象傳給處理Engine(Container中的一部分),從Engine出獲得響應(yīng)并返回客戶。

Tomcat中有兩個經(jīng)典的Connector,一個直接偵聽來自Browser的HTTP請求,另外一個來自其他的WebServer請求。Cotote  HTTP/1.1 Connector在端口8080處偵聽來自客戶Browser的HTTP請求,Coyote JK2  Connector在端口8009處偵聽其他Web Server的Servlet/JSP請求。

Connector 最重要的功能就是接收連接請求然后分配線程讓 Container 來處理這個請求,所以這必然是多線程的,多線程的處理是  Connector 設(shè)計的核心。

Container組件

Container的體系結(jié)構(gòu)如下:

怎樣解析Tomcat內(nèi)部結(jié)構(gòu)和請求過程

Container的體系結(jié)構(gòu)

Container是容器的父接口,該容器的設(shè)計用的是典型的責(zé)任鏈的設(shè)計模式,它由四個自容器組件構(gòu)成,分別是Engine、Host、Context、Wrapper。這四個組件是負責(zé)關(guān)系,存在包含關(guān)系。通常一個Servlet  class對應(yīng)一個Wrapper,如果有多個Servlet定義多個Wrapper,如果有多個Wrapper就要定義一個更高的Container,如Context。

Context 還可以定義在父容器 Host 中,Host 不是必須的,但是要運行 war 程序,就必須要 Host,因為 war 中必有 web.xml  文件,這個文件的解析就需要 Host 了,如果要有多個 Host 就要定義一個 top 容器 Engine 了。而 Engine 沒有父容器了,一個  Engine 代表一個完整的 Servlet 引擎。

  • Engine 容器

  • Engine 容器比較簡單,它只定義了一些基本的關(guān)聯(lián)關(guān)系

  • Host 容器

  • Host 是 Engine 的字容器,一個 Host 在 Engine  中代表一個虛擬主機,這個虛擬主機的作用就是運行多個應(yīng)用,它負責(zé)安裝和展開這些應(yīng)用,并且標(biāo)識這個應(yīng)用以便能夠區(qū)分它們。它的子容器通常是  Context,它除了關(guān)聯(lián)子容器外,還有就是保存一個主機應(yīng)該有的信息。

  • Context 容器

  • Context 代表 Servlet 的 Context,它具備了 Servlet 運行的基本環(huán)境,理論上只要有 Context 就能運行 Servlet  了。簡單的 Tomcat 可以沒有 Engine 和 Host。Context 最重要的功能就是管理它里面的 Servlet 實例,Servlet 實例在  Context 中是以 Wrapper 出現(xiàn)的,還有一點就是 Context 如何才能找到正確的 Servlet 來執(zhí)行它呢? Tomcat5 以前是通過一個  Mapper 類來管理的,Tomcat5 以后這個功能被移到了 request 中,在前面的時序圖中就可以發(fā)現(xiàn)獲取子容器都是通過 request  來分配的。

  • Wrapper 容器

  • Wrapper 代表一個 Servlet,它負責(zé)管理一個 Servlet,包括的 Servlet 的裝載、初始化、執(zhí)行以及資源回收。Wrapper  是最底層的容器,它沒有子容器了,所以調(diào)用它的 addChild 將會報錯。

  • Wrapper 的實現(xiàn)類是 StandardWrapper,StandardWrapper 還實現(xiàn)了擁有一個 Servlet 初始化信息的  ServletConfig,由此看出 StandardWrapper 將直接和 Servlet 的各種信息打交道。

Tomcat 中其它組件

Tomcat 還有其它重要的組件,如安全組件 security、logger 日志組件、session、mbeans、naming  等其它組件。這些組件共同為 Connector 和 Container 提供必要的服務(wù)。

Tomcat Server處理一個HTTP請求的過程

怎樣解析Tomcat內(nèi)部結(jié)構(gòu)和請求過程

Tomcat Server處理一個HTTP請求的過程

Tomcat Server處理一個HTTP請求的過程

1、用戶點擊網(wǎng)頁內(nèi)容,請求被發(fā)送到本機端口8080,被在那里監(jiān)聽的Coyote HTTP/1.1 Connector獲得。

2、Connector把該請求交給它所在的Service的Engine來處理,并等待Engine的回應(yīng)。

3、Engine獲得請求localhost/test/index.jsp,匹配所有的虛擬主機Host。

4、Engine匹配到名為localhost的Host(即使匹配不到也把請求交給該Host處理,因為該Host被定義為該Engine的默認(rèn)主機),名為localhost的Host獲得請求/test/index.jsp,匹配它所擁有的所有的Context。Host匹配到路徑為/test的Context(如果匹配不到就把該請求交給路徑名為“  ”的Context去處理)。

5、path=“/test”的Context獲得請求/index.jsp,在它的mapping  table中尋找出對應(yīng)的Servlet。Context匹配到URL PATTERN為*.jsp的Servlet,對應(yīng)于JspServlet類。

6、構(gòu)造HttpServletRequest對象和HttpServletResponse對象,作為參數(shù)調(diào)用JspServlet的doGet()或doPost().執(zhí)行業(yè)務(wù)邏輯、數(shù)據(jù)存儲等程序。

7、Context把執(zhí)行完之后的HttpServletResponse對象返回給Host。

8、Host把HttpServletResponse對象返回給Engine。

9、Engine把HttpServletResponse對象返回Connector。

10、Connector把HttpServletResponse對象返回給客戶Browser。

關(guān)于怎樣解析Tomcat內(nèi)部結(jié)構(gòu)和請求過程問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI