Tomcat整體架構解析

2021-08-28 00:09:00 字數 3777 閱讀 4140

2元件的生命線lifecycle

啟動流程

pipeline valve機制

tomcat中的設計模式

comment:本文基於tomcat7.0.68

架構圖: 

從頂層開始:

connector接受到請求後,會將請求交給container,container處理完了之後將結果返回給connector 

下面看container的結構: 

standard****x*是元件介面的預設實現類。

tomcat 還有其它元件,如安全元件 security、logger、session、naming 等其它元件。這些元件共同為 connector 和 container 提供必要的服務。

tomcat中很多元件具有生命週期,如初始化、啟動、關閉,這些元件的生命週期具有共性,因此tomcat中將其抽象為介面lifecycle,來控制項的生命週期,它通過事件機制實現各個容器間的內部通訊。 

lifecycle介面的方法: 

繼承關係圖: 

standardserver,standardservice,connector和上面4個容器等很多元件都實現了lifecycle,元件實現這個介面就可以統一被擁有它的元件控制了,這樣一層一層的直到乙個最高端的元件就可以控制 tomcat 中所有元件的生命週期,這個最高的元件就是server

在bin目錄下執行了./startup.sh 或者執行 ./catalina.bat start命令時,實際呼叫了bootstrap啟動類的main方法,並傳遞了start引數。 

bootstrap#main方法的啟動流程: 

參考附上別人總結的一張啟動時序圖: 

補充如下:

同上,service的startinternal呼叫container.start,呼叫了engine,host的startinternal,context的start在**呼叫了? 

關於connector初始化和啟動的更多細節,可參考本人另一篇blog 

介面中定義的方法: 

乙個pipeline包含多個valve,這些閥共分為兩類,一類叫基礎閥(通過getbasic、setbasic方法呼叫),一類是普通閥(通過addvalve、removevalve呼叫)。管道都是包含在容器中,所以有getcontainer和setcontainer方法。乙個管道一般有乙個基礎閥(通過setbasic新增),可以有0到多個普通閥(通過addvalve新增)。 

isasyncsupported:當管道中的所有閥門都支援非同步時返回ture,否則返回false 

該介面的標準實現是:org.apache.catalina.core.standardpipeline介面方法:

重點關注setnext、getnext、invoke這三個方法,通過setnext設定該閥的下一閥,通過getnext返回該閥的下乙個閥的引用,invoke方法則執行該閥內部自定義的請求處理**。 

valvebase:是valve介面的基本實現 

四大容器類r都有各自預設的標準valve實現。它們分別是

valve實現了具體業務邏輯單元。可以定製化valve(實現特定介面),然後配置在server.xml裡。每層容器都可以配置相應的valve,當只在其作用域內有效。例如engine容器裡的valve只對其包含的所有host裡的應用有效。 

配置舉例:

……  

當在server.xml檔案中配置了乙個定製化valve時,會呼叫pipeline物件的addvalve方法,將valve以鍊錶方式組織起來,**如下;

@override

public void addvalve(valve valve) catch (lifecycleexception e) }}

// add this valve to the set associated with this pipeline

//將配置的valve新增到鍊錶中,並且每個容器的標準valve在鍊錶的尾端

if (first == null) else

current = current.getnext();}}

container.firecontainerevent(container.add_valve_event, valve);

}

valve按照容器作用域的配置順序來組織valve,每個valve都設定了指向下乙個valve的next引用。同時,每個容器預設的標準valve都存在於valve鍊錶尾端,最後被呼叫。 

pipeline內部維護first和basic兩個閥,其它相關閥通過getnext來獲取。

標準valve的呼叫邏輯圖:

從standardenginevalve開始,所有的基礎閥的實現最後都會呼叫其下一級容器,所有的普通閥都會執行getnext().invoke(request, response);當採用tomcat預設初始配置時,valve鏈如下:

這些閥門valve通過invoke方法彼此串聯起來,最終構成的執行順序十分類似於乙個管道。

把通用的骨架步驟抽象到父類中,子類去實現特定的某些步驟。

舉例: 

如lifecyclebase類中init和start方法,其中的nitinternal和startinternal方法是抽象方法,所有容易都直接或間接繼承了lifecyclebase,在初始化和啟動時被每個容器會呼叫其init和start方法,這些抽象方法都是在子類中實現的。

tomcat通過lifecyclelistener對元件生命週期元件lifecycle進行監聽,各個元件在其生命期中會有各種行為,而這些行為都會觸發相應的事件,tomcat就是通過偵聽這些事件達到對這些行為進行擴充套件的目的。在看元件的init和start過程中會看到大量如:firelifecycleevent(configure_start_event, null);這樣的**,這就是對某一型別事件的觸發,如果你想在其中加入自己的行為,就只用註冊相應型別的事件即可。

Tomcat的整體架構

tomcat通過聯結器和容器這兩個核心元件完成整體工作,聯結器負責處理socket連線和網路位元組流與request和response物件的轉化 容器負責載入和管理servlet,以及具體處理request請求。在學習tomcat整體架構前需要知道,tomcat 支援的多種 i o 模型和應用層協議...

tomcat整體架構與組成

前言 半年前剛接觸tomcat感覺很抽象,看了很多網上的文章,但眾說分壇不能輕易分辨對錯,最後結合權威書籍摘取正確的tomcat概念結合圖示才在腦海裡把tomcat的形象具體化。tomcat算是乙個server web伺服器 乙個servlet容器 1.server service n 2.serv...

Tomcat是如何執行的?整體架構又是怎樣的?

在許多的高階開發的崗位中都會或多或少有要求面試人員要研究過一些常用中介軟體原始碼。這是因為一切的秘密都是藏在原始碼中,閱讀原始碼能夠讓我們對框架或者中介軟體的理解更加深刻,而我們也能夠在原始碼的研究中獲得其中一些優秀的設計方式。而我們的中介軟體和原始碼那麼多,我們該從何入手呢?其實大部分的中介軟體或...