日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > > 架構(gòu)師社區(qū)
[導(dǎo)讀]Tomcat 支持的 io 模型有 NIO、NIO2、APR,Tomcat 支持的應(yīng)用層協(xié)議有 http1.1 ajp http2.0。Tomcat 最頂層是 server,一個 server 有多個 service,一個 service 有多個連接器和一個容器,連接器和容器之間通過 ServletRequest 和 ServletResponse 通信。



總體架構(gòu)

核心功能:
  • 處理 socket 連接,負(fù)責(zé)將網(wǎng)絡(luò)字節(jié)流與 Request 和 Response 對象的轉(zhuǎn)化;

  • 加載和管理 Servlet,以及具體處理 Request 請求;

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

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

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

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

  • tomcat 自定義了監(jiān)聽器;
  • @WebListener 注解,定義自己的監(jiān)聽器;

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

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

連接器 Connector

連接器進一步細化:
  • 監(jiān)聽網(wǎng)絡(luò)端口;
  • 接受網(wǎng)絡(luò)請求;
  • 讀取網(wǎng)絡(luò)字節(jié)流;
  • 根據(jù)應(yīng)用層協(xié)議解析字節(jié)流,生成統(tǒng)一的 tomcat request 和 tomcat response 對象;
  • 將 tomcat request 對象轉(zhuǎn)成 servletRequest;
  • 調(diào)用 servlet 容器,得到 servletResponse;
  • 將 servletResponse 轉(zhuǎn)成 tomcat response;
  • 將 tomcat response 轉(zhuǎn)成網(wǎng)絡(luò)字節(jié)流;
  • 將響應(yīng)字節(jié)流寫回給瀏覽器;
按照高內(nèi)聚的功能劃分:
  • 網(wǎng)絡(luò)通信;
  • 應(yīng)用層協(xié)議解析;
  • tomcat request/response 與 servlet request/response 的轉(zhuǎn)換;

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

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

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

ProtocolHandler

Endpoint

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

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

Processor

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

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

Endpoint 接收到 socket 連接后,生成一個 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 有多個 wrapper,host 也有多個 context。

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

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

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

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

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

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

1//?Calling?the?container
2connector.getService().getContainer().getPipeline().getFirst().invoke(request,?response);

wrapper 容器的最后一個 valve 創(chuàng)建一個 filter 鏈,并調(diào)用 doFilter 方法,最終會調(diào)用到 servlet 的 service 方法。

 1final?class?StandardWrapperValve
2????extends?ValveBase?
{
3
4???@Override
5??????public?final?void?invoke(Request?request,?Response?response)
6??????????throws?IOException,?ServletException?
{
7??????????//?...
8
9??????????ApplicationFilterChain?filterChain?=
10????????????????ApplicationFilterFactory.createFilterChain(request,?wrapper,?servlet);
11
12????????//?Call?the?filter?chain?for?this?request
13????????//?NOTE:?This?also?calls?the?servlet's?service()?method
14????????Container?container?=?this.container;
15????????try?{
16????????????if?((servlet?!=?null)?&&?(filterChain?!=?null))?{
17????????????????//?Swallow?output?if?needed
18????????????????if?(context.getSwallowOutput())?{
19????????????????????try?{
20????????????????????????SystemLogHandler.startCapture();
21????????????????????????if?(request.isAsyncDispatching())?{
22????????????????????????????request.getAsyncContextInternal().doInternalDispatch();
23????????????????????????}?else?{
24
25????????????????????????//?dofilter
26????????????????????????????filterChain.doFilter(request.getRequest(),
27????????????????????????????????????response.getResponse());
28????????????????????????}
29????????????????????}?finally?{
30????????????????????????String?log?=?SystemLogHandler.stopCapture();
31????????????????????????if?(log?!=?null?&&?log.length()?>?0)?{
32????????????????????????????context.getLogger().info(log);
33????????????????????????}
34????????????????????}
35????????????????}?else?{
36????????????????????if?(request.isAsyncDispatching())?{
37????????????????????????request.getAsyncContextInternal().doInternalDispatch();
38????????????????????}?else?{
39????????????????????????//?dofilter
40????????????????????????filterChain.doFilter
41????????????????????????????(request.getRequest(),?response.getResponse());
42????????????????????}
43????????????????}
44
45????????????}
46????????}?catch()?{
47????????//?...
48????????}
49????}
50}

ServletContext 是 tomcat 中的一個成員變量,spring 中的 ApplicationContext 是 servlet 規(guī)范中的 ServletContext 屬性。

作者:rhsphere


特別推薦一個分享架構(gòu)+算法的優(yōu)質(zhì)內(nèi)容,還沒關(guān)注的小伙伴,可以長按關(guān)注一下:

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

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

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

