目錄
- 背景
- Micrometer
- Micrometer與ZipKin之間的關系
- 專業術語
- 分布式鏈路追蹤原理
- ZipKin
- 安裝下載
- Micrometer+ZipKin 案例演示
- 相關文獻
背景
一個系統頁面上的按鈕點擊到結果反饋,在微服務框架里,是由N個服務組成返回結果,中間可能經過a->b->c->b->a,或a->b->a->c等等簡單或復雜重復的服務調用,如果調用鏈路某一節點出錯導致服務崩潰,將無法快速定位問題解決。
在大規模分布式與微服務集群下,出現問題時,需要:
1、可實時觀察系統整理調用鏈路情況
2、快速發現并定位問題
3、精準判斷故障對系統的影響范圍和程度
4、梳理服務之間的依賴關系,并判斷依賴關系是否合理是否可優化
5、精準分析調用鏈的性能瓶頸以及容量規劃
以上分布式鏈路追蹤技術可以解決的問題,分布式鏈路追蹤(Distributed Tracing),就是將一次分布式請求還原成調用鏈路,進行日志記錄,性能監控并將一次分布式請求的調用情況集中展示。比如各個服務節點上的耗時、請求具體到達哪臺機器上、每個服務節點的請求狀態等等。
Micrometer
springcloud 對分布式鏈路追蹤提供了支持:Spring Cloud Sleuth 為分布式跟蹤提供 Spring Boot 自動配置,但目前Spring Cloud Sleuth 的最后一個次要版本是 3.1,已停止更新,以后使用推薦 Micrometer Tracing
Micrometer與ZipKin之間的關系
可能會有同志們在想,既然有了Micrometer作為鏈路追蹤,那么還要ZipKin干嘛?
看以上圖,可理解為,Micrometer作為鏈路追蹤可以采集到整條完整鏈路的所有請求信息,但是以數據方式呈現在日志當中,雖然也可以直接觀看,但想要更客觀統計和分析,仍然有局限性。ZipKin支持接入Micrometer的數據,作為儀表板,可以清晰看見每條鏈路的請求響應數據。
專業術語
Span:基本工作單位。例如,發送 RPC 是一個新的跨度,向 RPC 發送響應也是如此。跨度還包含其他數據,例如描述、時間戳事件、鍵值注釋(標記)、導致這些值的跨度的 ID 以及進程 ID(通常為 IP 地址)
Trace:形成樹狀結構的一組跨度。例如,如果運行分布式大數據存儲,則 PUT 跟蹤可能由請求形成。
Annotation/Event:用于及時記錄事件的存在。
Tracer:處理跨度生命周期的庫。它可以通過報告器/導出器創建、啟動、停止和報告跨度到外部系統。
Tracing context:要使分布式跟蹤正常工作,跟蹤上下文(跟蹤標識符、跨度標識符等)必須通過進程(例如通過線程)和網絡傳播。
Log correlation:跟蹤上下文的某些部分(例如跟蹤標識符、跨度標識符)可以填充到給定應用程序的日志中。然后,可以將所有日志收集到單個存儲中,并通過跟蹤 ID 對它們進行分組。這樣,就可以從按時間順序排列的所有服務中獲取單個業務操作(跟蹤)的所有日志。
Latency analysis tools:收集導出的跨度并可視化整個跟蹤的工具。允許輕松分析延遲。
分布式鏈路追蹤原理
見上圖,分布式鏈路追蹤是怎么知道服務的上游和下游是誰呢?
那么一條鏈路追蹤會在每個服務調用的時候加上Trace ID(全局唯一id) 和 Span ID(每次請求的id)
鏈路通過TraceId唯一標識,
Span標識發起的請求信息,各span通過parent id 關聯起來 (Span:表示調用鏈路來源,通俗的理解span就是一次請求信息)
簡單來說
第一個節點:Span ID = A,Parent ID = null,Service 1 接收到請求。
第二個節點:Span ID = B,Parent ID= A,Service 1 發送請求到 Service 2 返回響應給Service 1 的過程。
第三個節點:Span ID = C,Parent ID= B,Service 2 的 中間解決過程。
第四個節點:Span ID = D,Parent ID= C,Service 2 發送請求到 Service 3 返回響應給Service 2 的過程。
第五個節點:Span ID = E,Parent ID= D,Service 3 的中間解決過程。
第六個節點:Span ID = F,Parent ID= C,Service 3 發送請求到 Service 4 返回響應給 Service 3 的過程。
第七個節點:Span ID = G,Parent ID= F,Service 4 的中間解決過程。
通過 Parent ID 就可找到父節點,整個鏈路即可以進行跟蹤追溯了。
ZipKin
Zipkin 是一個分布式跟蹤系統。它有助于收集解決服務架構中的延遲問題所需的計時數據。功能包括此數據的收集和查找。
如果日志文件中有跟蹤 ID,則可以直接跳轉到該 ID。否則,您可以根據服務、操作名稱、標簽和持續時間等屬性進行查詢。將為您總結一些有趣的數據,例如在服務中花費的時間百分比,以及操作是否失敗。
Zipkin UI 還顯示一個依賴關系圖,顯示每個應用程序經過的跟蹤請求數。這有助于識別聚合行為,包括錯誤路徑或對已棄用服務的調用。
安裝下載
官方支持三種安裝下載:Java、Docker 或從源代碼運行。
java下載:https://zipkin.io/pages/quickstart
下載完成后運行jar
java -jar zipkin-server-3.0.0-rc0-exec.jar
啟動完成之后訪問http://your_host:9411,成功
Micrometer+ZipKin 案例演示
Micrometer+ZipKin兩者各自分工
- Micrometer:數據采集
- ZipKin:圖形展示
本案例采用兩個服務模塊演示,a服務提供者、b服務調用者
總父工程pom依賴引入
<properties><micrometer-tracing.version>1.2.0</micrometer-tracing.version><micrometer-observation.version>1.12.0</micrometer-observation.version><feign-micrometer.version>12.5</feign-micrometer.version><zipkin-reporter-brave.version>2.17.0</zipkin-reporter-brave.version>
</properties><!--micrometer-tracing-bom導入鏈路追蹤版本中心 1-->
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-tracing-bom</artifactId><version>${micrometer-tracing.version}</version><type>pom</type><scope>import</scope>
</dependency>
<!--micrometer-tracing指標追蹤 2-->
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-tracing</artifactId><version>${micrometer-tracing.version}</version>
</dependency>
<!--micrometer-tracing-bridge-brave適配zipkin的橋接包 3-->
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-tracing-bridge-brave</artifactId><version>${micrometer-tracing.version}</version>
</dependency>
<!--micrometer-observation 4-->
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-observation</artifactId><version>${micrometer-observation.version}</version>
</dependency>
<!--feign-micrometer 5-->
<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-micrometer</artifactId><version>${feign-micrometer.version}</version>
</dependency>
<!--zipkin-reporter-brave 6-->
<dependency><groupId>io.zipkin.reporter2</groupId><artifactId>zipkin-reporter-brave</artifactId><version>${zipkin-reporter-brave.version}</version>
</dependency>
引入包的作用是什么呢?
由于Micrometer Tracing是一個門面工具自身并沒有實現完整的鏈路追蹤系統,具體的鏈路追蹤另外需要引入的是第三方鏈路追蹤系統的依賴:
micrometer-tracing-bom:導入鏈路追蹤版本中心,體系化說明
micrometer-tracing:指標追蹤
micrometer-tracing-bridge-brave:一個Micrometer模塊,用于與分布式跟蹤工具 Brave 集成,以收集應用程序的分布式跟蹤數據。Brave是一個開源的分布式跟蹤工具,它可以幫助用戶在分布式系統中跟蹤請求的流轉,它使用一種稱為"跟蹤上下文"的機制,將請求的跟蹤信息存儲在請求的頭部,然后將請求傳遞給下一個服務。在整個請求鏈中,Brave會將每個服務處理請求的時間和其他信息存儲到跟蹤數據中,以便用戶可以了解整個請求的路徑和性能。
micrometer-observation
一個基于度量庫 Micrometer的觀測模塊,用于收集應用程序的度量數據。
feign-micrometer:一個Feign HTTP客戶端的Micrometer模塊,用于收集客戶端請求的度量數據。
zipkin-reporter-brave:一個用于將 Brave 跟蹤數據報告到Zipkin 跟蹤系統的庫。
補充包:spring-boot-starter-actuator SpringBoot框架的一個模塊用于監視和管理應用程序(服務的健康檢查)
a服務提供方pom依賴引入
<!--micrometer-tracing指標追蹤 1--><dependency><groupId>io.micrometer</groupId><artifactId>micrometer-tracing</artifactId></dependency><!--micrometer-tracing-bridge-brave適配zipkin的橋接包 2--><dependency><groupId>io.micrometer</groupId><artifactId>micrometer-tracing-bridge-brave</artifactId></dependency><!--micrometer-observation 3--><dependency><groupId>io.micrometer</groupId><artifactId>micrometer-observation</artifactId></dependency><!--feign-micrometer 4--><dependency><groupId>io.github.openfeign</groupId><artifactId>feign-micrometer</artifactId></dependency><!--zipkin-reporter-brave 5--><dependency><groupId>io.zipkin.reporter2</groupId><artifactId>zipkin-reporter-brave</artifactId></dependency>
yml配置
# ========================zipkin===================
management:zipkin:tracing:endpoint: http://localhost:9411/api/v2/spanstracing:sampling:probability: 1.0 #采樣率默認為0.1(0.1就是10次只能有一次被記錄下來),值越大收集越及時。
編寫接口
/*** Micrometer(Sleuth)進行鏈路監控的例子* @param id* @return*/@GetMapping(value = "/pay/micrometer/{id}")public String myMicrometer(@PathVariable("id") Integer id);
b服務調用方pom依賴引入
<!--micrometer-tracing指標追蹤 1--><dependency><groupId>io.micrometer</groupId><artifactId>micrometer-tracing</artifactId></dependency><!--micrometer-tracing-bridge-brave適配zipkin的橋接包 2--><dependency><groupId>io.micrometer</groupId><artifactId>micrometer-tracing-bridge-brave</artifactId></dependency><!--micrometer-observation 3--><dependency><groupId>io.micrometer</groupId><artifactId>micrometer-observation</artifactId></dependency><!--feign-micrometer 4--><dependency><groupId>io.github.openfeign</groupId><artifactId>feign-micrometer</artifactId></dependency><!--zipkin-reporter-brave 5--><dependency><groupId>io.zipkin.reporter2</groupId><artifactId>zipkin-reporter-brave</artifactId></dependency>
a、b服務之間的pom引入是一樣的 不需要吧zipkin的依賴引入,因為總父工程的pom里面已經有了,子服務不需要引入。
yml配置
# zipkin圖形展現地址和采樣率設置
management:zipkin:tracing:endpoint: http://localhost:9411/api/v2/spanstracing:sampling:probability: 1.0 #采樣率默認為0.1(0.1就是10次只能有一次被記錄下來),值越大收集越及時。
接口調用
@RestController
@Slf4j
public class OrderMicrometerController
{@Resourceprivate PayFeignApi payFeignApi;@GetMapping(value = "/feign/micrometer/{id}")public String myMicrometer(@PathVariable("id") Integer id){return payFeignApi.myMicrometer(id);}
}
服務啟動后,調用接口http://localhost/feign/micrometer/1
打開網址http://your_host:9411,看到對應界面
可清楚看到鏈路的每個服務節點的詳細信息,包括斷路器等都可檢測到。
相關文獻
micrometer官網:https://docs.micrometer.io/micrometer/reference/overview.html
zipkin官網:https://zipkin.io/
當然除了Micrometer還有其他技術可以做鏈路追蹤,具體情況參考自家公司的服務架構、項目流量決定,Skywalking作為鏈路追蹤也是不錯的
就先說到這 \color{#008B8B}{ 就先說到這} 就先說到這
在下 A p o l l o \color{#008B8B}{在下Apollo} 在下Apollo
一個愛分享 J a v a 、生活的小人物, \color{#008B8B}{一個愛分享Java、生活的小人物,} 一個愛分享Java、生活的小人物,
咱們來日方長,有緣江湖再見,告辭! \color{#008B8B}{咱們來日方長,有緣江湖再見,告辭!} 咱們來日方長,有緣江湖再見,告辭!