Tomcat功能與架構(gòu)分析解析課件_第1頁
Tomcat功能與架構(gòu)分析解析課件_第2頁
Tomcat功能與架構(gòu)分析解析課件_第3頁
Tomcat功能與架構(gòu)分析解析課件_第4頁
Tomcat功能與架構(gòu)分析解析課件_第5頁
已閱讀5頁,還剩89頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

保密北京恒華偉業(yè)科技股份有限公司2012年09月Tomcat功能與架構(gòu)設(shè)計分析保密北京恒華偉業(yè)科技股份有限公司Tomcat功能與架構(gòu)設(shè)計2目錄1.Java類加載機制2.Tomcat總體框架結(jié)構(gòu)分析4.Tomcat的物理結(jié)構(gòu)5.Tomcat典型功能與設(shè)計分析6.實用配置與常見問題2目錄1.Java類加載機制2.Tomcat總體框3Java類加載機制類加載是java語言提供的最強大的機制之一。盡管類加載并不是熱點話題,但作為編程人員都應(yīng)該了解其工作機制,明白怎樣去配合其工作。熟悉了類加載機制可以使我們節(jié)省很多時間,而不必浪費在調(diào)試ClassNotFoundException等異常上,且為我們開發(fā)高擴展性的應(yīng)用程序提供了一些思路。類加載的作用:加載Java應(yīng)用程序所需的字節(jié)碼文件(*.class、*.jar);提供一種在運行時動態(tài)、靈活地定位資源(代碼和數(shù)據(jù))的方式;允許在運行時利用多種不同資源創(chuàng)建應(yīng)用程序,并提供命名空間機制,使同一資源的多個版本在虛擬機上共存;可與安全體系結(jié)構(gòu)集成;提供在運行時組裝應(yīng)用程序所需的服務(wù)。3Java類加載機制類加載是java語言提供的最強大的機制4Java類加載器Java缺省使用如下三種類型類裝入器啟動(Bootstrap)類加載器:引導(dǎo)類裝入器是用本地代碼實現(xiàn)的類裝入器,它負責(zé)將<Java_Runtime_Home>/lib下面的類庫加載到內(nèi)存中。由于引導(dǎo)類加載器涉及到虛擬機本地實現(xiàn)細節(jié),開發(fā)者無法直接獲取到啟動類加載器的引用,所以不允許直接通過引用進行操作。標(biāo)準(zhǔn)擴展(Extension)類加載器:擴展類加載器是由Sun的ExtClassLoader(sun.misc.Launcher$ExtClassLoader)實現(xiàn)的。它負責(zé)將<Java_Runtime_Home>/lib/ext或者由系統(tǒng)變量java.ext.dir指定位置中的類庫加載到內(nèi)存中。開發(fā)者可以直接使用標(biāo)準(zhǔn)擴展類加載器。系統(tǒng)(System)類加載器:系統(tǒng)類加載器是由Sun的AppClassLoader(sun.misc.Launcher$AppClassLoader)實現(xiàn)的。它負責(zé)將系統(tǒng)類路徑(CLASSPATH)中指定的類庫加載到內(nèi)存中。開發(fā)者可以直接使用系統(tǒng)類加載器。4Java類加載器Java缺省使用如下三種類型類裝入器啟動5類加載器的委托機制1.首先判斷該類型是否已經(jīng)被加載2.如果沒有被加載,就委托給父類加載或者委派給啟動類加載器加載3.如果存在父類加載器,就委派給父類加載器加載4.如果不存在父類加載器,就檢查是否是由啟動類加載器加載的類5.如果父類加載器和啟動類加載器都不能完成加載任務(wù),才調(diào)用自身的加載功能5類加載器的委托機制1.首先判斷該類型是否已經(jīng)被加載2.6Tomcat中類加載器Common類加載器負責(zé)加載TomcatHOME/common/class下的.Class文件和common/lib中的jar包,這些類可以被Tomcat內(nèi)核和每個Web應(yīng)用程序都可以看見,如servlet.jar等Catalina類加載器從server/classes和server/lib下加載類,Catalina加載的類只對Tomcat服務(wù)器內(nèi)核可見,對Web應(yīng)用程序不可見,對于運行Tomcat內(nèi)核的線程,它的上下文類加載器就是Catalina類加載器Shared類加載器負責(zé)從share/classes和share/lib中加載類,它加載的類只對所有Web應(yīng)用程序有效,對Tomcat不可見.WebappX類加載器負責(zé)加載Web應(yīng)用程序的/web-INF/classes和lib目錄下的類,只對當(dāng)前Web應(yīng)用程序有效,對于運行每個Web應(yīng)用程序的線程,他們的上下文類加載器就是它們各自的WebappX類加載器6Tomcat中類加載器Common類加載器負責(zé)加載Tomc7目錄1.Java類加載機制2.Tomcat總體框架結(jié)構(gòu)分析4.Tomcat的物理結(jié)構(gòu)5.Tomcat典型功能與設(shè)計分析6.實用配置與常見問題7目錄1.Java類加載機制2.Tomcat總體框8Tomcat總體框架結(jié)構(gòu)分析Tocmat的各種組件通過相互作用,形成一個完善的有機體。8Tomcat總體框架結(jié)構(gòu)分析Tocmat的各種組件通過相互9Tomcat總體框架結(jié)構(gòu)分析Server

Server代表整個Catalinaservlet容器。在server.xml配置文件中必須是頂層元素且唯一,給它配置的屬性代表整個容器的屬性。

默認實現(xiàn):org.apache.catalina.core.StandardServerListener

