您好,登錄后才能下訂單哦!
這篇文章主要介紹“request輕調(diào)用鏈怎么實(shí)現(xiàn)”,在日常操作中,相信很多人在request輕調(diào)用鏈怎么實(shí)現(xiàn)問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”request輕調(diào)用鏈怎么實(shí)現(xiàn)”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
介紹調(diào)用鏈的服務(wù)端信息收集以及服務(wù)間上下文傳遞。
服務(wù)端信息收集整體流程如下圖所示,通過在應(yīng)用容器(tomcat等)啟動過程中植入切點(diǎn)從而實(shí)現(xiàn)在應(yīng)用邏輯執(zhí)行之前和之后對請求進(jìn)行劫持。
應(yīng)用邏輯執(zhí)行之前:解析request中調(diào)用鏈信息,并初始化調(diào)用鏈上下文;
應(yīng)用邏輯執(zhí)行之后:解析response中調(diào)用鏈信息,并將本次請求處理的所有調(diào)用鏈信息輸出到日志文件。
在介紹切點(diǎn)之前我們應(yīng)該對servlet容器(本文以tomcat為例)處理一次請求的大致流程有一個整體的了解。
圖片來源于網(wǎng)絡(luò)
在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)設(shè)計(jì),我們可以通過在tomcat處理一次請求的生命周期過程中植入自己的邏輯,將tomcat對外提供的能力進(jìn)行一次增強(qiáng),即UAV的中間件增強(qiáng)技術(shù)。
中間件增強(qiáng)技術(shù)除了巧妙運(yùn)用了tomcat容器的架構(gòu)設(shè)計(jì)之外還借助了java Instrumentation(它給我們提供了一種能夠在對象第一次加載時動態(tài)修改字節(jié)碼的能力,由于篇幅原因在此不進(jìn)行詳細(xì)講解,不明白的小伙伴自行查閱資料)。在UAV中通過UAVServer對外提供各種切點(diǎn)能力。
有了中間件增強(qiáng)技術(shù),在應(yīng)用邏輯執(zhí)行之前和之后的切點(diǎn)就有了,接下來就是在這些切點(diǎn)位置執(zhí)行我們自己的調(diào)用鏈邏輯了。
上文介紹的間件增強(qiáng)技術(shù)是一種通過使用javaagent方式動態(tài)地在tomcat代碼中植入切點(diǎn)代碼并以UAVServer的形式對外提供能力的框架(具體能力后續(xù)文章會詳細(xì)介紹)。輕調(diào)用鏈實(shí)現(xiàn)正是使用了UAVServer對外提供的GlobalFilterHandler能力。
GlobalFilterHandler: 這里的GlobalFilterHandler是中間件增強(qiáng)技術(shù)中的一種能力,與傳統(tǒng)的filter沒有任何關(guān)系。它對外提供了四個能力:
doRequest:在所有應(yīng)用處理請求之前進(jìn)行劫持;
doResponse:在所有應(yīng)用處理請求之后進(jìn)行劫持;
BlockHandlerChain:阻塞自當(dāng)前handler以后的所有handler,此處的handler為注冊在當(dāng)前;
BlockFilterChain阻塞自當(dāng)前Filter以后的所有Filter。
調(diào)用鏈借助于GlobalFilterHandler提供的前兩個能力,實(shí)現(xiàn)了在應(yīng)用處理請求之前和之后執(zhí)行調(diào)用鏈邏輯的功能。
具體UML圖如下:
從UML圖中可以清晰地看到, InvokeChainSupporter(調(diào)用鏈實(shí)現(xiàn)邏輯入口和調(diào)用鏈所需資源初始化實(shí)現(xiàn)類)將中間件增強(qiáng)技術(shù)進(jìn)行了二次增強(qiáng)。它允許使用者在其中注冊不同的handler,并且在handler的preCap和doCap(中間件增強(qiáng)技術(shù)中的邏輯執(zhí)行之前和之后的切點(diǎn)術(shù)語)方法之前和之后動態(tài)織入adapter,從而能夠執(zhí)行更多的定制化適配和個性化邏輯。所有supporter和adapter均采用反射調(diào)用方式,最大程度上減少了中間件增強(qiáng)技術(shù)的依賴。
有了二次增強(qiáng)技術(shù),我們就可以開始下面的調(diào)用鏈繪制工作了。
輕調(diào)用鏈繪制實(shí)現(xiàn)主要依賴于注冊在InvokeChainSupporter上的ServiceSpanInvokeChainHandler。主要繪制過程如下:
解析請求信息,提取其中調(diào)用鏈關(guān)心的信息,并將解析出來的信息放入上下文中;
通過解析出來的請求頭信息進(jìn)行邏輯分流,根據(jù)不同的協(xié)議類型就行不同的邏輯處理; ?mq邏輯 ?http邏輯 ?dubbo邏輯
初始化調(diào)用鏈上下文,并初始化main span上下文;
在應(yīng)用處理完請求之后,將調(diào)用鏈信息進(jìn)行統(tǒng)一輸出。
下面來看一下具體每一步都做了什么。
對于像tomcat這類中間件容器,所有進(jìn)入tomcat的請求都會被封裝成HttpServletRequest和HttpServletResponse(后面簡稱request和response)最終進(jìn)入用戶的servlet中。調(diào)用鏈借助于中間件增強(qiáng)技術(shù)會在用戶邏輯處理之前將request和response進(jìn)行一次攔截,并解析其中是否含有調(diào)用鏈信息。如果有則將調(diào)用鏈信息進(jìn)行封裝放入上下文中。
由于不同協(xié)議對應(yīng)的調(diào)用鏈繪制邏輯也不同,此處調(diào)用鏈會根據(jù)協(xié)議類型進(jìn)行一次分發(fā)。
將調(diào)用鏈上下文中的信息進(jìn)行解析:
沒有父節(jié)點(diǎn)則將當(dāng)前節(jié)點(diǎn)當(dāng)作初始化節(jié)點(diǎn),并初始化記錄當(dāng)前服務(wù)內(nèi)調(diào)用鏈信息的main span;
有父節(jié)點(diǎn)則根據(jù)父節(jié)點(diǎn)信息初始化當(dāng)前節(jié)點(diǎn),并初始化記錄當(dāng)前服務(wù)內(nèi)調(diào)用鏈信息的main span。
main span:在服務(wù)內(nèi)可能會進(jìn)行多次客戶端通訊或服務(wù)間通訊,需要一個main span來記錄當(dāng)前服務(wù)內(nèi)調(diào)用鏈最后一個節(jié)點(diǎn)的信息。
在用戶邏輯處理結(jié)束之后,調(diào)用鏈記錄器會從上下文中取出當(dāng)前服務(wù)的調(diào)用鏈信息并將其輸出到指定日志路徑。
對于不同協(xié)議調(diào)用鏈傳遞信息方式也略有不同,具體實(shí)現(xiàn)方式借助了中間件增強(qiáng)技術(shù)提供的另一個能力:AppFrkHook(簡稱hook,此功能在客戶端調(diào)用鏈實(shí)現(xiàn)時會進(jìn)行具體介紹)。它能夠?qū)τ脩羰褂玫目蛻舳思夹g(shù)進(jìn)行劫持,如用戶使用了httpclient進(jìn)行通訊,則對httpclient進(jìn)行劫持并動態(tài)織入代碼,從而達(dá)到在http通訊的過程中注入調(diào)用鏈上下文信息的效果。目標(biāo)服務(wù)在解析請求信息時,將調(diào)用鏈上下文進(jìn)行解析;在初始化調(diào)用鏈上下文邏輯時,使用傳遞過來的信息初始化目標(biāo)服務(wù)的調(diào)用鏈上下文,實(shí)現(xiàn)跨系統(tǒng)調(diào)用時調(diào)用鏈連接。
到此,關(guān)于“request輕調(diào)用鏈怎么實(shí)現(xiàn)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。