自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Tomcat源碼解析 | 整體架構(gòu)及組件

開發(fā) 架構(gòu)
追溯至互聯(lián)網(wǎng)的萌芽時期,Sun 公司(后被 Oracle 納入麾下)洞察到了這一時代機遇,便推出了 Applet 以支持 Web 應(yīng)用。然而,Applet 并未如預(yù)期般在業(yè)界掀起波瀾。Sun 在反思之后,意識到機遇與市場前景皆不可辜負,于是決定投身于制定一套新的規(guī)范,Servlet 便應(yīng)運而生。

前言

Tomcat,昔日名為 Catalina,本是輕巧的 Servlet 容器。Catalina,美國加州海岸線上一顆璀璨的明珠。或許,Tomcat 的締造者寄望于此,期冀將 Tomcat 塑造為一款既優(yōu)雅又輕盈的 Web 服務(wù)器。自 4.x 版本起,Tomcat 不再局限于 Servlet 的支持,而是增添了諸多新功能,如 JSP、EL、命名服務(wù)等,從而超越了 Catalina 的范疇。

既然 Tomcat 的核心身份乃 Servlet 容器,我們便應(yīng)更加關(guān)注 Servlet 本身。

何謂 Servlet?

追溯至互聯(lián)網(wǎng)的萌芽時期,Sun 公司(后被 Oracle 納入麾下)洞察到了這一時代機遇,便推出了 Applet 以支持 Web 應(yīng)用。然而,Applet 并未如預(yù)期般在業(yè)界掀起波瀾。Sun 在反思之后,意識到機遇與市場前景皆不可辜負,于是決定投身于制定一套新的規(guī)范,Servlet 便應(yīng)運而生。

Servlet,乃 Sun 公司為使 Java 語言能夠編織動態(tài)且富有交互性的網(wǎng)頁,進而邁入 Web 編程之殿堂,所精心制定的一套規(guī)范。一個 Servlet 的核心職責可概括為以下三端:

  1. 構(gòu)建并充實 Request 對象,囊括 URI、參數(shù)、請求方式、頭部訊息、以及請求本體等。
  2. 創(chuàng)建 Response 對象。
  3. 運行業(yè)務(wù)邏輯,并將成果經(jīng)由 Response 的輸出流,傳遞至客戶端。

Servlet 自身并不包含 main 方法,故其執(zhí)行需依托于一容器之中,此容器之存在,正為支撐 Servlet 之功能。Tomcat,便是這樣一種 Servlet 容器的具象實現(xiàn)。

整體架構(gòu)圖:

圖片圖片

在 Tomcat 的架構(gòu)圖之中,兩個核心組件——連接器(Connector)與容器(Container)扮演著心臟般的關(guān)鍵角色,它們的重要性不言而喻。以下是它們各自的職責:

  1. 連接器(Connector)負責處理與連接相關(guān)的事務(wù),它將 Socket 連接轉(zhuǎn)化為 Request 和 Response 對象,以便進行后續(xù)處理。
  2. 容器(Container)則負責封裝與管理工作中的 Servlet,并具體承擔起處理 Request 請求的重任。

在 Tomcat 的體系結(jié)構(gòu)中,僅存在一個 Server 實例,而一個 Server 可以容納多個 Service。每個 Service 僅關(guān)聯(lián)一個 Container,但可以配備多個 Connectors。這樣的設(shè)計意味著一個服務(wù)能夠通過多個連接器來接納連接,例如同時提供 HTTP 與 HTTPS 協(xié)議的鏈接,或者針對同一協(xié)議的不同端口提供服務(wù)。架構(gòu)的示意圖如下(后續(xù)將詳細介紹 Engine、Host、Context 等組件):

圖片圖片

image.png

在 Tomcat 的宏偉藍圖中,多個 Connector 與一個 Container 共同構(gòu)成了 Service,正是 Service 使得 Tomcat 能夠向外提供服務(wù)。然而,Service 本身需要一個生存的依托,需要一個能夠賦予其生命、掌控其存亡的主宰,這個角色非 Server 莫屬。因此,Tomcat 的整個生命周期都受到 Server 的調(diào)控。

