日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

tomcat架构分析(概览)【转】

發布時間:2025/4/5 编程问答 10 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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是?

引用 http://www.mydomain.com/app/index.html


詳細情況如圖所示。?
?

  • 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的類路徑是:?

引用 org.apache.catalina.valves.RequestDumperValve



valve機制是tomcat非常重要的處理邏輯的機制,會在相關文檔里專門描述。 如果這個valve配置在server.xml的節點下,則其只打印出訪問這個app(my)的request與response消息。?

Xml代碼??
  • <Host?name="localhost"?appBase="webapps"??
  • ??????????unpackWARs="true"?autoDeploy="true"??
  • ??????????xmlValidation="false"?xmlNamespaceAware="false">??
  • ?????????????<Context?path="/my"?docBase="?/usr/local/tomcat/backup/my"?>??
  • ???????????????????<Valve?className="org.apache.catalina.valves.RequestDumperValve"/>??
  • ?????????????</Context>??
  • ?????????????<Context?path="/my2"?docBase="?/usr/local/tomcat/backup/my"?>??
  • ?????????????</Context>??
  • ??</Host>??

  • 如果這個valve配置在server.xml的節點下,則其可以打印出訪問這個host下兩個app的request與response消息。?

    Xml代碼??
  • <Host?name="localhost"?appBase="webapps"??
  • ????????????????unpackWARs="true"?autoDeploy="true"??
  • ????????????????xmlValidation="false"?xmlNamespaceAware="false">??
  • ????????????????????<Valve?className="org.apache.catalina.valves.RequestDumperValve"/>??
  • ????????????????????<Context?path="/my"?docBase="?/usr/local/tomcat/backup/my"?>??
  • ????????????????????</Context>??
  • ????????????????????<Context?path="/my2"?docBase="?/usr/local/tomcat/backup/my"?>???
  • ????????????????????</Context>??
  • ??</Host>??


  • 在這里貼一個缺省的server.xml的配置,通過這些配置可以加深對tomcat核心架構分層模塊的理解,關于tomcat的配置,在相關的文檔里另行說明。為了篇幅,我把里面的注釋給刪了。?

    Xml代碼??
  • <Server?port="8005"?shutdown="SHUTDOWN">??
  • ?????????<Listener?className="org.apache.catalina.core.AprLifecycleListener"?SSLEngine="on"?/>??
  • ?????????<Listener?className="org.apache.catalina.core.JasperListener"?/>???
  • ?????????<Listener?className="org.apache.catalina.mbeans.ServerLifecycleListener"?/>??
  • ?????????<Listener?className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"?/>??
  • ?????????<GlobalNamingResources>??
  • ??????????????<Resource?name="UserDatabase"?auth="Container"??
  • ??????????????????????type="org.apache.catalina.UserDatabase"??
  • ?????????????????????description="User?database?that?can?be?updated?and?saved"??
  • ?????????????????????factory="org.apache.catalina.users.MemoryUserDatabaseFactory"??
  • ?????????????????????pathname="conf/tomcat-users.xml"?/>???
  • ??????????</GlobalNamingResources>??
  • ??????????<Service?name="Catalina">??
  • ???????????????<Executor?name="tomcatThreadPool"?namePrefix="catalina-exec-"???
  • ?????????????????????maxThreads="150"?minSpareThreads="4"/>??
  • ???????????????<Connector?port="80"?protocol="HTTP/1.1"???
  • ?????????????????????connectionTimeout="20000"???
  • ?????????????????????redirectPort="7443"?/>??
  • ???????????????<Connector?port="7009"?protocol="AJP/1.3"?redirectPort="7443"?/>??
  • ???????????????<Engine?name="Catalina"?defaultHost="localhost">??
  • ????????????????????<Realm?className="org.apache.catalina.realm.UserDatabaseRealm"??
  • ???????????????????????????resourceName="UserDatabase"/>??
  • ????????????????????<Host?name="localhost"?appBase="webapps"??
  • ???????????????????????????unpackWARs="true"?autoDeploy="true"??
  • ???????????????????????????xmlValidation="false"?xmlNamespaceAware="false">??
  • ???????????????????????????<Context?path="/my"?docBase="/usr/local/tomcat/backup/my"?>??
  • ???????????????????????????</Context>???
  • ????????????????????</Host>???
  • ????????????????</Engine>??
  • ????????????</Service>??
  • ??</Server>??

  • 至此,頭腦中應該有tomcat整體架構的概念。有時間在寫些其他模塊的東西。

    轉載于:https://www.cnblogs.com/davidwang456/articles/11452621.html

    總結

    以上是生活随笔為你收集整理的tomcat架构分析(概览)【转】的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。