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)
    注:啟動過程:初始化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ù)存儲等程序。
  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)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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