Posted on 2021-06-04 15:36
為自己代言 閱讀(579)
評(píng)論(0) 編輯 收藏 所屬分類(lèi):
spring cloud 微服務(wù)
整體架構(gòu)
從日志生成到抓取、存儲(chǔ)、分析、展現(xiàn)的多個(gè)系統(tǒng)間交互過(guò)程。
在復(fù)雜的分布式系統(tǒng)環(huán)境下,EagleEye是一個(gè)有廣泛用途的調(diào)用分析和問(wèn)題排查工具。與一般的調(diào)用信息埋點(diǎn)日志相比,EagleEye埋點(diǎn)的一個(gè)顯著的不同點(diǎn)在于它的每條日志都有與每次請(qǐng)求關(guān)聯(lián)的上下文ID,我們稱(chēng)為T(mén)raceId。通過(guò)TraceId,后期的日志處理時(shí)可以把一次前端請(qǐng)求在不同服務(wù)器記錄的調(diào)用日志關(guān)聯(lián)起來(lái),重新組合成當(dāng)時(shí)這個(gè)請(qǐng)求的調(diào)用鏈。因此,EagleEye不僅可以分析到應(yīng)用之間的直接調(diào)用關(guān)系,還可以得到他們的間接調(diào)用關(guān)系、以及上下游的業(yè)務(wù)處理信息;對(duì)于調(diào)用鏈的底層系統(tǒng),可以追溯到它的最上層請(qǐng)求來(lái)源以及中間經(jīng)過(guò)的所有節(jié)點(diǎn);對(duì)于調(diào)用鏈的上層入口,可以收集到它的整棵調(diào)用樹(shù),從而定位下游系統(tǒng)的處理瓶頸,當(dāng)下游某個(gè)應(yīng)用有異常發(fā)生時(shí),能迅速定位到問(wèn)題發(fā)生的位置。

如上圖所示,應(yīng)用A是接受到來(lái)自用戶(hù)瀏覽器的Web請(qǐng)求的前端服務(wù)器,它是一條調(diào)用鏈的開(kāi)始端,在TBSession和EagleEyeFilter中都做了EagleEye上下文埋點(diǎn)。請(qǐng)求收到后它會(huì)先調(diào)用EagleEye StartTrace生成TraceId并放置在當(dāng)前線程的ThreadLocal,日志埋點(diǎn)請(qǐng)求信息(如URL、SessionId、UserId等)。在請(qǐng)求處理完畢提交相應(yīng)時(shí),再調(diào)用EndTrace清理線程中的EagleEye信息。 在應(yīng)用A調(diào)用應(yīng)用B、C的HSF服務(wù),或者發(fā)送Notify消息時(shí),TraceId被包含在EagleEye上下文中,隨網(wǎng)絡(luò)請(qǐng)求到達(dá)應(yīng)用B、C、D、E之中,并放置在線程ThreadLocal內(nèi),因此后續(xù)調(diào)用到的這些系統(tǒng)都會(huì)有EagleEye這次請(qǐng)求的上下文。這些系統(tǒng)再發(fā)起網(wǎng)絡(luò)請(qǐng)求時(shí),也類(lèi)似的攜帶了上下文信息的。
為了區(qū)別同一個(gè)調(diào)用鏈下多個(gè)網(wǎng)絡(luò)調(diào)用的順序和嵌套層次,EagleEye還需要傳輸和記錄RpcId。 RpcId用0.X1.X2.X3.....Xi來(lái)表示,Xi都是非負(fù)整數(shù),根節(jié)點(diǎn)的RpcId固定從0開(kāi)始,第一層網(wǎng)絡(luò)調(diào)用的RpcId是0.X1,第二層的則為0.X1.X2,依次類(lèi)推。*例如,從根節(jié)點(diǎn)發(fā)出的調(diào)用的RpcId是0.1、0.2、0.3,RpcId是0.1的節(jié)點(diǎn)發(fā)出的RpcId則為0.1.1、0.1.2、0.1.3。如下圖所示

通過(guò)RpcId,可以準(zhǔn)確的還原出調(diào)用鏈上每次調(diào)用的層次關(guān)系和兄弟調(diào)用之間的先后順序。 例如上圖應(yīng)用 G 的兩次調(diào)用0.2.1.1和0.1.2.1,可以看出對(duì) DB 的訪問(wèn)0.2.1.1源于 C 到 G 的調(diào)用0.2.1,對(duì) Tair 的訪問(wèn)0.1.2.1源于B 到 G 的調(diào)用0.1.2。 很多調(diào)用場(chǎng)景會(huì)比上面說(shuō)的完全同步的調(diào)用更為復(fù)雜,比如會(huì)遇到異步、單向、廣播、并發(fā)、批處理等等,這時(shí)候需要妥善處理好ThreadLocal上的調(diào)用上下文,避免調(diào)用上下文混亂和無(wú)法正確釋放。另外,采用多級(jí)序號(hào)的RpcId設(shè)計(jì)方案會(huì)比單級(jí)序號(hào)遞增更容易準(zhǔn)確還原當(dāng)時(shí)的調(diào)用情況。