tomcat架构分析(概览)【转】
原文地址:?https://www.iteye.com/blog/gearever-1532822
Tomcat是目前應用比較多的servlet容器。關于tomcat本身的特點及介紹,網上已經有很多描述了,這里不再贅述。Tomcat除了能夠支撐通常的web app外,其本身高度模塊化的架構體系,也能帶來最大限度的可擴展性。目前tomcat版本已經衍生到tomcat7,但是主流的版本還是tomcat6。此系列架構體系介紹還是以tomcat6為藍本。?
Tomcat是有一系列邏輯模塊組織而成,這些模塊主要包括:?
- 核心架構模塊,例如Server,Service,engine,host和context及wrapper等
- 網絡接口模塊connector
- log模塊
- session管理模塊
- jasper模塊
- naming模塊
- JMX模塊
- 權限控制模塊
- ……
這些模塊會在相關的文檔里逐一描述,本篇文檔以介紹核心架構模塊為主。?
核心架構模塊說明?
核心架構模塊之間是層層包含關系。例如可以說Service是Server的子組件,Server是Service的父組件。在server.xml已經非常清晰的定義了這些組件之間的關系及配置。?
需要強調的是Service中配置了實際工作的Engine,同時配置了用來處理時間業務的線程組Executor(如果沒有配置則用系統默認的WorkThread模式的線程組),以及處理網絡socket的相關組件connector。詳細情況如圖所示。?
?
圖中,1:n代表一對多的關系;1:1代表一對一的關系。?
StandEngine, StandHost, StandContext及StandWrapper是容器,他們之間有互相的包含關系。例如,StandEngine是StandHost的父容器,StandHost是StandEngine的子容器。在StandService內還包含一個Executor及Connector。?
1) Executor是線程池,它的具體實現是java的concurrent包實現的executor,這個不是必須的,如果沒有配置,則使用自寫的worker thread線程池?
2) Connector是網絡socket相關接口模塊,它包含兩個對象,ProtocolHandler及Adapter?
- ProtocolHandler是接收socket請求,并將其解析成HTTP請求對象,可以配置成nio模式或者傳統io模式
- Adapter是處理HTTP請求對象,它就是從StandEngine的valve一直調用到StandWrapper的valve
分層建模?
對于上述的各個邏輯模塊,理解起來可能比較抽象。其實一個服務器無非是接受HTTP request,然后處理請求,產生HTTP response通過原有連接返回給客戶端(瀏覽器)。那為什么會整出這么多的模塊進行處理,這些模塊是不是有些多余。?
其實這些模塊各司其職,我們從底層wrapper開始講解,一直上溯到頂層的server。這樣易于理解。通過這些描述,會發現這正是tomcat架構的高度模塊化的體現。這些細分的模塊,使得tomcat非常健壯,通過一些配置和模塊定制化,可以很大限度的擴展tomcat。?
首先,我們以一個典型的頁面訪問為例,假設訪問的URL是?
詳細情況如圖所示。?
?
- Wrapper封裝了具體的訪問資源,例如 index.html
- Context 封裝了各個wrapper資源的集合,例如 app
- Host 封裝了各個context資源的集合,例如 www.mydomain.com
按照領域模型,這個典型的URL訪問,可以解析出三層領域對象,他們之間互有隸屬關系。這是最基本的建模。從上面的分析可以看出,從wrapper到host是層層遞進,層層組合。那么host 資源的集合是什么呢,就是上面所說的engine。 如果說以上的三個容器可以看成是物理模型的封裝,那么engine可以看成是一種邏輯的封裝。?
好了,有了這一整套engine的支持,我們已經可以完成從engine到host到context再到某個特定wrapper的定位,然后進行業務邏輯的處理了(關于怎么處理業務邏輯,會在之后的blog中講述)。就好比,一個酒店已經完成了各個客房等硬件設施的建設與裝修,接下來就是前臺接待工作了。?
先說線程池,這是典型的線程池的應用。首先從線程池中取出一個可用線程(如果有的話),來處理請求,這個組件就是connector。它就像酒店的前臺服務員登記客人信息辦理入住一樣,主要完成了HTTP消息的解析,根據tomcat內部的mapping規則,完成從engine到host到context再到某個特定wrapper的定位,進行業務處理,然后將返回結果返回。之后,此次處理結束,線程重新回到線程池中,為下一次請求提供服務。
如果線程池中沒有空閑線程可用,則請求被阻塞,一直等待有空閑線程進行處理,直至阻塞超時。線程池的實現有executor及worker thread兩種。缺省的是worker thread 模式。?
至此,可以說一個酒店有了前臺接待,有了房間等硬件設施,就可以開始正式運營了。那么把engine,處理線程池,connector封裝在一起,形成了一個完整獨立的處理單元,這就是service,就好比某個獨立的酒店。?
通常,我們經常看見某某集團旗下酒店。也就是說,每個品牌有多個酒店同時運營。就好比tomcat中有多個service在獨自運行。那么這多個service的集合就是server,就好比是酒店所屬的集團。?
作用域?
那為什么要按層次分別封裝一個對象呢?這主要是為了方便統一管理。類似命名空間的概念,在不同層次的配置,其作用域不一樣。以tomcat自帶的打印request與response消息的RequestDumperValve為例。這個valve的類路徑是:?
valve機制是tomcat非常重要的處理邏輯的機制,會在相關文檔里專門描述。 如果這個valve配置在server.xml的節點下,則其只打印出訪問這個app(my)的request與response消息。?
如果這個valve配置在server.xml的節點下,則其可以打印出訪問這個host下兩個app的request與response消息。?
在這里貼一個缺省的server.xml的配置,通過這些配置可以加深對tomcat核心架構分層模塊的理解,關于tomcat的配置,在相關的文檔里另行說明。為了篇幅,我把里面的注釋給刪了。?
至此,頭腦中應該有tomcat整體架構的概念。有時間在寫些其他模塊的東西。
轉載于:https://www.cnblogs.com/davidwang456/articles/11452621.html
總結
以上是生活随笔為你收集整理的tomcat架构分析(概览)【转】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一块钱哪里去了?--java浮点型背后的
- 下一篇: tomcat架构分析(connector