處理 socket 連接,負(fù)責(zé)將網(wǎng)絡(luò)字節(jié)流與 Request 和 Response 對象的轉(zhuǎn)化;加載和管理 Servlet,以及具體處理 Request 請求;Tomcat 支持的 io 模型有 NIO、NIO2、APR,Tomcat" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運(yùn)營 > 牛逼!硬核圖解 Tomcat 整體架構(gòu)

牛逼!硬核圖解 Tomcat 整體架構(gòu)

時(shí)間:2023-07-12 09:03:02 | 來源:網(wǎng)站運(yùn)營

時(shí)間:2023-07-12 09:03:02 來源:網(wǎng)站運(yùn)營

牛逼!硬核圖解 Tomcat 整體架構(gòu):

總體架構(gòu)

核心功能:

Tomcat 支持的 io 模型有 NIO、NIO2、APR,Tomcat 支持的應(yīng)用層協(xié)議有 http1.1 ajp http2.0。

Tomcat 最頂層是 server,一個(gè) server 有多個(gè) service,一個(gè) service 有多個(gè)連接器和一個(gè)容器,連接器和容器之間通過 ServletRequest 和 ServletResponse 通信。

通過組合模式、模板方法、觀察者模式和骨架抽象類,tomcat 定義了基類 LifeCycleBean 實(shí)現(xiàn) LifeCycle 接口,把公共的邏輯,生命周期狀態(tài)轉(zhuǎn)變和維護(hù)、生命事件的觸發(fā)和監(jiān)聽器的添加刪除,子類負(fù)責(zé)實(shí)現(xiàn)自己的 init、stop 和 start 等方法。

StandardServer、StandardService 等是 Server 和 Service 組件的具體實(shí)現(xiàn)類,它們都繼承了 LifecycleBase。

StandardEngine、StandardHost、StandardContext 和 StandardWrapper 是相應(yīng)容器組件的具體實(shí)現(xiàn)類,因?yàn)樗鼈兌际侨萜?,所以繼承了 ContainerBase 抽象基類,而 ContainerBase 實(shí)現(xiàn)了 Container 接口,也繼承了 LifecycleBase 類,它們的生命周期管理接口和功能接口是分開的。

連接器 Connector

連接器進(jìn)一步細(xì)化:

按照高內(nèi)聚的功能劃分:

組件通過接口交互,好處是封裝變化。Endpoint 負(fù)責(zé)提供字節(jié)流給 Processor,Processor 負(fù)責(zé)提供 tomcat request 對象給 Adapter,Adapter負(fù)責(zé)提供 Servlet Request 給容器。

其中 Endpoint 和 Processor 抽象組裝在一起形成了 ProtocolHandler 組件。

ProtocolHandler

Endpoint

接口,抽象實(shí)現(xiàn)類是 AbstractEndpoint,具體子類在 NioEndpoint 和 Nio2Endpoint,其中兩個(gè)重要組件:Acceptor 和 SocketProcessor。

Acceptor 用于監(jiān)聽 Socket 連接請求,SocketProcessor 用于處理收到的 Socket 請求,提交到線程池 Executor 處理。

Processor

接收 Endpoint 的 socket,讀取字節(jié)流解析成 tomcat request 和 response,通過 adapter 將其提交到容器處理。Processor 的具體實(shí)現(xiàn)類 AjpProcessor、Http11Processor 實(shí)現(xiàn)了特定協(xié)議的解析方法和請求處理方式。

Endpoint 接收到 socket 連接后,生成一個(gè) socketProcessor 交給線程池處理,run 方法會調(diào)用 Processor 解析應(yīng)用層協(xié)議,生成 tomcat request 后,調(diào)用 adapter 的 service 方法。

Adapter

ProtocolHandler 接口負(fù)責(zé)解析請求生成 tomcat requst,CoyoteAdapter 的 service 方法,將 Tomcat Request 對象,轉(zhuǎn)成 ServletRequest,再調(diào)用 service 方法。

容器 Container

容器的層次結(jié)構(gòu)

父子關(guān)系的 Engine、Host、Context、Wrapper 和 Servlet。Context 表示 web 應(yīng)用程序、wrapper 表示 servlet、context 有多個(gè) wrapper,host 也有多個(gè) context。

Host 代表的是一個(gè)虛擬主機(jī),或者說一個(gè)站點(diǎn),可以給 Tomcat 配置多個(gè)虛擬主機(jī)地址,而一個(gè)虛擬主機(jī)下可以部署多個(gè) Web 應(yīng)用程序;Engine 表示引擎,用來管理多個(gè)虛擬站點(diǎn),一個(gè) Service 最多只能有一個(gè) Engine。

容器通過 Pipeline-Valve 責(zé)任鏈,對請求一次處理,invoke 處理方法,每個(gè)容器都有一個(gè) Pipeline,觸發(fā)第一個(gè) Valve,這個(gè)容器的 valve 都會被調(diào)到,不同容器之間通過 Pipeline 的 getBasic 方法,負(fù)責(zé)調(diào)用下層容器的第一個(gè) Valve。

整個(gè)調(diào)用連由連接器中的 adapter 觸發(fā),調(diào)用 engine 中的第一個(gè) Valve。

// Calling the containerconnector.getService().getContainer().getPipeline().getFirst().invoke(request, response);wrapper 容器的最后一個(gè) valve 創(chuàng)建一個(gè) filter 鏈,并調(diào)用 doFilter 方法,最終會調(diào)用到 servlet 的 service 方法。

final class StandardWrapperValve extends ValveBase { @Override public final void invoke(Request request, Response response) throws IOException, ServletException { // ... ApplicationFilterChain filterChain = ApplicationFilterFactory.createFilterChain(request, wrapper, servlet); // Call the filter chain for this request // NOTE: This also calls the servlet's service() method Container container = this.container; try { if ((servlet != null) && (filterChain != null)) { // Swallow output if needed if (context.getSwallowOutput()) { try { SystemLogHandler.startCapture(); if (request.isAsyncDispatching()) { request.getAsyncContextInternal().doInternalDispatch(); } else { // dofilter filterChain.doFilter(request.getRequest(), response.getResponse()); } } finally { String log = SystemLogHandler.stopCapture(); if (log != null && log.length() > 0) { context.getLogger().info(log); } } } else { if (request.isAsyncDispatching()) { request.getAsyncContextInternal().doInternalDispatch(); } else { // dofilter filterChain.doFilter (request.getRequest(), response.getResponse()); } } } } catch() { // ... } }}ServletContext 是 tomcat 中的一個(gè)成員變量,spring 中的 ApplicationContext 是 servlet 規(guī)范中的 ServletContext 屬性。


原作者:rhspher
原文鏈接:牛逼!硬核圖解 Tomcat 整體架構(gòu)
原出處:碼農(nóng)code之路
侵刪


關(guān)鍵詞:整體,圖解

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