所有server.xml中的監(jiān)聽器都實現(xiàn)了LifecycleListener接口。當(dāng)server中的各種組件在start、stop等事件發(fā)生時觸發(fā)相應(yīng)的操作。

如:JasperListener用來在所有web應(yīng)用程序啟動前初始化jasper(JSP編譯)。9Tomcat總體框架結(jié)構(gòu)分析Server

10Tomcat總體框架結(jié)構(gòu)分析

Service

Service是這樣一個集合:它由一個或者多個Connector,以及一個共享的處理引擎(Engine)組成。Engine負責(zé)處理所有Connector所獲得的客戶請求。

默認實現(xiàn):

org.apache.catalina.core.StandardService10Tomcat總體框架結(jié)構(gòu)分析

11Tomcat總體框架結(jié)構(gòu)分析Connector

一個連接器(Connector)將在某個指定端口上偵聽客戶請求,并將獲得的請求交給Engine來處理,從Engine處獲得響應(yīng)結(jié)果,并返回給客戶端。

Tomcat有兩個典型的連接器,一個直接偵聽來自客戶端瀏覽器的http請求,一個偵聽來自其它Web服務(wù)器的請求。

11Tomcat總體框架結(jié)構(gòu)分析Connector

12Connector的工作原理CoyoteHttp/1.1Connector在端口8080處偵聽來自客戶瀏覽器的http請求,CoyoteJK2Connector在端口8009處偵聽來自其它Web服務(wù)器(比如Apache)的servlet/jsp代理請求。

當(dāng)使用CoyoteHttp/1.1Connector時,Tomcat作為獨立的Web容器,同時扮演Web服務(wù)器和Servlet容器的雙重角色。當(dāng)使用CoyoteJK2Connector時,Tomcat只扮演Servlet容器的角色,Web服務(wù)器則由Apache或者其他服務(wù)器來提供,由于這些專有的Web服務(wù)器在處理靜態(tài)資源的性能和效率上要比Tomcat提供的Web服務(wù)器要好,所以經(jīng)常將Tomcat和Apache配合使用。12Connector的工作原理Coyote13Tomcat總體框架結(jié)構(gòu)分析Engine

處理引擎(Engine)代表一個Service所屬的請求處理機,它接受所有連接器傳遞過來的客戶端請求,將處理結(jié)果返回給連接器,由連接器將最終響應(yīng)返回給客戶端。Engine必須配置在Service組件下。

處理引擎下可以配置多個虛擬主機(VirtualHost),每個虛擬主機都有一個域名。當(dāng)處理引擎獲得一個請求時,它把該請求匹配到某個虛擬主機上,把請求交給該虛擬主機來處理。處理引擎有一個默認虛擬主機,當(dāng)請求無法匹配到任何一個虛擬主機上時,交給默認虛擬主機來處理。

默認實現(xiàn):org.apache.catalina.core.StandardEngine13Tomcat總體框架結(jié)構(gòu)分析Engine

14Tomcat總體框架結(jié)構(gòu)分析Host

代表一個虛擬主機,每個虛擬主機和某個網(wǎng)絡(luò)域名(DomainName)相匹配。每個虛擬主機下都可以部署(deploy)一個或者多個Web應(yīng)用程序(WebApplication),每個Web應(yīng)用程序?qū)?yīng)于一個Context,有一個Contextpath。當(dāng)虛擬主機獲得一個請求時,將把該請求匹配到某個Context上,然后把該請求交給該Context來處理。匹配的方法是“最長匹配”,一個path=""的Context將成為該虛擬主機的默認Context。所有無法和其它Context的路徑名匹配的請求都將最終和該默認Context匹配。

默認實現(xiàn):org.apache.catalina.core.StandardHost

14Tomcat總體框架結(jié)構(gòu)分析Host

代15Tomcat總體框架結(jié)構(gòu)分析Context

一個Context對應(yīng)于一個Web應(yīng)用程序,一個Web應(yīng)用程序由一個或者多個Servlet組成。Context在創(chuàng)建的時候?qū)⒏鶕?jù)配置文件$CATALINA_HOME/conf/web.xml和$WebApp/Web-INF/web.xml載入Servlet類。當(dāng)Context獲得請求時,將在自己的映射表(mappingtable)中尋找相匹配的Servlet類。如果找到,則執(zhí)行該類,獲得請求的響應(yīng),并返回。

默認實現(xiàn):org.apache.catalina.core.StandardContext15Tomcat總體框架結(jié)構(gòu)分析Context

16Tomcat的核心類圖所有的容器對象,都繼承LifeCycle,也即具有生命周期的方法,init(),start(),stop(),destroy(),具有LifecycleState屬性(可以看一下這個屬性的內(nèi)容)16Tomcat的核心類圖所有的容器對象,都繼承LifeCy17Tomcat總體框架結(jié)構(gòu)分析—啟動catalina.bat中setMAINCLASS=org.apache.catalina.startup.Bootstrap17Tomcat總體框架結(jié)構(gòu)分析—啟動catalina.ba18Tomcat組件啟動流程圖18Tomcat組件啟動流程圖19啟動過程都做了什么1.初始化目錄

設(shè)置CatalinaHome、CatalinaBase,初始化System環(huán)境信息2.初始化類加載器(ClassLoader)

初始化三個類加載器commonLoader、catalinaLoader、sharedLoader;這是要從perties中讀取配置,即jar包的配置。3.構(gòu)建容器

對server、service、engine、host等容器對象進行實例化,開始這些對象的生命周期。4.部署Web應(yīng)用

