Tomcat組件
-
概述:核心組件: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准颓。
其他重要組件:安全組件 security哈蝇、logger 日志組件、session攘已、mbeans炮赦、naming 等。這些組件共同為 Connector 和 Container 提供必要的服務(wù)样勃。
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與NIOContainer:
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 引擎。責(zé)任鏈模式:很多對象由每個(gè)對象對其下家的引用連接起來形成剪撬,請求在鏈上傳遞摄乒,這樣可以不影響客戶端而能夠在鏈上增加任意處理節(jié)點(diǎn)。包含抽象處理者和具體處理者残黑,整個(gè)容器就是通過一個(gè)鏈連接在一起馍佑,這個(gè)鏈一直將請求正確傳遞給最終處理的Servlet。(其中Pipeline和Value擴(kuò)展了鏈的功能梨水,使得可以接收外界干預(yù))拭荤。
注:此外,還有命令模式疫诽,觀察者模式舅世,門面模式等
請求處理流程
描述:
- 用戶點(diǎn)擊網(wǎng)頁內(nèi)容,請求被發(fā)送到本機(jī)端口8080奇徒,被在那里監(jiān)聽的Coyote HTTP/1.1 Connector獲得雏亚。
- Connector把該請求交給它所在的Service的Engine來處理,并等待Engine的回應(yīng)逼龟。
- Engine獲得請求localhost/test/index.jsp评凝,匹配所有的虛擬主機(jī)Host。
- Engine匹配到名為localhost的Host(即使匹配不到也把請求交給該Host處理腺律,因?yàn)樵揌ost被定義為該Engine的默認(rèn)主機(jī))奕短,名為localhost的Host獲得請求/test/index.jsp宜肉,匹配它所擁有的所有的Context。Host匹配到路徑為/test的Context(如果匹配不到就把該請求交給路徑名為“ ”的Context去處理)翎碑。
- path=“/test”的Context獲得請求/index.jsp谬返,在它的mapping table中尋找出對應(yīng)的Servlet。Context匹配到URL PATTERN為*.jsp的Servlet,對應(yīng)于JspServlet類日杈。
- 構(gòu)造HttpServletRequest對象和HttpServletResponse對象遣铝,作為參數(shù)調(diào)用JspServlet的doGet()或doPost().執(zhí)行業(yè)務(wù)邏輯、數(shù)據(jù)存儲(chǔ)等程序莉擒。
- Context把執(zhí)行完之后的HttpServletResponse對象返回給Host酿炸。
- Host把HttpServletResponse對象返回給Engine。
- Engine把HttpServletResponse對象返回Connector涨冀。
- Connector把HttpServletResponse對象返回給客戶Browser填硕。
參考鏈接
https://www.ibm.com/developerworks/cn/java/j-lo-tomcat1/
http://www.cnblogs.com/hggen/p/6264475.html