Tomcat核心源碼閱讀筆記總結備課講稿_第1頁
Tomcat核心源碼閱讀筆記總結備課講稿_第2頁
Tomcat核心源碼閱讀筆記總結備課講稿_第3頁
Tomcat核心源碼閱讀筆記總結備課講稿_第4頁
Tomcat核心源碼閱讀筆記總結備課講稿_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Good is good, but better carries it.精益求精,善益求善。Tomcat核心源碼閱讀筆記總結Tomcat6核心源碼閱讀筆記2012-8-15Calvin.chen此次源碼閱讀基于tomcat6,官方svn地址:/repos/asf/tomcat/tc6.0.x/trunkTOCo1-3hzuHYPERLINKl_Toc332964929Tomcat6核心源碼閱讀筆記PAGEREF_Toc332964929h1HYPERLINKl_Toc3329649301、tomcat6整體結構PAGEREF_Toc332964930h2HYPERLINKl_Toc332964

2、9312、tomcat6主要組件PAGEREF_Toc332964931h2HYPERLINKl_Toc3329649322.1ServerPAGEREF_Toc332964932h2HYPERLINKl_Toc3329649332.2ServicPAGEREF_Toc332964933h2HYPERLINKl_Toc3329649342.3ConnectorPAGEREF_Toc332964934h3HYPERLINKl_Toc3329649352.4ContainerPAGEREF_Toc332964935h3HYPERLINKl_Toc3329649363、tomcat6核心類結構分析P

3、AGEREF_Toc332964936h6HYPERLINKl_Toc3329649373.1核心類結構圖PAGEREF_Toc332964937h6HYPERLINKl_Toc3329649383.2tomcat啟動過程主線圖PAGEREF_Toc332964938h7HYPERLINKl_Toc3329649393.3請求處理類結構圖PAGEREF_Toc332964939h8HYPERLINKl_Toc3329649403.4Container類結構圖PAGEREF_Toc332964940h9HYPERLINKl_Toc3329649413.5Valve類結構圖PAGEREF_Toc3

4、32964941h10HYPERLINKl_Toc3329649423.6Pipeline和valvePAGEREF_Toc332964942h11HYPERLINKl_Toc3329649434、tomcat6如何實現(xiàn)多線程處理PAGEREF_Toc332964943h12HYPERLINKl_Toc3329649444.1多線程處理簡圖PAGEREF_Toc332964944h12HYPERLINKl_Toc3329649454.2多線程處理詳圖PAGEREF_Toc332964945h13HYPERLINKl_Toc3329649464.3多線程處理過程中幾個比較重要的方法PAGEREF

5、_Toc332964946h14HYPERLINKl_Toc3329649474.4多線程小結PAGEREF_Toc332964947h16HYPERLINKl_Toc3329649485、tomcat6處理一次請求的完整過程PAGEREF_Toc332964948h18HYPERLINKl_Toc3329649496、Tomcat6中的設計模式PAGEREF_Toc332964949h19HYPERLINKl_Toc3329649506.1鏈式設計PAGEREF_Toc332964950h19HYPERLINKl_Toc3329649516.2觀察者模式PAGEREF_Toc33296495

6、1h19tomcat6整體結構2、tomcat6主要組件2.1ServerTomcatserver實例,需提供接口讓其它程序能夠訪問到其中Service集合,同時要維護它所包含的所有Service的生命周期,包括如何初始化、如何結束服務、如何找到別人要訪問的Service。2.2ServicService只是在Connector和Container外面多包一層,把它們組合在一起,向外面提供服務,同時通過lifecycle接口管理下屬組件(Connector和Engine)的生命周期。一個Service可以設置多個Connector,但是只能有一個Container(可以是Engine、Host

7、或者Context、Wrapper)。2.3ConnectorConnector組件是Tomcat兩個核心組件之一,它的主要任務是負責接收瀏覽器的發(fā)過來的tcp連接請求,創(chuàng)建一個Request和Response對象分別用于和請求端交換數(shù)據(jù),然后會產(chǎn)生一個線程來處理這個請求并把產(chǎn)生的Request和Response對象傳給處理這個請求的線程,處理這個請求的線程就是Container組件要做的事了。2.4ContainerContainer是容器的父接口,所有子容器都必須實現(xiàn)這個接口,Container還有一個抽象實現(xiàn)類ContainerBase,Engine、Host、Context、Wrapp

