首頁 > 軟體

SpringCloud_Sleuth分散式鏈路請求跟蹤的範例程式碼

2023-02-03 18:03:29

Spring Cloud Sleuth是一款針對Spring Cloud的分散式跟蹤工具。它借鑑了Dapper、Zipkin和HTrace。

特點

  • 將trace Id和 span Id 新增到Slf4J MDC,這樣就可以在紀錄檔聚合器中從給定的trace或span提取所有紀錄檔。
  • 提供通用分散式跟蹤資料模型的抽象。
  • spring-cloud-sleuth-zipkin可收集到zipkin server。

程式碼連結https://github.com/lidonglin-bit/cloud 

一、概述

1.為什麼會出現這個技術?需要解決哪些問題?

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

2.是什麼

Spring Cloud Sleuth提供了一套完整的服務跟蹤的解決方案
在分散式系統中提供追蹤解決方案並且相容支援了zipkin(負責展現)
https://github.com/spring-cloud/spring-cloud-sleuth

https://cloud.spring.io/spring-cloud-sleuth/reference/html/

3.解決

二、搭建鏈路監控步驟

1.zipkin

下載
SpringCloud從F版起已不需要自己構建Zipkin server了,只需要呼叫jar包即可
zipkin-server-2.12.9.exec.jar
執行jar
java -jar zipkin-server-2.12.9-exec.jar
執行控制檯
http://localhost:9411/zipkin/
術語
完整的呼叫鏈路
表示一請求鏈路,一條鏈路通過Trace Id唯一標識,Span標識發起的請求資訊,各span通過parent id 關聯起來。

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

整個鏈路的依賴關係如下:

名詞解釋
Trace:類似於樹結構的Span集合,表示一條呼叫鏈路,存在唯一標識
span:表示呼叫鏈路來源,通俗的理解span就是一次請求資訊

2.服務提供者

1.修改:cloud-provider-payment8001
2.POM

<!--包含了sleuth+zipkin-->
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

3.YML

server:
  port: 8001

spring:
  application:
    name: cloud-payment-service
  zipkin:
    base-url: http://localhost:9411
  sleuth:
    sampler:
      #取樣率值介於0~1之間,1表示全部取樣
      probability: 1
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/cloud2020?useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: root
    password: root

mybatis:
  mapperLocations: classpath:/mapper/*.xml
  type-aliases-package: com.donglin.springcloud.entities

eureka:
  client:
    register-with-eureka: true
    fetchRegistry: true
    service-url:
      defaultZone: http://localhost:7001/eureka

4.業務類PaymentController

@GetMapping("/payment/zipkin")
public String paymentZipkin(){
        return "hi ,i'am paymentzipkin server,welcome to donglin,O(∩_∩)O哈哈~";
}

3.服務消費者(呼叫方)

1.修改:cloud-consumer-order80
2.POM

 <!--包含了sleuth+zipkin-->
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

3.YML

server:
  port: 80

spring:
    application:
        name: cloud-order-service
    zipkin:
      base-url: http://localhost:9411
    sleuth:
      sampler:
        probability: 1

eureka:
  client:
    #表示是否將自己註冊進EurekaServer預設為true。
    register-with-eureka: false
    #是否從EurekaServer抓取已有的註冊資訊,預設為true。單節點無所謂,叢集必須設定為true才能配合ribbon使用負載均衡
    fetchRegistry: true
    service-url:
      #單機
      defaultZone: http://localhost:7001/eureka
      #叢集
      #defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka  # 叢集版

4.業務類PaymentController

 //==> zipkin+sleuth
@GetMapping("/consumer/payment/zipkin")
public String paymentZipkin(){
        String result = restTemplate.getForObject("http://localhost:8001"+"/payment/zipkin/", String.class);
        return result;
}

4.依次啟動eureka7001/8001/80

80呼叫8001幾次測試下

5.開啟瀏覽器存取: http://localhost:9411

會出現以下介面
檢視

檢視依賴關係

到此這篇關於SpringCloud_Sleuth分散式鏈路請求跟蹤的文章就介紹到這了,更多相關SpringCloud_Sleuth分散式鏈路跟蹤內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com