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