08.Sleuth(Micrometer)+ZipKin分散式鏈路追逐

长名06發表於2024-10-23

1.Sleuth進入維護模式

替代方案 -> Micrometer Tracing

2.分散式鏈路追蹤概述

2.1 出現背景

在微服務框架中,一個由客戶端發起的請求在後端系統中會經過多個不同的服務節點呼叫來協調產生最後的結果,每一個前端請求都會形成一條複雜的分散式服務呼叫鏈路,鏈路中的任何一環出現高延時或錯誤都會引起整個請求最後的失敗。

隨著系統的複雜化,導致微服務的增多,呼叫鏈路的變長

2.2 要解決的問題

在大規模分散式與微服務叢集下,如何實時的觀測系統的整體呼叫鏈路情況、如何快速發現並定位到問題、如何儘可能精確的判斷故障對系統的影響範圍與影響程度、如何儘可能精確的梳理出服務之間的依賴關係,並判斷出服務之間的依賴關係是否合理、如何儘可能精確的分析整個系統呼叫鏈路的效能與瓶頸點、如何儘可能精確的分析系統的儲存瓶頸與容量規劃。

分散式鏈路追蹤技術要解決的問題,分散式鏈路追蹤(Distributed Tracing),就是將一次分散式請求還原成呼叫鏈路,進行日誌記錄,效能監控並將一次分散式請求的呼叫情況集中展示。比如各個服務節點上的耗時、請求具體到達哪臺機器上、每個服務節點的請求狀態等等。

3.新一代Spring Cloud Sleuth:Micrometer

3.1 相關地址

Micrometer官網

Sleuth官網

Sleuth_GItHub地址

Spring Cloud Sleuth will not work with Spring Boot 3.x onward. The last major version of Spring Boot that Sleuth will support is 2.x.

GitHub介紹,Spring Clour Sleuth不支援SpringBoot 3.x。

3.2 ZipKin

Micrometer負責收集資料,ZipKin複雜資料的展現。因為收集到的資料是一個個節點,不直觀。

3.3 小總結

將前端請求到,後端系統響應結果的這個過程中,所走過的分散式節點,進行日誌記錄和效能監控,並進行Web展示。

3.4 其他的分散式鏈路追蹤的解決方案

技術 說明
Cat 由大眾點評開源,基於Java開發的實時應用監控平臺,包括實時應用監控,業務監控。整合方案是透過程式碼埋點的方式來實現監控,比如:攔截器,過濾器等。對程式碼的侵入性很大,整合成本較高。風險較大。
ZipKin 由大眾點評開源,基於Java開發的實時應用監控平臺,包括實時應用監控,業務監控。整合方案是透過程式碼埋點的方式來實現監控,比如:攔截器,過濾器等。對程式碼的侵入性很大,整合成本較高。風險較大。
Pinpoint Pinpoint是一款開源的基於位元組碼注入的呼叫鏈分析,以及應用監控分析工具。特點是支援多種外掛,UI功能強大,接入端無程式碼侵入。
Skywalking Skywalking是國人開源的基於位元組碼注入的呼叫鏈分析,以及應用監控分析工具。特點是支援多種外掛,UI功能較強,接入端無程式碼侵入。

4.分散式鏈路追蹤原理

一條鏈路透過Trace Id唯一標識,Span標識發起的請求資訊,各span透過parent id 關聯起來

5.Zipkin

5.1 官網

https://zipkin.io

5.2 概述

Zipkin是一種分散式鏈路跟蹤系統圖形化的工具,Zipkin 是 Twitter 開源的分散式跟蹤系統,能夠收集微服務執行過程中的實時呼叫鏈路資訊,並能夠將這些呼叫鏈路資訊展示到Web圖形化介面上供開發人員分析,開發人員能夠從ZipKin中分析出呼叫鏈路中的效能瓶頸,識別出存在問題的應用程式,進而定位問題和解決問題。

5.3 下載地址

https://zipkin.io/pages/quickstart.html

In this section we’ll walk through building and starting an instance of Zipkin for checking out Zipkin locally. There are three options: using Java, Docker or running from source.

java 方式,下載的是jar包,直接執行就好。

6.案例

6.1 Micrometer和Zipkin分工

Micrometer 採集資料,Zipkin影像展示

6.2 總體父工程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框架的一個模組用於監視和管理應用程式。

6.3 服務提供者8001修改

6.3.1 pom修改

micrometer-tracing-bom不用引入

<!--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>
6.3.2 YML修改
# ========================zipkin===================
management:
  zipkin:
    tracing:
      endpoint: http://localhost:9411/api/v2/spans
  tracing:
    sampling:
      probability: 1.0 #取樣率預設為0.1(0.1就是10次只能有一次被記錄下來),值越大收集越及時。
6.3.3 新建PayMicrometerController
import cn.hutool.core.util.IdUtil;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

public class PayMicrometerController {
    /**
     * Micrometer(Sleuth)進行鏈路監控的例子
     * @param id
     * @return
     */
    @GetMapping(value = "/pay/micrometer/{id}")
    public String myMicrometer(@PathVariable("id") Integer id)
    {
        return "Hello, 歡迎到來myMicrometer inputId:  "+id+" \t    服務返回:" + IdUtil.simpleUUID();
    }
}

6.4 API介面PayFeignApi修改

@GetMapping(value = "/pay/micrometer/{id}")
String myMicrometer(@PathVariable("id") Integer id);

6.5 服務呼叫者80修改

6.5.1 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>
6.5.2 YML修改
# zipkin圖形展現地址和取樣率設定
management:
  zipkin:
    tracing:
      endpoint: http://localhost:9411/api/v2/spans
  tracing:
    sampling:
      probability: 1.0 #取樣率預設為0.1(0.1就是10次只能有一次被記錄下來),值越大收集越及時。
6.5.3 業務類修改
import com.atguigu.cloud.apis.PayFeignApi;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
public class OrderMicrometerController
{
    @Resource
    private PayFeignApi payFeignApi;

    @GetMapping(value = "/feign/micrometer/{id}")
    public String myMicrometer(@PathVariable("id") Integer id)
    {
        return payFeignApi.myMicrometer(id);
    }
}

7.測試

訪問 localhost:x/feign/micrometer/1,會看到

{"code":"500","message":"No fallback available.","data":null,"timestamp":1729692505995}

進入http://localhost:9411/

可以看到依賴關係,以及執行時間等

從本章節,也可以看出來,約定大於配置的思想體現,事先配置好各元件的版本資訊,事半功倍。

只是為了記錄自己的學習歷程,且本人水平有限,不對之處,請指正。

相關文章