Tomcat原理架構(gòu)簡介

Tomcat組件

  1. 概述:核心組件:Connector 和 Container(以夫妻為例介紹)偷线。多個(gè) Connector 和一個(gè) Container 就形成了一個(gè) Service拍柒。Service 只是在 Connector 和 Container 外面多包一層,把它們組裝在一起顾犹,向外面提供服務(wù)原探,一個(gè) Service 可以設(shè)置多個(gè) Connector,但是只能有一個(gè) Container 容器。



    注:整個(gè) Tomcat 的生命周期(通過實(shí)現(xiàn)Lifecycle實(shí)現(xiàn))由 Server 控制讯屈,作用就是要能夠提供一個(gè)接口讓其它程序能夠訪問到這個(gè) Service 集合、同時(shí)要維護(hù)它所包含的所有 Service 的生命周期易猫,包括如何初始化耻煤、如何結(jié)束服務(wù)、如何找到別人要訪問的 Service准颓。

  2. 其他重要組件:安全組件 security哈蝇、logger 日志組件、session攘已、mbeans炮赦、naming 等。這些組件共同為 Connector 和 Container 提供必要的服務(wù)样勃。

  3. Connector:
    負(fù)責(zé)接收瀏覽器的發(fā)過來的 tcp 連接請求吠勘,創(chuàng)建一個(gè) Request 和 Response 對象分別用于和請求端交換數(shù)據(jù)性芬,然后從線程池中取出一個(gè)線程來處理這個(gè)請求,并把產(chǎn)生的 Request 和 Response 對象傳給處理這個(gè)請求的線程剧防。Connector有三種IO處理模型BIO植锉、NIO、AIO(APR)
    注:啟動(dòng)過程:初始化SeverSocket, 初始化線程池峭拘,構(gòu)建Request 和 Response俊庇,請求到來時(shí),激活線程鸡挠,解析http協(xié)議辉饱,把頭寫到Request 和 Response中,傳給Container,完成之后返回Request 和 Response對象拣展,關(guān)閉當(dāng)前Socket,回收線程彭沼。
    BIO、NIO备埃、AIO適用場景分析:
    BIO方式適用于連接數(shù)目比較小且固定的架構(gòu)姓惑,這種方式對服務(wù)器資源要求比較高,并發(fā)局限于應(yīng)用中瓜喇,JDK1.4以前的唯一選擇挺益,但程序直觀簡單易理解。
    NIO方式適用于連接數(shù)目多且連接比較短(輕操作)的架構(gòu)乘寒,比如聊天服務(wù)器,并發(fā)局限于應(yīng)用中匪补,編程比較復(fù)雜伞辛,JDK1.4開始支持。
    AIO方式使用于連接數(shù)目多且連接比較長(重操作)的架構(gòu)夯缺,比如相冊服務(wù)器蚤氏,充分調(diào)用OS參與并發(fā)操作,編程比較復(fù)雜踊兜,JDK7開始支持竿滨。
    Tomcat中BIO與NIO

  4. Container:
    Container 是容器的父接口,所有子容器都必須實(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担忧。(子容器的路由放在request中)
    Wrapper 代表一個(gè) Servlet芹缔,它負(fù)責(zé)管理一個(gè) Servlet,包括的 Servlet 的裝載瓶盛、初始化乖菱、執(zhí)行以及資源回收。Wrapper 是最底層的容器蓬网,Context是 Servlet 運(yùn)行的基本環(huán)境窒所,對應(yīng)Web工程,定義在父容器 Host 中帆锋,Host 不是必須的吵取,但是要運(yùn)行 war 程序,就必須要 Host锯厢,因?yàn)?war 中必有 web.xml 文件皮官,這個(gè)文件的解析需要 Host ,如果要有多個(gè) Host 就要定義一個(gè) top 容器 Engine 了实辑。而 Engine 沒有父容器了捺氢,一個(gè) Engine 代表一個(gè)完整的 Servlet 引擎。

  5. 責(zé)任鏈模式:很多對象由每個(gè)對象對其下家的引用連接起來形成剪撬,請求在鏈上傳遞摄乒,這樣可以不影響客戶端而能夠在鏈上增加任意處理節(jié)點(diǎn)。包含抽象處理者和具體處理者残黑,整個(gè)容器就是通過一個(gè)鏈連接在一起馍佑,這個(gè)鏈一直將請求正確傳遞給最終處理的Servlet。(其中Pipeline和Value擴(kuò)展了鏈的功能梨水,使得可以接收外界干預(yù))拭荤。
    注:此外,還有命令模式疫诽,觀察者模式舅世,門面模式等

