Spring Cloud Sleuth實(shí)現(xiàn)分布式鏈路追蹤詳細(xì)教程

要實(shí)現(xiàn)spring cloud sleuth的鏈路追蹤,需按以下步驟操作:1. 引入依賴(lài)開(kāi)啟基礎(chǔ)追蹤能力;2. 查看日志中的traceid和spanid用于識(shí)別請(qǐng)求鏈路;3. 實(shí)現(xiàn)跨服務(wù)鏈路追蹤確保上下文自動(dòng)透?jìng)鳎?. 可選配合zipkin進(jìn)行可視化展示。通過(guò)這些步驟可提升微服務(wù)架構(gòu)下的問(wèn)題排查與性能優(yōu)化能力。

Spring Cloud Sleuth實(shí)現(xiàn)分布式鏈路追蹤詳細(xì)教程

在微服務(wù)架構(gòu)下,一個(gè)請(qǐng)求往往會(huì)經(jīng)過(guò)多個(gè)服務(wù)的協(xié)作處理。要排查問(wèn)題、優(yōu)化性能,鏈路追蹤就成了必不可少的能力。spring cloud Sleuth 是 Spring 提供的一套輕量級(jí)分布式鏈路追蹤方案,它可以自動(dòng)為每個(gè)請(qǐng)求生成唯一標(biāo)識(shí),并記錄調(diào)用鏈中的各個(gè)階段。下面我們就來(lái)看看如何一步步實(shí)現(xiàn)它。

Spring Cloud Sleuth實(shí)現(xiàn)分布式鏈路追蹤詳細(xì)教程


1. 引入依賴(lài),開(kāi)啟基礎(chǔ)追蹤能力

要在項(xiàng)目中使用 Sleuth,首先得引入相關(guān)依賴(lài)。如果你使用的是 spring boot 2.6 或更高版本,可以直接添加如下依賴(lài):

Spring Cloud Sleuth實(shí)現(xiàn)分布式鏈路追蹤詳細(xì)教程

<dependency>     <groupId>org.springframework.cloud</groupId>     <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency>

添加完成后,Sleuth 就會(huì)自動(dòng)生效了。你不需要額外寫(xiě)任何代碼,它會(huì)在日志中輸出 traceId 和 spanId,幫助你識(shí)別每一次請(qǐng)求的完整鏈路。

注意:Sleuth 默認(rèn)不會(huì)把數(shù)據(jù)上報(bào)到外部系統(tǒng),只負(fù)責(zé)生成和傳遞鏈路信息。如果想做可視化展示,還需要配合 Zipkin 等工具


2. 查看日志中的 traceId 和 spanId

Sleuth 的核心功能之一就是在每次請(qǐng)求開(kāi)始時(shí)生成一個(gè)唯一的 traceId,并在每個(gè)操作單元(比如一次 http 請(qǐng)求或方法調(diào)用)中生成一個(gè) spanId。這些信息會(huì)自動(dòng)打印在你的日志里。

比如你在控制臺(tái)看到這樣的日志:

[order-service,8e95b7a4d0f5c3a0,8e95b7a4d0f5c3a0,true] ...

這里的字段含義分別是:

  • 應(yīng)用名稱(chēng)(order-service)
  • traceId(8e95b7a…)
  • spanId(同樣值,表示這是第一個(gè) span)
  • 是否導(dǎo)出(true 表示該 trace 會(huì)被上報(bào))

這樣你就可以通過(guò)日志來(lái)追蹤整個(gè)調(diào)用鏈了。如果你使用 elk 或者類(lèi)似的日志分析系統(tǒng),可以基于 traceId 把所有相關(guān)日志聚合在一起。


3. 實(shí)現(xiàn)跨服務(wù)鏈路追蹤

Sleuth 的一大優(yōu)勢(shì)是能自動(dòng)將鏈路信息透?jìng)鞯较掠畏?wù)。也就是說(shuō),當(dāng)你從 A 服務(wù)調(diào)用 B 服務(wù)時(shí),Sleuth 會(huì)自動(dòng)把當(dāng)前的 traceId 和 spanId 放到 HTTP 請(qǐng)求頭中,B 服務(wù)接收到后就能繼續(xù)沿用這條鏈路。

目前支持自動(dòng)注入的場(chǎng)景包括:

  • 使用 RestTemplate 發(fā)起的請(qǐng)求
  • Feign 客戶(hù)端調(diào)用
  • Spring WebFlux 的 WebClient
  • 消息中間件rabbitmqkafka(需要配合 Sleuth Stream)

如果你自己封裝了遠(yuǎn)程調(diào)用邏輯,就需要手動(dòng)設(shè)置請(qǐng)求頭,例如:

HttpHeaders headers = new HttpHeaders(); sleuthTracer.getCurrentSpan().context().forEach((key, value) -> headers.set(key, value));

這樣才能保證鏈路不中斷。


4. 配合 Zipkin 做可視化展示(可選)

雖然 Sleuth 能提供完整的鏈路數(shù)據(jù),但直接看日志還是不夠直觀。你可以把它和 Zipkin 結(jié)合起來(lái),實(shí)現(xiàn)圖形化展示。

步驟大致如下:

  • 啟動(dòng) Zipkin Server(可以用官方 docker 鏡像快速部署)
  • 添加 Zipkin 依賴(lài):
<dependency>     <groupId>org.springframework.cloud</groupId>     <artifactId>spring-cloud-sleuth-zipkin</artifactId> </dependency>
  • 在配置文件中指定 Zipkin 地址:
spring:   zipkin:     base-url: http://localhost:9411

這樣,Sleuth 會(huì)自動(dòng)將 span 數(shù)據(jù)發(fā)送給 Zipkin,你就可以通過(guò) Zipkin 的 Web 頁(yè)面查看請(qǐng)求的完整調(diào)用路徑、耗時(shí)分布等信息。


基本上就這些。Spring Cloud Sleuth 的使用并不復(fù)雜,但確實(shí)能大大提升微服務(wù)下的可觀測(cè)性。只要注意日志收集方式和上下游服務(wù)之間的上下文傳遞,就能輕松實(shí)現(xiàn)全鏈路追蹤。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊12 分享