此外,這些組件之間的包含關(guān)系,或者說是層級關(guān)系,均可在 Tomcat 配置的心臟——conf目錄下的server.xml文件中一覽無余。在這個配置文件中,我們可以洞察到 Tomcat 的骨骼架構(gòu),理解各個組件如何相互連接、協(xié)作,共同支撐起整個服務(wù)器的運行。

圖片圖片

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

圖片圖片

image.png

在 Tomcat 的架構(gòu)中,各個組件各司其職,共同織就了一張精密的服務(wù)網(wǎng)絡(luò)。下面,讓我們逐一探究這些組件的獨特功能:

  1. Server:作為整個服務(wù)器的代表,Server 提供了一種簡潔而優(yōu)雅的方式,用以啟動和停止整個 Tomcat 系統(tǒng)。它使得我們無需單獨對連接器和容器進行繁瑣的啟停操作。
  2. Service:Service 代表著服務(wù)本身,一個 Server 可以運行多個 Service。例如,在單個 Tomcat 實例中,可以同時運行訂單服務(wù)、支付服務(wù)和用戶服務(wù)等。
  3. Connector:Connector 是連接的橋梁,一個 Service 可以包含多個 Connector,以支持多種通信協(xié)議。例如,可以同時支持 AJP、HTTP 和 HTTPS 協(xié)議,每種協(xié)議都可以通過特定的 Connector 來實現(xiàn)。但是每種協(xié)議最終執(zhí)行的 servlet 是相通的。
  4. Container:Container 是 Servlet 的棲息之地,它負責管理和執(zhí)行 Servlet。
  1. Engine:作為引擎,Engine 是 Container 的最高層級,它可以包含多個 Host。
  2. Host:Host 代表虛擬主機,每個 Host 可以包含多個 Context。
  3. Context:Context 是 Web 應(yīng)用的上下文,它定義了 Web 應(yīng)用的部署參數(shù)和路徑。
  4. Wrapper:Wrapper 是 Servlet 的包裝器,它負責 Servlet 的生命周期管理和資源分配。
  1. Service 服務(wù)之下還有各種支撐組件。
  2. Manager:Manager 是會話管理器,它負責管理用戶的會話(Session)。

  3. Logger:Logger 是日志管理器,它負責記錄和管理日志信息。

  4. Loader:Loader 是類加載器,它與類的加載機制相關(guān),通常由 Context 使用。

  5. Pipeline:Pipeline 是管道組件,它與 Valve 一起實現(xiàn)過濾器功能。

  6. Valve:Valve 是閥門組件,它與 Pipeline 配合,用于實現(xiàn)請求和響應(yīng)的過濾處理。

  7. Realm:Realm 是安全域,它負責認證和授權(quán)。

在 Tomcat 的架構(gòu)中,除了連接器和容器之外,Pipeline 和 Valve 也扮演著至關(guān)重要的角色。它們共同構(gòu)成了 Tomcat 強大的過濾和處理能力。通過一張圖,我們可以更直觀地理解這兩個組件如何在請求處理流程中發(fā)揮作用。

圖片圖片

Connector 和 Container 的微妙關(guān)系

在 Tomcat 的宏偉舞臺之上,當一個請求翩翩而至,它的旅程便開始了:

  1. Service:請求首先抵達 Service,這是 Tomcat 服務(wù)的起點,調(diào)度著整個服務(wù)的流程。
  2. Connector:隨后,請求被引導至 Connector,它是 Tomcat 的忠實門衛(wèi),負責接收來自遠方的請求。Connector 將原始的網(wǎng)絡(luò)連接轉(zhuǎn)化為符合 HTTP 協(xié)議的 Request 和 Response 對象。
  3. Container:Request 和 Response 在 Connector 的精心包裝后,便被遞交至 Container。它負責管理和執(zhí)行 Servlet,對請求進行細致的處理。
  4. 處理與返回:Container 在處理完請求后,將結(jié)果交回 Connector。Connector 再次承擔起信使的角色,通過 Socket 將處理結(jié)果沿著 TCP/IP 協(xié)議的路徑,送回客戶端。

