SOFA Scalable Open Financial Architecture是螞蟻金服自主研發的金融級分散式中介軟體,包含了構建金融級雲原生架構所需的各個元件,是在金融場景裡錘鍊出來的最佳實踐。
SOFATracer 是一個用於分散式系統呼叫跟蹤的元件,通過統一的 TraceId 將呼叫鏈路中的各種網路呼叫情況以日誌的方式記錄下來,以達到透視化網路呼叫的目的,這些鏈路資料可用於故障的快速發現,服務治理等。SOFATracer:https://github.com/alipay/sofa-tracer本文為《剖析 | SOFATracer 框架》第一篇。《剖析 | SOFASOFATracer 框架》系列由 SOFA 團隊和原始碼愛好者們出品, 專案代號:<
SOFA:TracerLab/>
,文章尾部有參與方式,歡迎同樣對原始碼熱情的你加入
“>在單體應用時代,我們不需要花費時間去關心呼叫鏈路這個東西。但是鏈路跟蹤不僅僅是在分散式場景下才會有,即使是單體應用,同樣也會存在呼叫鏈路。例如,我們把應用中的每個服務介面作為一個鏈路節點,那麼從請求進來到返回響應,把這個過程中多歷經的所有的方法介面串聯起來,就能組成一條完整的鏈路,如下圖所示:
“>對於單體應用而言,如果訪問一個資源沒有成功,那麼我們可以很快的鎖定是哪一臺機器,然後通過查詢這臺機器上的日誌就能定位問題。
“>因此在面對這種複雜的大規模分散式叢集來實現的服務體系來說,就需要一些可以幫助理解各個應用的線上呼叫行為、並可以分析遠端呼叫的元件。
“>(“>)實現的 SOFATracer
“>在介紹 SOFATracer
“> 規範。
1、Opentracing 簡介
“> 是什麼
OpenTracing
“> 提供了一套平臺無關、廠商無關的 API
“> 中的一些概念和術語,在不同的語言環境下都是共享的。
“> 規範中,一條 trace
“> 組成,一條鏈路整體可以看做是一張有向無環圖,各個 span
“>”。下面是官方提供的示例:
“>如果已時間軸維度來看的話,也可以表現為下面的形式(官方示例):
“>但是為了簡化 span
“>,平行執行的作為 FollowFrom
“>a、ChildOf 示例
“> 中呼叫了 method
“>在時間維度上展現的視角如下:
“>這種關係一般會 表示為 SpanBChildOfSpanA
“>b、FollowFrom 示例
method
“>執行之後 methodB
“>在時間維度上展現的視角如下:
“>這種關係一般會 表示為 SpanBFollowFromSpanA
“> 是對分散式鏈路中涉及到的一些列操作的高度抽象集合。 Opentracing
“>、 Span
“>、 Format
“> 和 ScopeManager
“> 使用的版本是 0.22.0 ,主要是對 Tracer
“>、 SpanContext
“> 來分析。
“>下圖為 SOFATracer
OpenTracing-api 規範 (opentracing.io/specificati…)。
“> 是一個簡單、廣義的介面,它的作用就是構建
span
“> 。核心介面列表如下:
SOFATracer
OpenTracing-api 規範 (opentracing.io/specificati…)。
“> 是一個簡單、廣義的介面,它的作用就是構建
span
“> 。核心介面列表如下:
Tracer
“>_b、Span &SofaTracerSpan _
Span
“> 就是一個完整的資料包,其包含的就是當前節點所需要上報的資料。核心介面列表如下:
Span
“>、 tags
“>和產生當前 span
“>型別等處理的能力。“> 對於
OpenTracing
“> 可以實現跨程式的鏈路透傳,並且可以通過 SpanContext
“> 中只有一個介面:
SpanContext
“>、序列化 baggageItems
“>等新的能力,除此之外, SpanContext
“>
2、SOFATracer 擴充套件
“> 在 Opentracing
“> 基於 “>(“>)實現,並且通過 “> (“>)元件實現了日誌的無鎖非同步列印能力。
基於 “>應用在通過面向日誌程式設計介面
SLF4J
“> 中新增相應的引數即可,如新增[%X{SOFA-TraceId
“> 和
},%X{SOFA-SpanId
}]SpanId
“>、Log4j2
“>。關於這部分的實現原理,期待大家一起編寫,領取方式見文末。
SOFATracer
的埋點機制
SOFATracer
“> 埋點的方式。SOFATracer
“>例項,如Mvc
“> 、HttpClient
“> 等,如下圖所示:
“> 將不同的擴充套件元件分為AbstractClientTracer
“>,再通過AbstractClientTracer
“> 衍生出具體的元件Tracer
“> 本身來管控,對於不同的元件可以輕鬆的實現差異化和定製化。
“> 的埋點擴充套件實現,從而實現與 “> 的無縫對接。基於OpentracingAPI
“>關於SOFATracer
“> 埋點的實現以及如何實現對接OT-api
“> 中並沒有將不同的Reporter
“>從流程圖中可以看到,此過程中涉及到了三個上報點,首先是上報到zipkin
“> 中為不同的元件均提供了獨立的日誌空間,除此之外,SOFATracer
“>對於鏈路中的資料,並非所有的資料都是值得關注的。一方面是可以節約磁碟空間,另一方面可以將某些無關資料直接過濾掉。基於此,SOFATracer
“> 例項作為取樣計算的條件,使用者可以基於此實現豐富的取樣規則。關於取樣機制,期待大家一起編寫,領取方式見文末。
SOFATracer
鏈路透傳機制“> 鏈路透傳 以及
OpenTracing
“>首先介紹下目前SOFATracer
“> 版本說明:3.x 版本支援
webflux
等,基於分支釋出。
2.x 版本基於master
釋出,目前版本是 2.3.0 。“> 有興趣的同學,一起參與開發~
3、歡迎加入 ,參與 SOFATracer 原始碼解析
“> 元件系列》第一篇,主要還是希望大家對 SOFATracer
“>如果有同學對以上某個主題特別感興趣的,可以留言討論,我們會適當根據大家的反饋調整文章的順序,謝謝大家關注 SOFA
“>,我們會一直與大家一起成長的。
“>掃碼關注公眾號,後臺回覆想認領的文章名稱,我們將會主動聯絡你,確認資質後,即可加入 ,It’s your show time!
除了原始碼解析,也歡迎提交 issue 和 PR:SOFATracer:https://github.com/alipay/sofa-tracer
長按關注,獲取分散式架構乾貨
歡迎大家共同打造 SOFAStack https://github.com/alipay