請求處理流程


描述:

  1. 用戶點(diǎn)擊網(wǎng)頁內(nèi)容,請求被發(fā)送到本機(jī)端口8080奇徒,被在那里監(jiān)聽的Coyote HTTP/1.1 Connector獲得雏亚。
  2. Connector把該請求交給它所在的Service的Engine來處理,并等待Engine的回應(yīng)逼龟。
  3. Engine獲得請求localhost/test/index.jsp评凝,匹配所有的虛擬主機(jī)Host。
  4. Engine匹配到名為localhost的Host(即使匹配不到也把請求交給該Host處理腺律,因?yàn)樵揌ost被定義為該Engine的默認(rèn)主機(jī))奕短,名為localhost的Host獲得請求/test/index.jsp宜肉,匹配它所擁有的所有的Context。Host匹配到路徑為/test的Context(如果匹配不到就把該請求交給路徑名為“ ”的Context去處理)翎碑。
  5. path=“/test”的Context獲得請求/index.jsp谬返,在它的mapping table中尋找出對應(yīng)的Servlet。Context匹配到URL PATTERN為*.jsp的Servlet,對應(yīng)于JspServlet類日杈。
  6. 構(gòu)造HttpServletRequest對象和HttpServletResponse對象遣铝,作為參數(shù)調(diào)用JspServlet的doGet()或doPost().執(zhí)行業(yè)務(wù)邏輯、數(shù)據(jù)存儲(chǔ)等程序莉擒。
  7. Context把執(zhí)行完之后的HttpServletResponse對象返回給Host酿炸。
  8. Host把HttpServletResponse對象返回給Engine。
  9. Engine把HttpServletResponse對象返回Connector涨冀。
  10. Connector把HttpServletResponse對象返回給客戶Browser填硕。

參考鏈接
https://www.ibm.com/developerworks/cn/java/j-lo-tomcat1/
http://www.cnblogs.com/hggen/p/6264475.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鹿鳖,隨后出現(xiàn)的幾起案子扁眯,更是在濱河造成了極大的恐慌,老刑警劉巖翅帜,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姻檀,死亡現(xiàn)場離奇詭異,居然都是意外死亡涝滴,警方通過查閱死者的電腦和手機(jī)绣版,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狭莱,“玉大人僵娃,你說我怎么就攤上這事∫该睿” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵讯榕,是天一觀的道長骤素。 經(jīng)常有香客問我,道長愚屁,這世上最難降的妖魔是什么济竹? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮霎槐,結(jié)果婚禮上送浊,老公的妹妹穿的比我還像新娘。我一直安慰自己丘跌,他們只是感情好袭景,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布唁桩。 她就那樣靜靜地躺著,像睡著了一般耸棒。 火紅的嫁衣襯著肌膚如雪荒澡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天与殃,我揣著相機(jī)與錄音单山,去河邊找鬼。 笑死幅疼,一個(gè)胖子當(dāng)著我的面吹牛米奸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播爽篷,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼悴晰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了狼忱?” 一聲冷哼從身側(cè)響起膨疏,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钻弄,沒想到半個(gè)月后佃却,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡窘俺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年饲帅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘤泪。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡灶泵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出对途,到底是詐尸還是另有隱情赦邻,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布实檀,位于F島的核電站惶洲,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏膳犹。R本人自食惡果不足惜恬吕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望须床。 院中可真熱鬧铐料,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至妻柒,卻和暖如春扛拨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背举塔。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工绑警, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人央渣。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓计盒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親芽丹。 傳聞我的和親對象是個(gè)殘疾皇子北启,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容