www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > > 架構(gòu)師社區(qū)
[導(dǎo)讀]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 通信。



總體架構(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,一個(gè) server 有多個(gè) service,一個(gè) service 有多個(gè)連接器和一個(gè)容器,連接器和容器之間通過 ServletRequest 和 ServletResponse 通信。

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

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

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

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ì)化:
  • 監(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

接口,抽象實(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é)議的解析方法和請求處理方式。

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

Endpoint 接收到 socket 連接后,生成一個(gè) socketProcessor 交給線程池處理,run 方法會(huì)調(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。

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

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

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

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

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

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

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

wrapper 容器的最后一個(gè) valve 創(chuàng)建一個(gè) filter 鏈,并調(diào)用 doFilter 方法,最終會(huì)調(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 中的一個(gè)成員變量,spring 中的 ApplicationContext 是 servlet 規(guī)范中的 ServletContext 屬性。

作者:rhsphere


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

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

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

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

長按訂閱更多精彩▼

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

如有收獲,點(diǎn)個(gè)在看,誠摯感謝


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

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

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢抑制與過流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