您好,登錄后才能下訂單哦!
本篇內容主要講解“UAVStack中的調用鏈是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“UAVStack中的調用鏈是什么”吧!
服務端信息收集
服務端信息收集整體流程如下圖所示,通過在應用容器(tomcat等)啟動過程中植入切點從而實現在應用邏輯執行之前和之后對請求進行劫持。
應用邏輯執行之前:解析request中調用鏈信息,并初始化調用鏈上下文;
應用邏輯執行之后:解析response中調用鏈信息,并將本次請求處理的所有調用鏈信息輸出到日志文件。
切點植入
在介紹切點之前我們應該對servlet容器(本文以tomcat為例)處理一次請求的大致流程有一個整體的了解。
圖片來源于網絡
在Connector接收到一次連接并轉化成請求(Request)后,會將請求傳遞到Engine的管道(Pipeline)的閥(ValveA)中。請求在Engine的管道中會傳遞到Engine Valve這個閥中。接著請求會從Engine Valve傳遞到一個Host的管道中,在該管道中傳遞到Host Valve這個閥里。接著從Host Valve傳遞到一個Context的管道中,在該管道中傳遞到Context Valve中。接下來請求會傳遞到Wrapper C內的管道所包含的閥Wrapper Valve中,在這里會經過一個過濾器鏈(Filter Chain),最終送到一個Servlet中。借助于tomcat的這種架構設計,我們可以通過在tomcat處理一次請求的生命周期過程中植入自己的邏輯,將tomcat對外提供的能力進行一次增強,即UAV的中間件增強技術。
中間件增強技術除了巧妙運用了tomcat容器的架構設計之外還借助了java Instrumentation(它給我們提供了一種能夠在對象第一次加載時動態修改字節碼的能力,由于篇幅原因在此不進行詳細講解,不明白的小伙伴自行查閱資料)。在UAV中通過UAVServer對外提供各種切點能力。
有了中間件增強技術,在應用邏輯執行之前和之后的切點就有了,接下來就是在這些切點位置執行我們自己的調用鏈邏輯了。
中間件增強技術在調用鏈中的使用
上文介紹的間件增強技術是一種通過使用javaagent方式動態地在tomcat代碼中植入切點代碼并以UAVServer的形式對外提供能力的框架(具體能力后續文章會詳細介紹)。輕調用鏈實現正是使用了UAVServer對外提供的GlobalFilterHandler能力。
GlobalFilterHandler: 這里的GlobalFilterHandler是中間件增強技術中的一種能力,與傳統的filter沒有任何關系。它對外提供了四個能力:
doRequest:在所有應用處理請求之前進行劫持;
doResponse:在所有應用處理請求之后進行劫持;
BlockHandlerChain:阻塞自當前handler以后的所有handler,此處的handler為注冊在當前;
BlockFilterChain阻塞自當前Filter以后的所有Filter。
調用鏈借助于GlobalFilterHandler提供的前兩個能力,實現了在應用處理請求之前和之后執行調用鏈邏輯的功能。
輕調用鏈實現
具體UML圖如下:
從UML圖中可以清晰地看到, InvokeChainSupporter(調用鏈實現邏輯入口和調用鏈所需資源初始化實現類)將中間件增強技術進行了二次增強。它允許使用者在其中注冊不同的handler,并且在handler的preCap和doCap(中間件增強技術中的邏輯執行之前和之后的切點術語)方法之前和之后動態織入adapter,從而能夠執行更多的定制化適配和個性化邏輯。所有supporter和adapter均采用反射調用方式,最大程度上減少了中間件增強技術的依賴。
有了二次增強技術,我們就可以開始下面的調用鏈繪制工作了。
輕調用鏈繪制實現主要依賴于注冊在InvokeChainSupporter上的 ServiceSpanInvokeChainHandler。主要繪制過程如下:
解析請求信息,提取其中調用鏈關心的信息,并將解析出來的信息放入上下文中;
通過解析出來的請求頭信息進行邏輯分流,根據不同的協議類型就行不同的邏輯處理;
mq邏輯
http邏輯
dubbo邏輯
初始化調用鏈上下文,并初始化main span上下文;
在應用處理完請求之后,將調用鏈信息進行統一輸出。
下面來看一下具體每一步都做了什么。
解析請求信息
對于像tomcat這類中間件容器,所有進入tomcat的請求都會被封裝成HttpServletRequest和HttpServletResponse(后面簡稱request和response)最終進入用戶的servlet中。調用鏈借助于中間件增強技術會在用戶邏輯處理之前將request和response進行一次攔截,并解析其中是否含有調用鏈信息。如果有則將調用鏈信息進行封裝放入上下文中。
邏輯分流
由于不同協議對應的調用鏈繪制邏輯也不同,此處調用鏈會根據協議類型進行一次分發。
初始化調用鏈上下文
將調用鏈上下文中的信息進行解析:
沒有父節點則將當前節點當作初始化節點,并初始化記錄當前服務內調用鏈信息的main span;
有父節點則根據父節點信息初始化當前節點,并初始化記錄當前服務內調用鏈信息的main span。
main span:在服務內可能會進行多次客戶端通訊或服務間通訊,需要一個main span來記錄當前服務內調用鏈最后一個節點的信息。
調用鏈信息輸出
在用戶邏輯處理結束之后,調用鏈記錄器會從上下文中取出當前服務的調用鏈信息并將其輸出到指定日志路徑。
服務間上下文傳遞
到此,相信大家對“UAVStack中的調用鏈是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。