Tomcat系統(tǒng)架構(gòu)如下圖:
Tomcat有兩個核心組件:Connector和Container薪前,Connector組件可以被替換掉,它不僅跟服務(wù)器本身的設(shè)計有關(guān)苍狰,而且和不同的應(yīng)用場景也十分相關(guān)露筒。一個Container可以選擇對應(yīng)多個Connector。多個Connector和一個Container就形成了一個Service废酷,Service對外提供服務(wù)瘟檩。同時Server來管理Service的生命周期等。
Service:
Service主要的作用是連接Connector和Container澈蟆,把它們組裝在一起向外提供服務(wù)墨辛。一個Service只能包含一個Container,但是可以有多個Connector趴俘。
Service接口中定義了關(guān)聯(lián)Connector和Container睹簇,同時初始化它下面的其他組件的方法。但在接口中并沒有規(guī)定一定要控制它下面的組件的生命周期寥闪。所有組件的生命周期在一個Lifecycle的接口中并控制太惠。這里用到了觀察者模式。
lifecycleListener代表的是抽象觀察者橙垢,它定義了一個lifecycleEvent方法垛叨,這個方法就是當(dāng)主題變化時要執(zhí)行的方法。ServerLifecycleListener代表的是具體的觀察者柜某,他實現(xiàn)了LifecycleListener借口的方法嗽元,就是這個具體的觀察者具體的實現(xiàn)方式。Lifecycle接口代表的是抽象主題喂击,它定義了管理觀察者的方法和它要做的其它方法剂癌。而StandardServer代表的是具體主題,他實現(xiàn)了抽象主題的所有方法翰绊。
Server:
server提供一個接口讓其他程序能夠訪問到這個Service集合佩谷,同時要維護它所包含的所有Service的生命周期,包括如何初始化监嗜、如何結(jié)束服務(wù)谐檀、如何找到別人要訪問的Service。
Connect組件:
Connect組件的主要負(fù)責(zé)任務(wù)是接受瀏覽器發(fā)過來的TCP連接請求裁奇,創(chuàng)建一個Request和Response對象分別用于請求端交換數(shù)據(jù)桐猬。然后會產(chǎn)生一個線程來處理這個請求并把產(chǎn)生的Request和Response對象傳給處理這個請求的線程,處理這個請求的線程就是Container組件要做的事了刽肠。
Container組件:
Container是容器的父接口溃肪,所有子容器都必須實現(xiàn)這個接口免胃,Container容器采用的是典型的責(zé)任鏈的設(shè)計模式,它由4個子容器組件構(gòu)成惫撰,分別是Engine羔沙、Host、Content和Wrapper厨钻,這4個組件不是平行的扼雏,而是父子關(guān)系,Engine包含Host夯膀,Host包含Context呢蛤,Context包含Wrapper。通常一個Servlet class對應(yīng)一個Wrapper棍郎,如果有多個Servlet其障,則可以定義多個Wrapper。
在責(zé)任鏈中Pipeline和Valve擴展了這個鏈的功能涂佃,使得在鏈向下傳遞的過程中励翼,能夠接收外界的干預(yù),也就是對里面的Request和Response對象傳遞做干預(yù):
Container的總體設(shè)計:
Context還可以定義在父容器Host中辜荠,Host不是必須的汽抚,但是要運行war程序,就必須要用Host伯病,因為在war中必有web.xml文件造烁,這個文件的解析就需要Host。一個Engine代表一個完整的Servlet引擎午笛。
Engine容器:
Engine容器比較簡單惭蟋,他只定義了一些基本的關(guān)聯(lián)關(guān)系,他沒有父類容器药磺。
Host容器:
Host是Engine的子容器告组,一個Host在Engine中代表一個虛擬主機,這個虛擬主機的作用就是運行多個應(yīng)用癌佩,并且標(biāo)識這個應(yīng)用以便能夠區(qū)分它們木缝。它的子容器通常是Context,他除了關(guān)聯(lián)子容器外围辙,還保存一個主機應(yīng)有的信息我碟。
Context容器:
Context代表Servlet的Context,它具備了Servlet運行的基本環(huán)境姚建,理論上只要有Context就能運行Servlet了矫俺。Context最重要的功能就是管理它里面的Servlet實例,Servlet實例在Context中是以Wrapper出現(xiàn)的。還有一點就是Context如何才能找到正確的Servlet來執(zhí)行它恳守,這個功能是通過Request來分配的。
Wrapper容器:
Wrapper代表一個Servlet贩虾,他負(fù)責(zé)管理一個Servlet催烘,包括Servlet的裝載,初始化缎罢、執(zhí)行及資源回收伊群。Wrapper是最底層的容器,它沒有子容器了策精。
Wrapper的實現(xiàn)類是StandardWrapper舰始,StandardWrapper還實現(xiàn)了擁有一個Servlet初始化信息的ServletConfig,由此看出StandardWrapper將直接和Servlet的各種信息打交道