8、er的默認實現(xiàn)都繼承了這個類。Container容器的設計用的是典型的責任鏈的設計模式,它有四個子容器組件構成,分別是:Engine、Host、Context、Wrapper,這四個組件是父子關系,Engine包含Host,Host包含Context,Context包含Wrapper。通常一個Servletclass對應一個Wrapper,如果有多個Servlet就可以定義多個Wrapper,如果有多個Wrapper就要定義一個更高的Container了,如Context。Context還可以定義在父容器Host中,Host不是必須的,但是要運行war程序,就必須要Host,因為war中必有w

9、eb.xml文件,這個文件的解析就需要Host。如果要有多個Host就要定義一個top容器Engine。而Engine沒有父容器了,一個Engine代表一個完整的Servlet引擎。總之保證一個Service只有一個topcontainer(這個topcontainer里面可以有多個子container)。2.4.1Engine比較簡單的一個容器,主要分負責管理子容器的周期。2.4.2HostHost是Engine的子容器,一個Host在Engine中代表一個虛擬主機,這個虛擬主機的作用就是運行多個應用,它負責安裝和展開這些應用,并且標識這個應用以便能夠區(qū)分它們。它的子容器通常是Context

10、,它除了關聯(lián)子容器外,還有就是保存一個主機應該有的信息。關于Host中name屬性和Engine中defaultHost的作用:如果有個host的name=localhost,那么Tomcat會將此host設置為默認訪問的Host。即:如果出現(xiàn)下圖中的情況,則client最終會去訪問name=localhost的host,而不是defaultHost值定義的host(即不會去訪問02)Tomcat產(chǎn)生的server實例ServiceConnectorsHost_BName=02EnginedefaultHost=02Host_AName=01Client訪問03由于沒有103對應的host,所

11、以就會訪問EnginedefaultHost屬性值,即:022.4.3ContextContext代表Servlet的Context,它具備了Servlet運行的基本環(huán)境,理論上只要有Context就能運行Servlet了。簡單的Tomcat可以沒有Engine和Host。Context最重要的功能就是管理它里面的Servlet實例,Servlet實例在Context中是以Wrapper出現(xiàn)的。Context如何才能找到正確的Servlet并執(zhí)行它:在請求處理過程中,會調用CoyoteAdapter.postParseRequest()方法封裝request,其中就包含這樣一行代碼:conne

12、ctor.getMapper().map(serverName,decodedURI,request.getMappingData();這行代碼會封裝request中MappingDatas屬性的值,而MappingDatas中就包含的host、context、wrapper及其path的信息。(在connector的mapper對象中已經(jīng)記錄了該connector對應的engine中的所有host,在mapper.map()方法中會通過解析request的url字符串,逐步得到host、context、wrapper)。封裝完MappingDatas之后,就會調用下面這行代碼,綁定reque

13、st和Wrapper對象:request.setWrapper(Wrapper)request.getMappingData().wrapper);最后在StandardWrappValve.invoke()方法中調用StandardWrappValve所屬Container(即:Wrapper)的allocate(),即調用Wrapper.allocate()得到對應的servlet對象。2.4.4WrapperWrapper代表一個Servlet,它負責管理一個Servlet,包括的Servlet的裝載、初始化、執(zhí)行以及資源回收。Wrapper是最底層的容器,它沒有子容器了,所以調用它的a

14、ddChild將會報錯。Wrapper的實現(xiàn)類是StandardWrapper,StandardWrapper實現(xiàn)了擁有一個Servlet初始化信息的ServletConfig,由此看出StandardWrapper將直接和Servlet的各種信息打交道。StandardWrapperFacade:Wrapper的一個重要屬性,對Wrapper做了一次封裝,和Wrapper一樣實現(xiàn)了ServletConfig。Wrapper中的重要方法:loadServlet(),該方法包含對servlet的基本操作,包括調用init()和service()方法。3、tomcat6核心類結構分析3.1核心類結