掃描webapps、conf/Catalina/localhost目錄,進行war包、應(yīng)用程序目錄、contex配置文件的加載;19啟動過程都做了什么1.初始化目錄2.初始化類加載器(20Tomcat嵌入早期版本中,如Tomcat5中,提供了Embedded類用于在java應(yīng)用中嵌入。在新版本的Tomcat中,Embedded已經(jīng)不建議使用。Tomcat7中,提供了專門的Embedded版本。當(dāng)然,我們可以直接構(gòu)建Catalina對象實現(xiàn)Tomcat的嵌入應(yīng)用;也可以參考或者直接改造Bootstrap類實現(xiàn)嵌入。20Tomcat嵌入早期版本中,如Tomcat5中,提供了E21Tomcat容器的結(jié)構(gòu)21Tomcat容器的結(jié)構(gòu)22容器的工作原理

1.ClassLoaerTomcat通過WebappClassLoader加載web應(yīng)用程序,通過WebappClassLoader確保各個應(yīng)用相互獨立,運行期間互不干擾。

2.容器生命周期

應(yīng)用LifeCycle生命周期接口定義各級容器的初始化、啟動、停止、銷毀等動作,并應(yīng)用組合設(shè)計模式把Server、Service、Engine、Host、Context這幾級容器有效的整合為有機體,協(xié)調(diào)完成JSP解析、編譯、初始化以及響應(yīng)客戶端請求等這種任務(wù)。

3.Connector

容器接收Connector傳遞過來的客戶端(瀏覽器或者webserver)請求,并把響應(yīng)結(jié)果通過Connector發(fā)回到客戶端(瀏覽器)。22容器的工作原理1.ClassLoaer23目錄1.Java類加載機制2.Tomcat總體框架結(jié)構(gòu)分析4.Tomcat的物理結(jié)構(gòu)5.Tomcat典型功能與設(shè)計分析6.實用配置與常見問題23目錄1.Java類加載機制2.Tomcat總體24Tomcat的物理結(jié)構(gòu)分析—包結(jié)構(gòu)org.apache.catalinaTomcat核心類庫,規(guī)范了Tomcat的總體架構(gòu),定義了Server、Service、Host、Connector、Context、Session及Cluster等關(guān)鍵組件及這些組件的實現(xiàn),這個子模塊大量運用了Composite設(shè)計模式。同時也規(guī)范了Catalina的啟動及停止等事件的執(zhí)行流程

org.apache.coyoteCoyote連接器,實現(xiàn)了Http1.1協(xié)議,實現(xiàn)了對請求和響應(yīng)對象的構(gòu)建。24Tomcat的物理結(jié)構(gòu)分析—包結(jié)構(gòu)org.apache25Tomcat的物理結(jié)構(gòu)分析—包結(jié)構(gòu)org.apache下其他包el

:

el表達式定義、解析處理jasper:

負責(zé)jsp頁面的解析,jsp屬性的驗證,同時也負責(zé)將jsp頁面

動態(tài)轉(zhuǎn)換為java代碼并編譯成class文件juli:

日志管理naming:

資源管理,包括數(shù)據(jù)庫連接池、EJB、mail等通過JNDI獲取的

內(nèi)容25Tomcat的物理結(jié)構(gòu)分析—包結(jié)構(gòu)org.apache26Tomcat的物理結(jié)構(gòu)分析—包結(jié)構(gòu)javax.servlet

Servlet和Jsp規(guī)范的實現(xiàn)模塊,我們非常熟悉的javax.servlet.Servlet接口、javax.servet.http.HttpServlet類及javax.servlet.jsp.HttpJspPage就位于這個子模塊中;26Tomcat的物理結(jié)構(gòu)分析—包結(jié)構(gòu)javax.serv27Tomcat的物理結(jié)構(gòu)分析—目錄結(jié)構(gòu)/bin:存放windows或Linux平臺上啟動和關(guān)閉Tomcat的腳本文件/conf:存放Tomcat服務(wù)器的各種全局配置文件,其中最重要的是server.xml和web.xml/doc:存放Tomcat文檔【下面這幾個目錄在Tomcat6、7中已經(jīng)去掉,合并為lib目錄】/server:包含三個子目錄:classes、lib和webapps/server/lib:存放Tomcat服務(wù)器所需的各種JAR文件/server/webapps:存放Tomcat自帶的兩個WEB應(yīng)用admin應(yīng)用和manager應(yīng)用/common/lib:存放Tomcat服務(wù)器以及所有web應(yīng)用都可以訪問的jar文件/shared/lib:存放所有web應(yīng)用都可以訪問的jar文件(但是不能被Tomcat服務(wù)器訪問)/logs:存放Tomcat執(zhí)行時的日志文件/webapps:Tomcat的主要Web發(fā)布目錄,默認情況下把Web應(yīng)用文件放于此目錄/work:存放JSP編譯后產(chǎn)生的class文件27Tomcat的物理結(jié)構(gòu)分析—目錄結(jié)構(gòu)/bin:存放wi28目錄1.Java類加載機制2.Tomcat總體框架結(jié)構(gòu)分析4.Tomcat的物理結(jié)構(gòu)5.Tomcat典型功能與設(shè)計分析6.實用配置與常見問題28目錄1.Java類加載機制2.Tomcat總體29應(yīng)用程序加載29應(yīng)用程序加載30JSP編譯的實現(xiàn)30JSP編譯的實現(xiàn)31Servlet管理—初始化在web應(yīng)用程序初始化過程中,也就是解析web.xml時,會把Servlet、Filter、Listener等servlet對象實例化、初始化。每個Servlet被封裝為一個Wrapper,即StandardWrapper31Servlet管理—初始化在web應(yīng)用程序初始化過程中,32請求處理過程分析(1)32請求處理過程分析(1)33請求處理過程分析(2)33請求處理過程分析(2)34Session的創(chuàng)建和管理Catalina通過一個叫Manager的組件來完成session管理工作,即org.apache.catalina.Manager接口。一個Manager通常跟一個上下文容器相關(guān)聯(lián),它負責(zé)創(chuàng)建、更行以及銷毀session對象并能給任何請求組件返回一個合法的session。34Session的創(chuàng)建和管理Catalina通過一個叫Ma35Tomcat資源的管理(一)Tomcat資源:Tomcat中,可以使用server.xml和web.xml分別為應(yīng)用預(yù)定義一些靜態(tài)資源,這些靜態(tài)資源就是我們在應(yīng)用程序中可以直接訪問的資源。這些資源在Tomcat啟動的時候被自動加載。35Tomcat資源的管理(一)Tomcat資源:36Tomcat資源的管理(二)server.xml定義資源server.xml中通過context來為應(yīng)用定義資源。資源定義包括五個元素:Parameter、Environment、Resource、ResourceParams、ResourceLink。Context中定義的資源只能被當(dāng)前的應(yīng)用使用。Server.xml中還可以定義GlobalNamingResource來定義全局的資源,元素包括:Environment、Resource、ResourceParams.元素名稱說明ParameterContext內(nèi),定義應(yīng)用參數(shù),通過ServletContext.getInitParameter()獲取Environment定義應(yīng)用的環(huán)境變量,通過JNDI查找Resource定義JNDI資源,通過JNDI查找資源,如:dataSourceResourceParams設(shè)置已定義的JNDI資源的參數(shù),按照名稱與JNDI資源對應(yīng)ResourceLinkContext內(nèi),定義資源鏈接,將全局資源引入到本應(yīng)用中資源元素說明:36Tomcat資源的管理(二)server.xml定義資源37Tomcat資源的管理(三)web.xml資源:這里說的web.xml是各個應(yīng)用下自己的配置文件。包括元素:context-param、env-entry、resource-ref、resource-env-ref。元素名稱說明context-Parameter等價于server.xml中的parameter,會覆蓋server.xml中的同名參數(shù)。env-entry等價于server.xml中的Environment,會覆蓋server.xml中的同名變量resource-ref資源應(yīng)用定義。可以再server.xml中使用ResourceParams定義資源參數(shù),在web使用本元素進行應(yīng)用resource-env-ref類似resource-ref,沒有auth屬性,即不需要驗證資源元素說明:37Tomcat資源的管理(三)web.xml資源:元素名稱38閥(Valve)的作用38閥(Valve)的作用39目錄1.Java類加載機制2.Tomcat總體框架結(jié)構(gòu)分析4.Tomcat的物理結(jié)構(gòu)5.Tomcat典型功能與設(shè)計分析6.實用配置與常見問題39目錄1.Java類加載機制2.Tomcat總體40JVM參數(shù)配置setCATALINA_OPTS=-server-Xms1024m-Xmx1024m-XX:NewSize=512m-Xss128k-XX:PermSize=256M-XX:PermSize=256M或者setJAVA_OPTS也是一樣的40JVM參數(shù)配置41安全相關(guān)配置--使用SSLSSL可以保證網(wǎng)絡(luò)上的兩個節(jié)點之間進行安全的通信。使用SSL機制的http協(xié)議也就是HTTPS協(xié)議。只有當(dāng)Tomcat作為獨立的web服務(wù)器時,Tomcat中才有必要使用SSL,如果連接Apache、IIS等web服務(wù)器是,SSL需要在這些web服務(wù)器中進行配置。這里簡單說一下配置SSL的必要步驟:使用keytool命令創(chuàng)建自簽名的數(shù)字證書。當(dāng)然這個證書是沒有被任何CA官方注冊的(具體配置可以參考資料);去掉server.xml中sslconnector元素的注釋,使其生效。41安全相關(guān)配置--使用SSLSSL可以保證網(wǎng)絡(luò)上的兩個節(jié)點42安全相關(guān)配置--使用Valve加強安全性問題:凡是允許用戶輸入數(shù)據(jù)到服務(wù)器都存在注入帶來的危險。注入包括以下幾種:XSS(Cross-siteScript)注入如:<script>Document.location=“”+document.cookie;</script>HTML注入輸入框中插入惡意代碼,可以偷取用戶密碼等信息到自己的地址。SQL注入提交非法的查詢參數(shù),注入到查詢的sql字符串中,提取數(shù)據(jù)庫信息。命令注入發(fā)送請求命令道服務(wù)器中,該命令在命令行預(yù)先,偷取服務(wù)器信息。42安全相關(guān)配置--使用Valve加強安全性問題:XSS(43安全相關(guān)配置--使用Valve加強安全性解決思路:使用Valve過濾用戶發(fā)送到服務(wù)器的數(shù)據(jù)。所有危害都是通過用戶提交的數(shù)據(jù)造成的,所有只要對用戶的數(shù)據(jù)進行完全的過濾,就可以消除隱患。通過正則表達式進行匹配查找和替換,參考:quoteHashMap.put(“\””,”"”);quoteHashMap.put(“\’”,”'”);quoteHashMap.put(“`”,”`”);angleBracketsHashMap.put(“<”,”<”);angleBracketsHashMap.put(“>”,”>”);javaScriptHashMap.put(“document(.*)\\.(.*)cookie”,”document.ccookie”);javaScriptHashMap.put(“eval(\\s)\\(”,”eval(”);等等43安全相關(guān)配置--使用Valve加強安全性解決思路:通過正44端口Tomcat使用的端口在使用Tomcat的過程中,經(jīng)常會有修改端口的情況,下面是幾個Tomcat需要注意的端口:端口說明Server元素的8005用于監(jiān)聽shutdown命令的端口,為提高安全性,應(yīng)修改這個端口,否則容易被通過telnet非法執(zhí)行shutdown命令HTTP/1.1的8080這個端口是最常被修改的,一般根據(jù)需要都應(yīng)修改,否則很容易被外界知道應(yīng)用服務(wù)器是TomcatAJP/1.3的8009連接器端口,如連接ApacheserverredirectPort的8443SSL端口號,為了訪問簡便,一般修改為443,即SSL的默認端口號44端口Tomcat使用的端口端口說明Server元素的8045集群的配置幾個基本步驟:確保session中保存的對象實現(xiàn)java.io.Serivalizable接口;在server.xml文件里,去掉Cluster節(jié)點的注釋;在server.xml中,去掉Valve(ReplicationValve)節(jié)點的注釋;如果兩個以上Tomcat實例運行在同一臺計算機上,確保各實例的tcpListenPort

屬性是不一樣的;…….負載平衡:Tomcat本身無法實現(xiàn)負載平衡,需要結(jié)合其他硬件設(shè)備或者軟件來實現(xiàn)。一般使用ApacheHTTPServer來做負載平衡管理器,這就需要mod_jk插件。45集群的配置幾個基本步驟:負載平衡:46常見問題無法啟動:環(huán)境變量設(shè)置問題,包括JAVA_HOME、CATALINA_HOME等;端口沖突,如:8080端口占用;多個Tomcat同時運行;版本沖突,如:Tomcat5需要JDK1.5、Tomcat7需要JDK6;無法停止:應(yīng)用程序正在運行或者正在被訪問時,Tomcat可能無法正常停止。當(dāng)然,如關(guān)閉命令行窗口也可以關(guān)掉;中文字符問題:中文亂碼,一般可以通過在JSP的page標(biāo)簽中指定charset解決;如果是struts的Action或者Servlet亂碼,可以通過Filter設(shè)置編碼;應(yīng)用程序未啟動:

一般是由于應(yīng)用程序本身出現(xiàn)嚴(yán)重錯誤(如配置文件錯誤、重要的類未找到等)導(dǎo)致,可以通過打開日志,如Log4j進行排查;46常見問題無法啟動:無法停止:中文字符問題:應(yīng)用程序未啟動47通過對Tomcat分析,有什么好處?通過對Tomcat結(jié)構(gòu)和功能的理解和掌握,可以順利排除Tomcat及應(yīng)用程序出現(xiàn)的錯誤和異常??梢詢?yōu)化其性能,甚至擴展Tomcat的功能。通過對Tomcat源碼的分析,學(xué)習(xí)一些好的編程習(xí)慣,學(xué)習(xí)一些解決問題的方法。了解Tomcat的設(shè)計模式可以參考Tomcat結(jié)構(gòu)和功能分析.doc47通過對Tomcat分析,有什么好處?通過對Tomcat結(jié)保密北京恒華偉業(yè)科技股份有限公司2012年09月Tomcat功能與架構(gòu)設(shè)計分析保密北京恒華偉業(yè)科技股份有限公司Tomcat功能與架構(gòu)設(shè)計49目錄1.Java類加載機制2.Tomcat總體框架結(jié)構(gòu)分析4.Tomcat的物理結(jié)構(gòu)5.Tomcat典型功能與設(shè)計分析6.實用配置與常見問題2目錄1.Java類加載機制2.Tomcat總體框50Java類加載機制類加載是java語言提供的最強大的機制之一。盡管類加載并不是熱點話題,但作為編程人員都應(yīng)該了解其工作機制,明白怎樣去配合其工作。熟悉了類加載機制可以使我們節(jié)省很多時間,而不必浪費在調(diào)試ClassNotFoundException等異常上,且為我們開發(fā)高擴展性的應(yīng)用程序提供了一些思路。類加載的作用:加載Java應(yīng)用程序所需的字節(jié)碼文件(*.class、*.jar);提供一種在運行時動態(tài)、靈活地定位資源(代碼和數(shù)據(jù))的方式;允許在運行時利用多種不同資源創(chuàng)建應(yīng)用程序,并提供命名空間機制,使同一資源的多個版本在虛擬機上共存;可與安全體系結(jié)構(gòu)集成;提供在運行時組裝應(yīng)用程序所需的服務(wù)。3Java類加載機制類加載是java語言提供的最強大的機制51Java類加載器Java缺省使用如下三種類型類裝入器啟動(Bootstrap)類加載器:引導(dǎo)類裝入器是用本地代碼實現(xiàn)的類裝入器,它負責(zé)將<Java_Runtime_Home>/lib下面的類庫加載到內(nèi)存中。由于引導(dǎo)類加載器涉及到虛擬機本地實現(xiàn)細節(jié),開發(fā)者無法直接獲取到啟動類加載器的引用,所以不允許直接通過引用進行操作。標(biāo)準(zhǔn)擴展(Extension)類加載器:擴展類加載器是由Sun的ExtClassLoader(sun.misc.Launcher$ExtClassLoader)實現(xiàn)的。它負責(zé)將<Java_Runtime_Home>/lib/ext或者由系統(tǒng)變量java.ext.dir指定位置中的類庫加載到內(nèi)存中。開發(fā)者可以直接使用標(biāo)準(zhǔn)擴展類加載器。系統(tǒng)(System)類加載器:系統(tǒng)類加載器是由Sun的AppClassLoader(sun.misc.Launcher$AppClassLoader)實現(xiàn)的。它負責(zé)將系統(tǒng)類路徑(CLASSPATH)中指定的類庫加載到內(nèi)存中。開發(fā)者可以直接使用系統(tǒng)類加載器。4Java類加載器Java缺省使用如下三種類型類裝入器啟動52類加載器的委托機制1.首先判斷該類型是否已經(jīng)被加載2.如果沒有被加載,就委托給父類加載或者委派給啟動類加載器加載3.如果存在父類加載器,就委派給父類加載器加載4.如果不存在父類加載器,就檢查是否是由啟動類加載器加載的類5.如果父類加載器和啟動類加載器都不能完成加載任務(wù),才調(diào)用自身的加載功能5類加載器的委托機制1.首先判斷該類型是否已經(jīng)被加載2.53Tomcat中類加載器Common類加載器負責(zé)加載TomcatHOME/common/class下的.Class文件和common/lib中的jar包,這些類可以被Tomcat內(nèi)核和每個Web應(yīng)用程序都可以看見,如servlet.jar等Catalina類加載器從server/classes和server/lib下加載類,Catalina加載的類只對Tomcat服務(wù)器內(nèi)核可見,對Web應(yīng)用程序不可見,對于運行Tomcat內(nèi)核的線程,它的上下文類加載器就是Catalina類加載器Shared類加載器負責(zé)從share/classes和share/lib中加載類,它加載的類只對所有Web應(yīng)用程序有效,對Tomcat不可見.WebappX類加載器負責(zé)加載Web應(yīng)用程序的/web-INF/classes和lib目錄下的類,只對當(dāng)前Web應(yīng)用程序有效,對于運行每個Web應(yīng)用程序的線程,他們的上下文類加載器就是它們各自的WebappX類加載器6Tomcat中類加載器Common類加載器負責(zé)加載Tomc54目錄1.Java類加載機制2.Tomcat總體框架結(jié)構(gòu)分析4.Tomcat的物理結(jié)構(gòu)5.Tomcat典型功能與設(shè)計分析6.實用配置與常見問題7目錄1.Java類加載機制2.Tomcat總體框55Tomcat總體框架結(jié)構(gòu)分析Tocmat的各種組件通過相互作用,形成一個完善的有機體。8Tomcat總體框架結(jié)構(gòu)分析Tocmat的各種組件通過相互56Tomcat總體框架結(jié)構(gòu)分析Server

Server代表整個Catalinaservlet容器。在server.xml配置文件中必須是頂層元素且唯一,給它配置的屬性代表整個容器的屬性。

默認實現(xiàn):org.apache.catalina.core.StandardServerListener

所有server.xml中的監(jiān)聽器都實現(xiàn)了LifecycleListener接口。當(dāng)server中的各種組件在start、stop等事件發(fā)生時觸發(fā)相應(yīng)的操作。

如:JasperListener用來在所有web應(yīng)用程序啟動前初始化jasper(JSP編譯)。9Tomcat總體框架結(jié)構(gòu)分析Server

57Tomcat總體框架結(jié)構(gòu)分析

Service

Service是這樣一個集合:它由一個或者多個Connector,以及一個共享的處理引擎(Engine)組成。Engine負責(zé)處理所有Connector所獲得的客戶請求。

默認實現(xiàn):

org.apache.catalina.core.StandardService10Tomcat總體框架結(jié)構(gòu)分析

58Tomcat總體框架結(jié)構(gòu)分析Connector

一個連接器(Connector)將在某個指定端口上偵聽客戶請求,并將獲得的請求交給Engine來處理,從Engine處獲得響應(yīng)結(jié)果,并返回給客戶端。

Tomcat有兩個典型的連接器,一個直接偵聽來自客戶端瀏覽器的http請求,一個偵聽來自其它Web服務(wù)器的請求。

11Tomcat總體框架結(jié)構(gòu)分析Connector

59Connector的工作原理CoyoteHttp/1.1Connector在端口8080處偵聽來自客戶瀏覽器的http請求,CoyoteJK2Connector在端口8009處偵聽來自其它Web服務(wù)器(比如Apache)的servlet/jsp代理請求。

當(dāng)使用CoyoteHttp/1.1Connector時,Tomcat作為獨立的Web容器,同時扮演Web服務(wù)器和Servlet容器的雙重角色。當(dāng)使用CoyoteJK2Connector時,Tomcat只扮演Servlet容器的角色,Web服務(wù)器則由Apache或者其他服務(wù)器來提供,由于這些專有的Web服務(wù)器在處理靜態(tài)資源的性能和效率上要比Tomcat提供的Web服務(wù)器要好,所以經(jīng)常將Tomcat和Apache配合使用。12Connector的工作原理Coyote60Tomcat總體框架結(jié)構(gòu)分析Engine

處理引擎(Engine)代表一個Service所屬的請求處理機,它接受所有連接器傳遞過來的客戶端請求,將處理結(jié)果返回給連接器,由連接器將最終響應(yīng)返回給客戶端。Engine必須配置在Service組件下。

處理引擎下可以配置多個虛擬主機(VirtualHost),每個虛擬主機都有一個域名。當(dāng)處理引擎獲得一個請求時,它把該請求匹配到某個虛擬主機上,把請求交給該虛擬主機來處理。處理引擎有一個默認虛擬主機,當(dāng)請求無法匹配到任何一個虛擬主機上時,交給默認虛擬主機來處理。

默認實現(xiàn):org.apache.catalina.core.StandardEngine13Tomcat總體框架結(jié)構(gòu)分析Engine

61Tomcat總體框架結(jié)構(gòu)分析Host

代表一個虛擬主機,每個虛擬主機和某個網(wǎng)絡(luò)域名(DomainName)相匹配。每個虛擬主機下都可以部署(deploy)一個或者多個Web應(yīng)用程序(WebApplication),每個Web應(yīng)用程序?qū)?yīng)于一個Context,有一個Contextpath。當(dāng)虛擬主機獲得一個請求時,將把該請求匹配到某個Context上,然后把該請求交給該Context來處理。匹配的方法是“最長匹配”,一個path=""的Context將成為該虛擬主機的默認Context。所有無法和其它Context的路徑名匹配的請求都將最終和該默認Context匹配。

