由於面試中被問到tomcat的時候,讓面試官問得人仰馬翻,啞口無言,所以回來之後洗心革面,下決心要把tomcat好好研究個明白,再也無法容忍自己只知其一不知其二了。於是上阿帕奇的官網上找文檔找資料,當源碼,在一些技術論壇找高人的分析帖子,並且蒐羅相關的書籍,無奈一番折騰後都不能讓我滿意,因爲一千個人對一個事物或許會有一千個看法和觀點。網上此類介紹tomcat的技術類帖子更多的都是些抄襲,說到這裏,本人在此鄭重聲明,做技術的人應該恪守一點職業道德,那就是責任心(我曾經給自己取的網名就是扯嗓門講大道理的人),你想給大家講某個東西的話,必須應該是自己真正親自分析研究過的,這是最最起碼的要求,千萬不能東抄一點西抄一點拼湊,不懂瞎裝,瞎寫,這是極其讓人鄙視的態度,雖然當下這個時代,大家確實都比較浮躁,而且急功近利,但越是這樣,就更需要大家堅守自己,尤其是做技術的人,對技術必須秉承實事求是,嚴謹,務實的態度,徹底刨掉那些虛華的東西,這樣我們纔敢從心態上說我們稱得上是一位真正做技術的人。
好了,說了這麼多廢話,浪費大家時間了,下面說說我對tomcat源碼研究的幾點展望,衆所周知,tomcat是一個開源的Servlet容器,而這個容器的主要作用就是負責處理和響應客戶請求(我們暫且忽略其他的一些次要的方面)。那麼好,我們可以先做這樣一個比喻,tomcat應該可以比作一部機器,這部機器可以接受客戶端的請求,並返回一個結果給客戶端,而且這部機器的原材料是java。那麼我們想知道,這部機器的結構是怎麼樣的?它的組成部分有哪些,這些組成部分是如何被組織到一塊的?這應該是第一步,即對tomcat的整體組成要有個縱覽,知道tomcat這部機器都有些什麼組成部分,知道每一部分主要都負責了什麼工作,這一點非常重要;那麼第二步,就是,這部機器是如何啓動的?《精通tomcat》一書中把tomcat比作一部發動機,再恰當不過了,因爲在它正常提供處理客戶端請求的服務之前,它得先完成它的啓動,我拿到源碼之後(版本號是TOMCAT_6_0_12),也是參考《精通tomcat》一書的指導,找到Bootstrap類,然後Dubug
as Java Application,一步一步跟源碼來研究tomcat的啓動脈絡。大家知道,tomcat是一個基於組件的服務器,那麼完成了第一步工作,我想大家應該大體都會知道tomcat裏面都包含了哪些組件了,那麼通過第二步,我相信大家對這些組件是如何組裝並啓動的這個問題,就會有一個比較初始的認識和了解了。我們在日常工作中的系統設計和開發處處強調鬆耦合的思想,那麼我想tomcat裏面這些組件的組織將會是一個非常典範的案例值得我們研究和學習,人家是如何組織自身的組件的,如何裝配的,這個問題,需要大家對digester技術有所研究,當然現在digester已經作爲阿帕奇的一個common項目了,大家可以當相關的文檔和源碼進行深入研究這個技術,我也正在研究學習中,希望大家共同學習共同進步。那麼再完成了前兩部,知道tomcat裏面都有些什麼,並且知道tomcat的啓動流程之後,我覺得就應該對tomcat應答一次請求的全過程進行細緻深入的分析了,客戶端發出向tomcat發出請求之後,tomcat是如何處理的?最先是那個類那個方法來響應,那個組件最先接到了請求的,之後它具體都做了什麼,整個過程的處理邏輯和原則是什麼樣的?搞懂了這些,相信對tomcat的任何返回結果就再也不會感到意外和困惑。遺憾的是,我目前只看到很多地方粗粗地這麼介紹:請求被髮送到本機端口8080,被監聽的HttpConnector獲得,然後再由Connector交給Engine處理,再匹配名爲localhost的Host處理,緊接着由Host匹配Context,再找JSPServelt類等等,這些介紹我目前還深表懷疑,貌似正確,其實說得不免有些籠統,當然也不能說完全錯誤,因爲我目前還沒徹底搞清楚這個問題,也不敢貿然下結論,我只是跟了源碼後發現,請求來了先運行的是CoyoteAdapter這個類的service方法,實踐出真知,還是希望大家親自跟跟源碼去理清楚其中玄機,看看tomcat接受請求處理請求的過程到底是怎麼樣的?我覺得只有搞清楚了這個問題,纔敢說自己對tomcat算是真的懂了一些,至少tomcat對自己不再是個黑盒了。這個過程我目前還在進行中,由於自身能力有限,尚需多少時間能徹底搞清楚還是個未知數,但是我願意繼續努力,今天由於時間原因,先寫到這裏,我會繼續發帖向大家彙報我的進展,更加希望能得到衆多高人的指點,不甚感激,謝謝大家。