長按訂閱更多精彩▼

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

如有收獲,點個在看,誠摯感謝


免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

隨著現(xiàn)代家庭生活方式不斷升級,廚房已不再只是功能空間,而逐漸成為融合審美表達、健康管理與智能體驗的重要場域。消費者在關(guān)注空間整體性的同時,也對食材儲存的安全性、潔凈度以及使用便利性提出了更高要求?;趯χ袊彝フ鎸嵤褂脠?..

關(guān)鍵字: 冰箱 嵌入式

在嵌入式系統(tǒng)、工業(yè)物聯(lián)網(wǎng)等各類電子設(shè)備中,UART與網(wǎng)口是兩種應(yīng)用廣泛的通信接口,前者作為經(jīng)典的串行通信接口,承擔(dān)著簡單設(shè)備互聯(lián)、調(diào)試日志傳輸?shù)然A(chǔ)任務(wù),后者則專注于高速、遠距離的數(shù)據(jù)交互,是設(shè)備接入網(wǎng)絡(luò)、實現(xiàn)大數(shù)據(jù)量傳...

關(guān)鍵字: 嵌入式 通信接口 網(wǎng)口通訊

在軟件架構(gòu)設(shè)計領(lǐng)域,系統(tǒng)與子系統(tǒng)、模塊與組件、框架與架構(gòu)是一組既緊密相關(guān)又容易混淆的核心概念。這些概念如同建筑設(shè)計中的地基、梁柱、墻體和整體藍圖,共同構(gòu)成了軟件系統(tǒng)的骨架和靈魂。很多開發(fā)者在架構(gòu)設(shè)計過程中,常常因為對這些...

關(guān)鍵字: 架構(gòu) 框架

在軟件開發(fā)領(lǐng)域,設(shè)計模式被譽為“解決特定問題的最佳實踐”,但在嵌入式開發(fā)中,它卻常常處于“邊緣地帶”。許多嵌入式工程師職業(yè)生涯中可能從未刻意使用過設(shè)計模式,甚至認(rèn)為這些“軟件工程理論”與單片機、傳感器、實時系統(tǒng)等硬件緊密...

關(guān)鍵字: 嵌入式 設(shè)計模式

在居住結(jié)構(gòu)持續(xù)演進與消費需求不斷升級的背景下,中國家庭廚房正經(jīng)歷從“功能集合”向“系統(tǒng)空間”的深層轉(zhuǎn)變。廚房不再只是烹飪的場所,而逐漸成為融合效率、健康、美學(xué)與家庭互動的重要生活空間?;趯@一趨勢的長期洞察,西門子家電...

關(guān)鍵字: 嵌入式 蒸玲瓏

在物聯(lián)網(wǎng)設(shè)備、工業(yè)控制系統(tǒng)和智能家居等嵌入式場景中,輕量級WEB服務(wù)器扮演著核心角色。它們不僅需要滿足資源受限環(huán)境下的性能需求,還需兼顧安全性、可擴展性和開發(fā)效率。本文從資源占用、功能特性、適用場景三個維度,對比分析六大...

關(guān)鍵字: 嵌入式 WEB服務(wù)器

在嵌入式軟件開發(fā)工具領(lǐng)域,一場悄然的變革正在發(fā)生。隨著全球軟件行業(yè)向訂閱制轉(zhuǎn)型,嵌入式軟件開發(fā)工具的授權(quán)模式也迎來了重要調(diào)整。市場上的嵌入式軟件開發(fā)工具基本可以分為三類:商用開發(fā)工具,開源開發(fā)工具和廠商私有開發(fā)工具,其中...

關(guān)鍵字: 嵌入式 MCU RISC-V

在資源受限的嵌入式系統(tǒng)中,傳統(tǒng)調(diào)試工具(如JTAG)往往成本高昂且占用引腳資源。本文介紹一種基于串口的低成本調(diào)試方案,通過自定義協(xié)議實現(xiàn)內(nèi)存數(shù)據(jù)的實時監(jiān)控,硬件成本可降低80%以上,特別適用于8/16位MCU開發(fā)場景。

關(guān)鍵字: 嵌入式 串口 內(nèi)存數(shù)據(jù)

隨著國家家電以舊換新補貼政策的持續(xù)推進,綠色節(jié)能、品質(zhì)升級正成為越來越多家庭的新年煥新關(guān)鍵詞。面對消費者在居住空間、生活效率與健康體驗上的多元需求,西門子家電圍繞新春煥新節(jié)點,正式開啟“開門紅”煥新季,通過國家補貼與企業(yè)...

關(guān)鍵字: 嵌入式 咖啡機 嵌飲機
關(guān)閉