在整個過程中,Connector 不僅是溝通客戶端與服務(wù)器的橋梁,更是實現(xiàn) TCP/IP 協(xié)議和 HTTP 協(xié)議的使者。它確保了請求和響應(yīng)的準確傳遞,使得整個 Web 服務(wù)順利的流轉(zhuǎn)起來

Connector 架構(gòu)分析

連接器(Connector)猶如一扇溝通外界與應(yīng)用系統(tǒng)的窗口,負責接收來自客戶端的請求,將其轉(zhuǎn)化為標準化的 Request 和 Response 對象,并交給容器(Container)進行處理。Container 處理完后再交給 Connector 返回給客戶端。從功能上看,我們可以將連接器拆解為以下三個核心環(huán)節(jié):

  1. 請求的捕獲: 連接器如何精準地捕捉到來自客戶端的海量請求?
  2. 請求與響應(yīng)的封裝: 連接器是如何將紛繁復(fù)雜的原始請求數(shù)據(jù),規(guī)范地封裝成 Request 對象,并將容器處理后的結(jié)果打包成 Response 對象的?
  3. 請求的傳遞與響應(yīng)的回傳: 封裝后的 Request 對象如何被高效地傳遞給容器,而容器生成的 Response 對象又如何準確地返回給客戶端?

我們看下 Connector 的結(jié)構(gòu)圖,如下:

圖片圖片

Connector 的核心組件與工作原理

Connector 通過 ProtocolHandler 來處理各種類型的網(wǎng)絡(luò)請求。不同的 ProtocolHandler 對應(yīng)不同的連接方式,如Http11Protocol使用傳統(tǒng)的阻塞式 Socket,而 Http11NioProtocol 則采用高效的非阻塞式 NIO Socket。ProtocolHandler 主要由 Endpoint、Processor 和 Adapter 三個組件構(gòu)成:

  • Endpoint: 負責底層網(wǎng)絡(luò)連接的管理,包括 Socket 的創(chuàng)建、監(jiān)聽、接受以及連接的關(guān)閉。它相當于一個“門衛(wèi)”,負責把控所有進出系統(tǒng)的網(wǎng)絡(luò)流量。Endpoint 通常實現(xiàn)了 TCP/IP 協(xié)議棧的部分功能,用于建立可靠的網(wǎng)絡(luò)連接。
  • Processor: 專門負責將 Endpoint 接收到的原始 Socket 數(shù)據(jù)解析為標準化的 HTTP 請求(Request)。它可以看作是一個“翻譯官”,將底層的網(wǎng)絡(luò)字節(jié)流轉(zhuǎn)化為應(yīng)用程序可以理解的請求信息。Processor 實現(xiàn)了 HTTP 協(xié)議的具體細節(jié),包括請求行的解析、請求頭的處理、請求體的讀取等。
  • Adapter: 充當了連接器與容器之間的適配器。它將 Processor 處理好的 Request 對象傳遞給 Container,以便容器中的 Servlet 或其他組件對請求進行具體的處理。Adapter 的作用類似于一個“中介”,將不同層次的組件聯(lián)系起來。

Endpoint 內(nèi)部機制Endpoint 的抽象實現(xiàn) AbstractEndpoint 定義了幾個重要的內(nèi)部類和接口:

  • Acceptor: 負責監(jiān)聽來自客戶端的連接請求,一旦有新的連接到來,Acceptor 就會創(chuàng)建一個新的 Socket,并將其交給 Handler 處理。
  • AsyncTimeout: 用來監(jiān)控異步請求的超時情況。對于長時間未得到響應(yīng)的異步請求,AsyncTimeout 會采取相應(yīng)的處理措施,比如關(guān)閉連接或者觸發(fā)超時事件。
  • Handler: 是一個接口,定義了處理新連接的具體邏輯。當 Acceptor 接收到一個新的 Socket 時,會創(chuàng)建一個 Handler 實例,并將其與該 Socket 關(guān)聯(lián)起來。Handler 會調(diào)用 Processor 來解析請求,并將處理結(jié)果返回給客戶端。

小結(jié):

Connector 通過這三個組件的協(xié)同工作,實現(xiàn)了從接收客戶端請求到返回處理結(jié)果的整個過程。Endpoint 負責建立連接,Processor 負責解析請求,Adapter 負責將請求傳遞給容器。這種分層設(shè)計使得 Connector 具有良好的擴展性和可維護性。