默認實現(xiàn):org.apache.catalina.core.StandardHost

14Tomcat總體框架結(jié)構(gòu)分析Host

代62Tomcat總體框架結(jié)構(gòu)分析Context

一個Context對應(yīng)于一個Web應(yīng)用程序,一個Web應(yīng)用程序由一個或者多個Servlet組成。Context在創(chuàng)建的時候?qū)⒏鶕?jù)配置文件$CATALINA_HOME/conf/web.xml和$WebApp/Web-INF/web.xml載入Servlet類。當(dāng)Context獲得請求時,將在自己的映射表(mappingtable)中尋找相匹配的Servlet類。如果找到,則執(zhí)行該類,獲得請求的響應(yīng),并返回。

默認實現(xiàn):org.apache.catalina.core.StandardContext15Tomcat總體框架結(jié)構(gòu)分析Context

63Tomcat的核心類圖所有的容器對象,都繼承LifeCycle,也即具有生命周期的方法,init(),start(),stop(),destroy(),具有LifecycleState屬性(可以看一下這個屬性的內(nèi)容)16Tomcat的核心類圖所有的容器對象,都繼承LifeCy64Tomcat總體框架結(jié)構(gòu)分析—啟動catalina.bat中setMAINCLASS=org.apache.catalina.startup.Bootstrap17Tomcat總體框架結(jié)構(gòu)分析—啟動catalina.ba65Tomcat組件啟動流程圖18Tomcat組件啟動流程圖66啟動過程都做了什么1.初始化目錄

