Change Dir

          先知cd——熱愛(ài)生活是一切藝術(shù)的開(kāi)始

          統(tǒng)計(jì)

          留言簿(18)

          積分與排名

          “牛”們的博客

          各個(gè)公司技術(shù)

          我的鏈接

          淘寶技術(shù)

          閱讀排行榜

          評(píng)論排行榜

          tomcat流程總結(jié)

          首先聲明,這個(gè)可能已經(jīng)算是老掉牙的東西了~~~Long Long ago

          斷斷續(xù)續(xù)兩周時(shí)間來(lái)看了看tomcat4的源碼。雖然有點(diǎn)古舊,但是配合著《How tomcat works》一書(shū)看看源碼,還是很愜意的事情。中途數(shù)次想拿起紙筆抑或打開(kāi)word書(shū)寫(xiě)下筆記,但是書(shū)中簡(jiǎn)潔的文風(fēng)讓我覺(jué)得沒(méi)有什么可以記下的。直到最后讀完這書(shū),過(guò)完源碼。才覺(jué)得應(yīng)該記下一些要點(diǎn)來(lái)。簡(jiǎn)單稱(chēng)之為總結(jié)吧。

          clip_image002

          其實(shí)搞懂tomcat或者是類(lèi)似的servlet的工作原理,只要配合理解這張圖就可以了。這就是tomcat的整個(gè)工作流程。

          一個(gè)HTTP請(qǐng)求到來(lái),其實(shí)本質(zhì)上只是一個(gè)輸入流,在這個(gè)流中蘊(yùn)含了那些字節(jié)代表了這個(gè)請(qǐng)求的語(yǔ)義。而圖中的1.message就抽象了這個(gè)流,把它表示為一條信息。在到達(dá)容器的第一時(shí)刻,容器是交給connector來(lái)處理的。首先這里得考慮一個(gè)容器的啟動(dòng)過(guò)程,啟動(dòng)時(shí)做的一個(gè)重要事情就是初始化connector,而connector初始化時(shí)干什么呢?顯然,創(chuàng)建socket。一切初始化好了,才有第一步消息到來(lái)這件事情咯。

          信息到了,connector干的事情就是如圖中的2和3步——?jiǎng)?chuàng)建http請(qǐng)求對(duì)象和響應(yīng)對(duì)象。當(dāng)然這個(gè)行為也不是connector自己干的,它只是雇傭了一個(gè)叫做HttpProcessor的兄弟來(lái)干活。真正的creation都是這個(gè)兄弟干的。HttpProcessor里面設(shè)計(jì)了一些簡(jiǎn)單的并發(fā)多線程trick,基本上就是讓socket等待著請(qǐng)求信息的到來(lái),來(lái)一個(gè),就處理一個(gè)。HttpProcessor的一句話總結(jié)就是利用多線程技術(shù)parse整個(gè)請(qǐng)求的stream。幾個(gè)parse步驟分別是:解析connection;解析request;解析headers。補(bǔ)充一句,request和response對(duì)象都是在HttpProcessor初始化的時(shí)候初始化的,但是它們內(nèi)容的填充是在parse的時(shí)候完成的。

          接著,connector的任務(wù)就結(jié)束了。然后一個(gè)invoke其實(shí)就是工作的交接,該context重磅登場(chǎng)了。Context以其名字就決定了其霸氣的側(cè)漏無(wú)疑,基本上所有的東西都包含在內(nèi)。我們把3的invoke當(dāng)做一些context的自我設(shè)置(初始化),那么4的invoke就是context的表演開(kāi)始了。首先在圖里沒(méi)有給出的是loader和logger的處理,context會(huì)在這兩個(gè)依賴(lài)對(duì)象不為空的情況下運(yùn)行它們。Loader是設(shè)置java class loader的,tomcat自己定義了一個(gè)classloader來(lái)加載特定的類(lèi)。而logger無(wú)非就是把日志給啟動(dòng)起來(lái)。當(dāng)然在啟動(dòng)pipeline之前做了啟動(dòng)subcontainer的操作。這是可以理解的,用計(jì)算機(jī)本質(zhì)的遞歸來(lái)理解,有點(diǎn)像是先序遍歷樹(shù)的感覺(jué)。而pipeline被啟動(dòng)后,后續(xù)還有一個(gè)manager的啟動(dòng),這個(gè)manager是主要用來(lái)管理session的。而所有這些都是可以配置的。

          照著上圖主要說(shuō)說(shuō)pipeline,pipeline就是流水線了,上面有很多的閥門(mén)valve,閥門(mén)可以自己加,pipeline的的工作就是步驟5,順序invoke每個(gè)閥門(mén)。其實(shí)也不是pipeline啟動(dòng),pipeline其實(shí)只是啟動(dòng)了內(nèi)置的pipelineContext對(duì)象,而這個(gè)對(duì)象會(huì)不斷的調(diào)用invokenext()方法來(lái)實(shí)現(xiàn)流水線的執(zhí)行。而這些個(gè)valve會(huì)調(diào)用wrapper,他們的invoke方法會(huì)啟動(dòng)wrapper,在檢測(cè)完mapping后,wrapper會(huì)allocate一個(gè)servlet實(shí)例,接著servlet啟動(dòng)、干活、開(kāi)始自己的生命周期……這個(gè)世界就開(kāi)始活躍了。

          That is it

          最后奉上一張稍微詳細(xì)點(diǎn)的圖幫助理解。

          clip_image004

          當(dāng)然,美妙的設(shè)計(jì)這里沒(méi)有講,不是因?yàn)闀r(shí)間不夠或者是空間不足,而是我自己還沒(méi)有完全的消化,tomcat我認(rèn)為從設(shè)計(jì)上講,結(jié)構(gòu)是beautiful的。光是lifecycle的設(shè)計(jì)以及各個(gè)類(lèi)模塊區(qū)分(connector,loader,context,wrapper以及manager等等)之間的初始化調(diào)用等細(xì)節(jié)每個(gè)拿出來(lái)都?jí)驅(qū)懕緯?shū)了。So~~~read the fucking source code by yourself。

          參考資料:

          《How tomcat works》

          Tomcat 系統(tǒng)架構(gòu)與設(shè)計(jì)模式,第 1 部分: 工作原理http://www.ibm.com/developerworks/cn/java/j-lo-tomcat1/

          posted on 2011-09-27 14:54 changedi 閱讀(2365) 評(píng)論(2)  編輯  收藏 所屬分類(lèi): Java技術(shù)

          評(píng)論

          # re: tomcat流程總結(jié) 2011-09-28 10:06 @joe

          恩,總結(jié)的不錯(cuò)。  回復(fù)  更多評(píng)論   

          # re: tomcat流程總結(jié)[未登錄](méi) 2011-09-28 12:31 beansoft

          Good article!  回復(fù)  更多評(píng)論   

          主站蜘蛛池模板: 蓬安县| 通化县| 博湖县| 巴林左旗| 滦南县| 全州县| 新泰市| 商城县| 凤冈县| 贵州省| 海南省| 普定县| 田林县| 广东省| 花莲市| 巧家县| 江阴市| 磐石市| 永嘉县| 古交市| 喀什市| 平潭县| 高清| 定西市| 汤阴县| 清原| 嵊州市| 武隆县| 康平县| 龙岩市| 郓城县| 巴林右旗| 射阳县| 徐州市| 朝阳县| 巨野县| 枣庄市| 云浮市| 云梦县| 靖宇县| 山丹县|