本篇內(nèi)容主要講解“UAVStack中的調(diào)用鏈是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“UAVStack中的調(diào)用鏈是什么”吧!
創(chuàng)新互聯(lián)專注于韶山網(wǎng)站建設服務及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供韶山營銷型網(wǎng)站建設,韶山網(wǎng)站制作、韶山網(wǎng)頁設計、韶山網(wǎng)站官網(wǎng)定制、成都微信小程序服務,打造韶山網(wǎng)絡公司原創(chuàng)品牌,更為您提供韶山網(wǎng)站排名全網(wǎng)營銷落地服務。
服務端信息收集
服務端信息收集整體流程如下圖所示,通過在應用容器(tomcat等)啟動過程中植入切點從而實現(xiàn)在應用邏輯執(zhí)行之前和之后對請求進行劫持。
應用邏輯執(zhí)行之前:解析request中調(diào)用鏈信息,并初始化調(diào)用鏈上下文;
應用邏輯執(zhí)行之后:解析response中調(diào)用鏈信息,并將本次請求處理的所有調(diào)用鏈信息輸出到日志文件。
切點植入
在介紹切點之前我們應該對servlet容器(本文以tomcat為例)處理一次請求的大致流程有一個整體的了解。
圖片來源于網(wǎng)絡
在Connector接收到一次連接并轉(zhuǎn)化成請求(Request)后,會將請求傳遞到Engine的管道(Pipeline)的閥(ValveA)中。請求在Engine的管道中會傳遞到Engine Valve這個閥中。接著請求會從Engine Valve傳遞到一個Host的管道中,在該管道中傳遞到Host Valve這個閥里。接著從Host Valve傳遞到一個Context的管道中,在該管道中傳遞到Context Valve中。接下來請求會傳遞到Wrapper C內(nèi)的管道所包含的閥Wrapper Valve中,在這里會經(jīng)過一個過濾器鏈(Filter Chain),最終送到一個Servlet中。借助于tomcat的這種架構(gòu)設計,我們可以通過在tomcat處理一次請求的生命周期過程中植入自己的邏輯,將tomcat對外提供的能力進行一次增強,即UAV的中間件增強技術(shù)。
中間件增強技術(shù)除了巧妙運用了tomcat容器的架構(gòu)設計之外還借助了java Instrumentation(它給我們提供了一種能夠在對象第一次加載時動態(tài)修改字節(jié)碼的能力,由于篇幅原因在此不進行詳細講解,不明白的小伙伴自行查閱資料)。在UAV中通過UAVServer對外提供各種切點能力。
有了中間件增強技術(shù),在應用邏輯執(zhí)行之前和之后的切點就有了,接下來就是在這些切點位置執(zhí)行我們自己的調(diào)用鏈邏輯了。
中間件增強技術(shù)在調(diào)用鏈中的使用
上文介紹的間件增強技術(shù)是一種通過使用javaagent方式動態(tài)地在tomcat代碼中植入切點代碼并以UAVServer的形式對外提供能力的框架(具體能力后續(xù)文章會詳細介紹)。輕調(diào)用鏈實現(xiàn)正是使用了UAVServer對外提供的GlobalFilterHandler能力。
GlobalFilterHandler: 這里的GlobalFilterHandler是中間件增強技術(shù)中的一種能力,與傳統(tǒng)的filter沒有任何關(guān)系。它對外提供了四個能力:
doRequest:在所有應用處理請求之前進行劫持;
doResponse:在所有應用處理請求之后進行劫持;
BlockHandlerChain:阻塞自當前handler以后的所有handler,此處的handler為注冊在當前;
BlockFilterChain阻塞自當前Filter以后的所有Filter。
調(diào)用鏈借助于GlobalFilterHandler提供的前兩個能力,實現(xiàn)了在應用處理請求之前和之后執(zhí)行調(diào)用鏈邏輯的功能。
輕調(diào)用鏈實現(xiàn)
具體UML圖如下:
從UML圖中可以清晰地看到, InvokeChainSupporter(調(diào)用鏈實現(xiàn)邏輯入口和調(diào)用鏈所需資源初始化實現(xiàn)類)將中間件增強技術(shù)進行了二次增強。它允許使用者在其中注冊不同的handler,并且在handler的preCap和doCap(中間件增強技術(shù)中的邏輯執(zhí)行之前和之后的切點術(shù)語)方法之前和之后動態(tài)織入adapter,從而能夠執(zhí)行更多的定制化適配和個性化邏輯。所有supporter和adapter均采用反射調(diào)用方式,最大程度上減少了中間件增強技術(shù)的依賴。
有了二次增強技術(shù),我們就可以開始下面的調(diào)用鏈繪制工作了。
輕調(diào)用鏈繪制實現(xiàn)主要依賴于注冊在InvokeChainSupporter上的 ServiceSpanInvokeChainHandler。主要繪制過程如下:
解析請求信息,提取其中調(diào)用鏈關(guān)心的信息,并將解析出來的信息放入上下文中;
通過解析出來的請求頭信息進行邏輯分流,根據(jù)不同的協(xié)議類型就行不同的邏輯處理;
mq邏輯
http邏輯
dubbo邏輯
初始化調(diào)用鏈上下文,并初始化main span上下文;
在應用處理完請求之后,將調(diào)用鏈信息進行統(tǒng)一輸出。
下面來看一下具體每一步都做了什么。
解析請求信息
對于像tomcat這類中間件容器,所有進入tomcat的請求都會被封裝成HttpServletRequest和HttpServletResponse(后面簡稱request和response)最終進入用戶的servlet中。調(diào)用鏈借助于中間件增強技術(shù)會在用戶邏輯處理之前將request和response進行一次攔截,并解析其中是否含有調(diào)用鏈信息。如果有則將調(diào)用鏈信息進行封裝放入上下文中。
邏輯分流
由于不同協(xié)議對應的調(diào)用鏈繪制邏輯也不同,此處調(diào)用鏈會根據(jù)協(xié)議類型進行一次分發(fā)。
初始化調(diào)用鏈上下文
將調(diào)用鏈上下文中的信息進行解析:
沒有父節(jié)點則將當前節(jié)點當作初始化節(jié)點,并初始化記錄當前服務內(nèi)調(diào)用鏈信息的main span;
有父節(jié)點則根據(jù)父節(jié)點信息初始化當前節(jié)點,并初始化記錄當前服務內(nèi)調(diào)用鏈信息的main span。
main span:在服務內(nèi)可能會進行多次客戶端通訊或服務間通訊,需要一個main span來記錄當前服務內(nèi)調(diào)用鏈最后一個節(jié)點的信息。
調(diào)用鏈信息輸出
在用戶邏輯處理結(jié)束之后,調(diào)用鏈記錄器會從上下文中取出當前服務的調(diào)用鏈信息并將其輸出到指定日志路徑。
服務間上下文傳遞
到此,相信大家對“UAVStack中的調(diào)用鏈是什么”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!
分享文章:UAVStack中的調(diào)用鏈是什么
鏈接URL:http://www.2m8n56k.cn/article2/jdgpic.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、建站公司、標簽優(yōu)化、、云服務器、域名注冊
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)