15、構圖3.2tomcat啟動過程主線圖Tomcat中,幾乎所有組件都實現(xiàn)了Lifecycle接口,父組件并通過Lifecycle接口管理子組件的生周期。從下圖可以看出,在Engine、Host、Context和Wrapper四個組件才是Tomcat中真正的容器(實現(xiàn)了Container接口),而Server和Service只是在它們上做的一層封裝而已。3.3請求處理類結構圖3.4Container類結構圖3.5Valve類結構圖3.6Pipeline和valve4、tomcat6如何實現(xiàn)多線程處理4.1多線程處理簡圖4.2多線程處理詳圖tomcat6提供了兩種方式來處理多線程:tomcat6自己

16、寫代碼維護多線程處理(上圖分析采用的方式)tomcat6也提供了通過executor處理多線程的方式從代碼上看:第2種是完全將線程調度交給executor來做,會簡單很多。從學習和可維護性來說:第1種給我展示一個很好的處理多線程場景的學習案例,而且根據(jù)一些網(wǎng)上測試結果看,兩種方式性能相差不大,默認情況下tomcat6也不使用executor。4.3多線程處理過程中幾個比較重要的方法4.4多線程小結對Tomcat多線程處理機制可以簡單的概括為:兩個線程池+線程切換調度+線程開關+線程回收。對于開發(fā)人員來說,可以通過配置文件(server.xml)來進行調優(yōu),使服務器效率達到最佳。但參數(shù)并不是越大

17、越好,過大反而會導致線程阻塞,甚至內存溢出,因為每個請求對于服務器來說都一個單獨的線程,大量的請求就導致線程并發(fā),而線程并發(fā)對于服務器來說要靠CPU來進行大量線程切換調度或新增,而每次線程切換或新增JVM要去保存當前線程內容、申請內存、初始化內存等非常消耗CPU、內存和時間操作,導致服務器效率降低,所以還是的根據(jù)服務器的實際硬件配置進行調優(yōu)。我想這也是為什么tomcat會對線程進行回收的原因。(如果XmsJVM堆初始化大小設置的比較小時,大并發(fā)導致使用內存超過該值(但沒有達到XmxJVM堆最大內存值),這時JVM就需要頻繁的向操作系統(tǒng)申請內存來擴大堆容量,而JVM向操作系統(tǒng)負申請內存空間將會非

18、常耗CPU和內存,這也是為什么在大并發(fā)應用中會把Xms和Xmx設置成一樣或相近,但如果堆內存達到Xmx值,那么JVM就會進行垃圾回收,來獲得內存空間。另外需要注意的是,虛擬機的堆大小決定了虛擬機花費在收集垃圾上的時間和頻度,調整堆大小的目的是最小化垃圾收集的時間,以在特定的時間內最大化處理客戶的請求。堆越大,垃圾回收掃描的內存空間就越大,cpu和內存消耗也就越大,如果系統(tǒng)花費很多的時間收集垃圾,可以減小堆大小。從網(wǎng)上一些資料來看:完全一次垃圾收集應該不超過3-5秒,一般說來使用物理內存的80%作為堆大小。當增加處理器時,記得增加內存,因為分配可以并行進行,而垃圾收集不是并行的。)有一種情況需要注意:當tomcat線程數(shù)增大,但沒有超過最大線程數(shù)時,平均響應時間會增大,但這不意味著tomcat在線程增多時響應速度變慢可能是由于線程數(shù)增多,在請求時需要排隊,導致一部分請求會一直排隊,隨著線程數(shù)的增多,排隊等待的最大時間也會越來越大,而這些大數(shù)據(jù)才是導致平均響應時間變大的原因下面是幾個配置項的說明:Server.xml中的幾個配置項說明.maxThreadsTomcat處理請求的最大線程數(shù),也決定了tomcat的最大并發(fā)數(shù),默認為200個。如果connector使用了executor執(zhí)行處理

溫馨提示

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

評論

0/150

提交評論