Container 如何處理請求的

容器(Container)采用 Pipeline-Valve 管道機制來處理請求,這是一種基于責任鏈模式的設(shè)計。在請求處理過程中,多個 Valve 會依次對請求進行處理,每個 Valve 負責特定的任務(wù)。與傳統(tǒng)的責任鏈模式不同,Pipeline-Valve 具有以下特點:

  • 固定終點: 每個 Pipeline 都有一個特殊的 Valve,即 BaseValve。BaseValve 位于 Pipeline 的末端,不可刪除,確保每個請求都經(jīng)過它的處理。
  • 層級調(diào)用: 上層容器的 BaseValve 會調(diào)用下層容器的 Pipeline,形成一個嵌套的責任鏈,使得請求在不同層次的容器中依次得到處理。

Tomcat 中的四個標準容器(Engine、Host、Context、Wrapper)分別對應(yīng)一個 BaseValve:StandardEngineValve、StandardHostValve、StandardContextValve、StandardWrapperValve。

Pipeline 的處理流程圖如下:

圖片圖片

當 Connector 接收到一個請求時,它會將請求委派給最頂層的容器——Engine。Engine 擁有一個 Pipeline,就像一條流水線,流水線上的每個工位就是一個 Valve。這些 Valve 按照預(yù)定的順序?qū)φ埱筮M行處理。

  1. Engine 管道: 請求首先進入 Engine 的 Pipeline。在這個管道中,一系列 EngineValve 會依次對請求進行處理,例如進行全局性的日志記錄、安全檢查等。最后,StandardEngineValve 會將請求轉(zhuǎn)發(fā)給下一層容器——Host。
  2. 逐級傳遞: Host、Context、Wrapper 等容器都擁有自己的 Pipeline,它們會按照同樣的方式處理請求。每個容器的 BaseValve(如 StandardHostValve、StandardContextValve)負責將請求傳遞給下一層容器。
  3. FilterChain: 當請求到達 Wrapper 容器時,StandardWrapperValve 會創(chuàng)建一個 FilterChain。FilterChain 包含了與該請求匹配的所有 Filter 和 Servlet。這些 Filter 和 Servlet 會按照配置的順序依次執(zhí)行 doFilter 方法,最終調(diào)用 Servlet 的 service 方法來處理請求。
  4. 返回響應(yīng): 一旦請求處理完畢,響應(yīng)結(jié)果會沿著原路返回,經(jīng)過各個 Valve,最終由 Connector 發(fā)送回客戶端。

好了,我們已經(jīng)從整體上看到了 Tomcat 的結(jié)構(gòu),對于每個組件并沒有詳細分析。后續(xù)章節(jié)我們會從幾個方面來學習 Tomcat

責任編輯:武曉燕 來源: 碼上遇見你
相關(guān)推薦

2016-11-25 13:14:50

Flume架構(gòu)源碼

2020-05-19 21:40:35

Tomcat架構(gòu)Connector

2022-06-07 10:33:29

Camera組件鴻蒙

2020-04-28 22:58:33

Tomcat架構(gòu)Service

2024-09-11 09:25:03

Tomcat組件PREP

2017-07-17 11:52:54

jQuery源碼分析前端框架類庫

2014-08-19 10:30:30

Swift源碼OpenStack架構(gòu)

2020-10-30 13:30:26

SpringBoot代碼應(yīng)用

2023-12-13 08:31:23

2009-06-24 14:25:13

JSF整體架構(gòu)

2016-11-04 21:46:46

UnderscoreJavascript

2020-04-20 21:30:51

Tomcat部署架構(gòu)

2019-05-27 14:43:49

Tomcat架構(gòu)部署

2024-09-09 09:29:05

2010-05-25 17:01:44

2022-03-18 15:55:15

鴻蒙操作系統(tǒng)架構(gòu)

2023-05-09 13:38:28

2019-03-23 21:20:30

Android 谷歌架構(gòu)

2019-10-16 16:33:41

Docker架構(gòu)語言

2022-06-06 08:02:21

ahooks架構(gòu)hooks
點贊
收藏

51CTO技術(shù)棧公眾號