Change Dir

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

          統(tǒng)計

          留言簿(18)

          積分與排名

          “牛”們的博客

          各個公司技術(shù)

          我的鏈接

          淘寶技術(shù)

          閱讀排行榜

          評論排行榜

          tomcat流程總結(jié)

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

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

          clip_image002

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

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

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

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

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

          That is it

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

          clip_image004

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

          參考資料:

          《How tomcat works》

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

          posted on 2011-09-27 14:54 changedi 閱讀(2370) 評論(2)  編輯  收藏 所屬分類: Java技術(shù)

          評論

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

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

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

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

          主站蜘蛛池模板: 陇南市| 太白县| 阜新| 外汇| 喀什市| 贺州市| 盐山县| 崇义县| 福海县| 博湖县| 丰城市| 民县| 惠东县| 徐闻县| 台南市| 伊宁县| 五峰| 新津县| 随州市| 郯城县| 扎鲁特旗| 多伦县| 永宁县| 安陆市| 文成县| 赤水市| 宿迁市| 广南县| 东乌珠穆沁旗| 永和县| 湖口县| 镇远县| 桓仁| 普兰店市| 化德县| 都昌县| 兴文县| 万盛区| 南充市| 五华县| 西华县|