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

下載本文檔

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

文檔簡(jiǎn)介

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

2、9312、tomcat6主要組件PAGEREF_Toc332964931h2HYPERLINKl_Toc3329649322.1ServerPAGEREF_Toc332964932h2HYPERLINKl_Toc3329649332.2ServicPAGEREF_Toc332964933h2HYPERLINKl_Toc3329649342.3ConnectorPAGEREF_Toc332964934h3HYPERLINKl_Toc3329649352.4ContainerPAGEREF_Toc332964935h3HYPERLINKl_Toc3329649363、tomcat6核心類結(jié)構(gòu)分析P

3、AGEREF_Toc332964936h6HYPERLINKl_Toc3329649373.1核心類結(jié)構(gòu)圖PAGEREF_Toc332964937h6HYPERLINKl_Toc3329649383.2tomcat啟動(dòng)過(guò)程主線圖PAGEREF_Toc332964938h7HYPERLINKl_Toc3329649393.3請(qǐng)求處理類結(jié)構(gòu)圖PAGEREF_Toc332964939h8HYPERLINKl_Toc3329649403.4Container類結(jié)構(gòu)圖PAGEREF_Toc332964940h9HYPERLINKl_Toc3329649413.5Valve類結(jié)構(gòu)圖PAGEREF_Toc3

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

5、_Toc332964946h14HYPERLINKl_Toc3329649474.4多線程小結(jié)PAGEREF_Toc332964947h16HYPERLINKl_Toc3329649485、tomcat6處理一次請(qǐng)求的完整過(guò)程PAGEREF_Toc332964948h18HYPERLINKl_Toc3329649496、Tomcat6中的設(shè)計(jì)模式PAGEREF_Toc332964949h19HYPERLINKl_Toc3329649506.1鏈?zhǔn)皆O(shè)計(jì)PAGEREF_Toc332964950h19HYPERLINKl_Toc3329649516.2觀察者模式PAGEREF_Toc33296495

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

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

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

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

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

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

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

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

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

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

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

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

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

溫馨提示

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

評(píng)論

0/150

提交評(píng)論