柚子快報激活碼778899分享:Tomcat 架構(gòu)剖析
柚子快報激活碼778899分享:Tomcat 架構(gòu)剖析
HTTP -> Servlet 工作流程
HTTP服務(wù)器不直接調(diào)用業(yè)務(wù)類,而是把請求交給容器來處理,容器通過Servlet接口調(diào)用業(yè)務(wù)類。因此Servlet接口和Servlet容器的出現(xiàn),達(dá)到了HTTP服務(wù)器與業(yè)務(wù)類解耦的目的。而servlet接口和servlet容器這一整套規(guī)范叫作servlet規(guī)范。Tomcat按照servlet規(guī)范的要求實現(xiàn)了Servlet容器,同時它們也具有HTTP服務(wù)器的功能。作為Java程序員,如果我們要實現(xiàn)新的業(yè)務(wù)功能,只需要實現(xiàn)一個servlet,并把它注冊到Tomcat(Servlet容器)中,剩下的事情就由Tomcat幫我們處理了。
Servlet 容器工作流程
? 為了解耦,HTTP服務(wù)器不直接調(diào)用servlet,而是把請求交給servlet容器來處理,那servlet容器又是怎么工作的呢?當(dāng)客戶請求某個資源時,HTTP服務(wù)器會用一個servletRequest對象把客戶的請求信息封裝起來,然后調(diào)用servlet容器的service方法,Servlet容器拿到請求后,根據(jù)請求的uRL和servlet的映射關(guān)系,找到相應(yīng)的servlet,如果servlet還沒有被加載,就用反射機(jī)制創(chuàng)建這個servlet,并調(diào)用servlet的init方法來完成初始化,接著調(diào)用servlet的service方法來處理請求,把servletResponse對象返回給HTTP服務(wù)器,HTTP服務(wù)器會把響應(yīng)發(fā)送給客戶端。
Tomcat 整體架構(gòu)
Tomcat要實現(xiàn)兩個核心功能: 向外連接(Connector 連接器),向內(nèi)處理(Container 容器)
1)處理socket連接,負(fù)責(zé)網(wǎng)絡(luò)字節(jié)流與Request和Response對象的轉(zhuǎn)化。 2)加載和管理servlet,以及具體處理Request請求。 因此Tomcat設(shè)計了兩個核心組件連接器(Connector)和容器(container)來分別做這兩件事情。連接器負(fù)責(zé)對外交流,容器負(fù)責(zé)內(nèi)部處理。
連接器 Coyote
Coyote是Tomcat的連接器框架的名稱,是Tomcat服務(wù)器提供的供客戶端訪問的外部接口。客戶端通過coyote與服務(wù)器建立連接、發(fā)送請求并接受響應(yīng)。 Coyote封裝了底層的網(wǎng)絡(luò)通信(Socket請求及響應(yīng)處理),為catalina容器提供了統(tǒng)一的接口,使catalina容器與具體的請求協(xié)議及ro操作方式完全解耦。Coyote將socket輸入轉(zhuǎn)換封裝為Request對象,交由catalina容器進(jìn)行處理,處理請求完成后,Catalina通過coyote提供的Response對象將結(jié)果寫入輸出流。 Coyote作為獨(dú)立的模塊,只負(fù)責(zé)具體協(xié)議和IO的相關(guān)操作,與servlet規(guī)范實現(xiàn)沒有直接關(guān)系,因此即便是Request和Response對象也并未實現(xiàn)servlet規(guī)范對應(yīng)的接口,而是在catalina中將他們進(jìn)一步封裝為ServletRequest和ServletResponse。
各個組件
1)EndPoint:Coyote通信端點(diǎn),即通信監(jiān)聽的接口,是具體socket接收和發(fā)送處理器,是對傳輸層的抽象,因此EndPoint用來實現(xiàn)TCP/IP協(xié)議的。 2)Tomcat并沒有EndPoint接口,而是提供了一個抽象類AbstractEndpoint,里面定義了兩個內(nèi)部類:Acceptor和SocketProcessor。Acceptor用于監(jiān)聽socket連接請求。SocketProcessor用于處理接收到的socket請求,它實現(xiàn)Runnable接口,在Run方法里調(diào)用協(xié)議處理組件Processor進(jìn)行處理。為了提高處理能力,SocketProcessor被提交到線程池來執(zhí)行。而這個線程池叫作執(zhí)行器(Executor)
Processor:Coyote協(xié)議處理接口,如果說EndPoint是用來實現(xiàn)TCP/IP協(xié)議的,那么Processor用來實現(xiàn)HTTP協(xié)議,Processor接收來自EndPoint的socket,讀取字節(jié)流解析成TomcatRequest和Response對象,并通過Adapter將其提交到容器處理,Processor是對應(yīng)用層協(xié)議的抽象。
ProtocolHandler:Coyote協(xié)議接口,通過Endpoint和Processor,實現(xiàn)針對具體協(xié)議的處理能力。Tomcat按照協(xié)議和I/O提供了6個實現(xiàn)類:AjpNioProtocol,AjpAprProtocol,AjpNio2Protocol,Http11NioProtocol, Http11Nio2Protocol,Http11AprProtocol。我們在配置tomcat/conf/server.xml時,至少要指定具體的ProtocolHandler,當(dāng)然也可以指定協(xié)議名稱,如:HTTP/1.1,如果安裝了APR,那么將使用Http11AprProtocol,否則使用Http11NioProtocol。
Adapter: 由于協(xié)議不同,客戶端發(fā)過來的請求信息也不盡相同,Tomcat定義了自己的Request類來"存放"這些請求信息。ProtocolHandler接口負(fù)責(zé)解析請求并生成TomcatRequest類。但是這個Request對象不是標(biāo)準(zhǔn)的servletRequest,也就意味著,不能用TomcatRequest作為參數(shù)來調(diào)用容器。Tomcat設(shè)計者的解決方案是引入coyoteAdapter,這是適配器模式的經(jīng)典運(yùn)用,連接器調(diào)用coyoteAdapter的Sevice方法,傳入的是TomcatRequest對象,CoyoteAdapter負(fù)責(zé)TomcatRequest轉(zhuǎn)成servletRequest,再調(diào)用容器的Service方法。
在coyote中,Tomcat支持的多種I/O模型和應(yīng)用層協(xié)議,具體包含哪些IO模型和應(yīng)用層協(xié)議,請看下表: Tomcat支持的IO模型(自8.5/9.0版本起,Tomcat移除了對BIO的支持): Tomcat 支持的應(yīng)用層協(xié)議: 在8.0之前,Tomcat默認(rèn)采用的I/O方式為BIO,之后改為NIO。無論NIO、NIO2還是APR,在性能方面均優(yōu)于以往的BIO。如果采用APR,甚至可以達(dá)到Apache HTTP Server的影響性能。
Tomcat為了實現(xiàn)支持多種I/O模型和應(yīng)用層協(xié)議,一個容器可能對接多個連接器,就好比一個房間有多個門。但是單獨(dú)的連接器或者容器都不能對外提供服務(wù),需要把它們組裝起來才能工作,組裝后這個整體叫作service組件。這里請你注意,Service本身沒有做什么重要的事情,只是在連接器和容器外面多包了一層,把它們組裝在一起。Tomcat內(nèi)可能有多個service,這樣的設(shè)計也是出于靈活性的考慮。通過在Tomcat中配置多個service,可以實現(xiàn)通過不同的端口號來訪問同一臺機(jī)器上部署的不同應(yīng)用。
容器 Catalina
Tomcat是一個由一系列可配置的組件構(gòu)成的web容器,而catalina是Tomcat的servlet容器。Catalina是servlet容器實現(xiàn),還涉及到安全、會話、集群、管理等Servlet容器架構(gòu)的各個方面。它通過松耦合的方式集成Coyote,以完成按照請求協(xié)議進(jìn)行數(shù)據(jù)讀寫。同時,它還包括我們的啟動入口、Shell程序等。
Tomcat 模塊分層示意圖: Tomcat本質(zhì)上就是一款Servlet容器,因此Catalina才是Tomcat的核心,其他模塊都是為Catalina提供支撐的。比如:通過Coyote模塊提供鏈接通信,Jasper模塊提供JSP引l擎,Naming提供JNDI服務(wù),Juli提供日志服務(wù)。
結(jié)構(gòu):
如下圖所示,Catalina負(fù)責(zé)管理Server,而Server表示著整個服務(wù)器。Server下面有多個服務(wù)Service,每個服務(wù)都包含著多個連接器組件Connector(Coyote實現(xiàn))和一個容器組件Container。在Tomcat啟動的時候,會初始化一個Catalina的實例。 各個組件的職責(zé):
細(xì)看 Container 結(jié)構(gòu):
Tomcat設(shè)計了4種容器,分別是Engine、Host、Context和wrapper。這4種容器不是平行關(guān)系,而是父子關(guān)系。,Tomcat通過一種分層的架構(gòu),使得servlet容器具有很好的靈活性。 各個組件的含義: 我們也可以再通過Tomcat的server.xml配置文件來加深對Tomcat容器的理解。Tomcat采用了組件化的設(shè)計,它的構(gòu)成組件都是可配置的,其中最外層的是server,其他組件按照一定的格式要求配置在這個頂層容器中。 那么,Tomcat是怎么管理這些容器的呢?你會發(fā)現(xiàn)這些容器具有父子關(guān)系,形成一個樹形結(jié)構(gòu),你可能馬上就想到了設(shè)計模式中的組合模式。沒錯,Tomcat就是用組合模式來管理這些容器的。具體實現(xiàn)方法是,所有容器組件都實現(xiàn)了container接口,因此組合模式可以使得用戶對單容器對象和組合容器對象的使用具有一致性。這里單容器對象指的是最底層的wrapper,組合容器對象指的是上面的context、Host或者Engine。
Container 接口提供的方法如下: 在上面的接口看到了getParent、SetParent、addchild和removeChild等方法。 Container接口擴(kuò)展了LifeCycle接口,LifeCycle接口用來統(tǒng)一管理各組件的生命周期。
柚子快報激活碼778899分享:Tomcat 架構(gòu)剖析
參考鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。