設(shè)置CatalinaHome、CatalinaBase,初始化System環(huán)境信息2.初始化類加載器(ClassLoader)

初始化三個類加載器commonLoader、catalinaLoader、sharedLoader;這是要從perties中讀取配置,即jar包的配置。3.構(gòu)建容器

對server、service、engine、host等容器對象進行實例化,開始這些對象的生命周期。4.部署Web應(yīng)用

掃描webapps、conf/Catalina/localhost目錄,進行war包、應(yīng)用程序目錄、contex配置文件的加載;19啟動過程都做了什么1.初始化目錄2.初始化類加載器(67Tomcat嵌入早期版本中,如Tomcat5中,提供了Embedded類用于在java應(yīng)用中嵌入。在新版本的Tomcat中,Embedded已經(jīng)不建議使用。Tomcat7中,提供了專門的Embedded版本。當(dāng)然,我們可以直接構(gòu)建Catalina對象實現(xiàn)Tomcat的嵌入應(yīng)用;也可以參考或者直接改造Bootstrap類實現(xiàn)嵌入。20Tomcat嵌入早期版本中,如Tomcat5中,提供了E68Tomcat容器的結(jié)構(gòu)21Tomcat容器的結(jié)構(gòu)69容器的工作原理

1.ClassLoaerTomcat通過WebappClassLoader加載web應(yīng)用程序,通過WebappClassLoader確保各個應(yīng)用相互獨立,運行期間互不干擾。

2.容器生命周期

應(yīng)用LifeCycle生命周期接口定義各級容器的初始化、啟動、停止、銷毀等動作,并應(yīng)用組合設(shè)計模式把Server、Service、Engine、Host、Context這幾級容器有效的整合為有機體,協(xié)調(diào)完成JSP解析、編譯、初始化以及響應(yīng)客戶端請求等這種任務(wù)。

3.Connector

容器接收Connector傳遞過來的客戶端(瀏覽器或者webserver)請求,并把響應(yīng)結(jié)果通過Connector發(fā)回到客戶端(瀏覽器)。22容器的工作原理1.ClassLoaer70目錄1.Java類加載機制2.Tomcat總體框架結(jié)構(gòu)分析4.Tomcat的物理結(jié)構(gòu)5.Tomcat典型功能與設(shè)計分析6.實用配置與常見問題23目錄1.Java類加載機制2.Tomcat總體71Tomcat的物理結(jié)構(gòu)分析—包結(jié)構(gòu)org.apache.catalinaTomcat核心類庫,規(guī)范了Tomcat的總體架構(gòu),定義了Server、Service、Host、Connector、Context、Session及Cluster等關(guān)鍵組件及這些組件的實現(xiàn),這個子模塊大量運用了Composite設(shè)計模式。同時也規(guī)范了Catalina的啟動及停止等事件的執(zhí)行流程

org.apache.coyoteCoyote連接器,實現(xiàn)了Http1.1協(xié)議,實現(xiàn)了對請求和響應(yīng)對象的構(gòu)建。24Tomcat的物理結(jié)構(gòu)分析—包結(jié)構(gòu)org.apache72Tomcat的物理結(jié)構(gòu)分析—包結(jié)構(gòu)org.apache下其他包el

:

el表達式定義、解析處理jasper:

負責(zé)jsp頁面的解析,jsp屬性的驗證,同時也負責(zé)將jsp頁面

動態(tài)轉(zhuǎn)換為java代碼并編譯成class文件juli:

日志管理naming:

資源管理,包括數(shù)據(jù)庫連接池、EJB、mail等通過JNDI獲取的

內(nèi)容25Tomcat的物理結(jié)構(gòu)分析—包結(jié)構(gòu)org.apache73Tomcat的物理結(jié)構(gòu)分析—包結(jié)構(gòu)javax.servlet

Servlet和Jsp規(guī)范的實現(xiàn)模塊,我們非常熟悉的javax.servlet.Servlet接口、javax.servet.http.HttpServlet類及javax.servlet.jsp.HttpJspPage就位于這個子模塊中;26Tomcat的物理結(jié)構(gòu)分析—包結(jié)構(gòu)javax.serv74Tomcat的物理結(jié)構(gòu)分析—目錄結(jié)構(gòu)/bin:存放windows或Linux平臺上啟動和關(guān)閉Tomcat的腳本文件/conf:存放Tomcat服務(wù)器的各種全局配置文件,其中最重要的是server.xml和web.xml/doc:存放Tomcat文檔【下面這幾個目錄在Tomcat6、7中已經(jīng)去掉,合并為lib目錄】/server:包含三個子目錄:classes、lib和webapps/server/lib:存放Tomcat服務(wù)器所需的各種JAR文件/server/webapps:存放Tomcat自帶的兩個WEB應(yīng)用admin應(yīng)用和manager應(yīng)用/common/lib:存放Tomcat服務(wù)器以及所有web應(yīng)用都可以訪問的jar文件/shared/lib:存放所有web應(yīng)用都可以訪問的jar文件(但是不能被Tomcat服務(wù)器訪問)/logs:存放Tomcat執(zhí)行時的日志文件/webapps:Tomcat的主要Web發(fā)布目錄,默認情況下把Web應(yīng)用文件放于此目錄/work:存放JSP編譯后產(chǎn)生的class文件27Tomcat的物理結(jié)構(gòu)分析—目錄結(jié)構(gòu)/bin:存放wi75目錄1.Java類加載機制2.Tomcat總體框架結(jié)構(gòu)分析4.Tomcat的物理結(jié)構(gòu)5.Tomcat典型功能與設(shè)計分析6.實用配置與常見問題28目錄1.Java類加載機制2.Tomcat總體76應(yīng)用程序加載29應(yīng)用程序加載77JSP編譯的實現(xiàn)30JSP編譯的實現(xiàn)78Servlet管理—初始化在web應(yīng)用程序初始化過程中,也就是解析web.xml時,會把Servlet、Filter、Listener等servlet對象實例化、初始化。每個Servlet被封裝為一個Wrapper,即StandardWrapper31Servlet管理—初始化在web應(yīng)用程序初始化過程中,79請求處理過程分析(1)32請求處理過程分析(1)80請求處理過程分析(2)33請求處理過程分析(2)81Session的創(chuàng)建和管理Catalina通過一個叫Manager的組件來完成session管理工作,即org.apache.catalina.Manager接口。一個Manager通常跟一個上下文容器相關(guān)聯(lián),它負責(zé)創(chuàng)建、更行以及銷毀session對象并能給任何請求組件返回一個合法的session。34Session的創(chuàng)建和管理Catalina通過一個叫Ma82Tomcat資源的管理(一)Tomcat資源:Tomcat中,可以使用server.xml和web.xml分別為應(yīng)用預(yù)定義一些靜態(tài)資源,這些靜態(tài)資源就是我們在應(yīng)用程序中可以直接訪問的資源。這些資源在Tomcat啟動的時候被自動加載。35Tomcat資源的管理(一)Tomcat資源:83Tomcat資源的管理(二)server.xml定義資源server.xml中通過context來為應(yīng)用定義資源。資源定義包括五個元素:Parameter、Environment、Resource、ResourceParams、ResourceLink。Context中定義的資源只能被當(dāng)前的應(yīng)用使用。Server.xml中還可以定義GlobalNamingResource來定義全局的資源,元素包括:Environment、Resource、ResourceParams.元素名稱說明ParameterContext內(nèi),定義應(yīng)用參數(shù),通過ServletContext.getInitParameter()獲取Environment定義應(yīng)用的環(huán)境變量,通過JNDI查找Resource定義JNDI資源,通過JNDI查找資源,如:dataSourceResourceParams設(shè)置已定義的JNDI資源的參數(shù),按照名稱與JNDI資源對應(yīng)ResourceLinkContext內(nèi),定義資源鏈接,將全局資源引入到本應(yīng)用中資源元素說明:36Tomcat資源的管理(二)server.xml定義資源84Tomcat資源的管理(三)web.xml資源:這里說的web.xml是各個應(yīng)用下自己的配置文件。包括元素:context-param、env-entry、resource-ref、resource-env-ref。元素名稱說明context-Parameter等價于server.xml中的parameter,會覆蓋server.xml中的同名參數(shù)。env-entry等價于server.xml中的Environment,會覆蓋server.xml中的同名變量resource-ref資源應(yīng)用定義??梢栽賡erver.xml中使用ResourceParams定義資源參數(shù),在web使用本元素進行應(yīng)用resource-env-ref類似resource-ref,沒有auth屬性,即不需要驗證資源元素說明:37Tomcat資源的管理(三)web.xml資源:元素名稱85閥(Valve)的作用38閥(Valve)的作用86目錄1.Java類加載機制2.Tomcat總體框架結(jié)構(gòu)分析4.Tomcat的物理結(jié)構(gòu)5.Tomcat典型功能與設(shè)計分析6.實用配置與常見問題39目錄1.Java類加載機制2.Tomcat總體87JVM參數(shù)配置setCATALINA_OPTS=-server-Xms1024m-Xmx1024m-XX:NewSize=512m-Xss128k-XX:PermSize=256M-XX:PermSize=256M或者setJAVA_OPTS也是一樣的40JVM參數(shù)配置88安全相關(guān)配置--使用SSLSSL可以保證網(wǎng)絡(luò)上的兩個節(jié)點之間進行安

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論