使用Spring Cloud Sleuth實現分散式系統的鏈路追蹤

省赚客开发者团队發表於2024-07-17

使用Spring Cloud Sleuth實現分散式系統的鏈路追蹤

大家好,我是微賺淘客系統3.0的小編,是個冬天不穿秋褲,天冷也要風度的程式猿!

一、引言

在微服務架構中,應用程式被分解成多個服務,每個服務都可以獨立部署和擴充套件。這種架構雖然帶來了很多好處,但也增加了除錯和監控的複雜性。鏈路追蹤(Tracing)是一種用於監控和除錯分散式系統的方法。Spring Cloud Sleuth是一個用於實現分散式鏈路追蹤的強大工具。本文將詳細介紹如何使用Spring Cloud Sleuth來實現分散式系統的鏈路追蹤。

二、Spring Cloud Sleuth簡介

Spring Cloud Sleuth透過在微服務之間傳遞唯一的追蹤ID和Span ID,實現對請求路徑的追蹤。它整合了Zipkin等開源分散式追蹤系統,可以將追蹤資料傳送到這些系統進行集中展示和分析。

三、環境搭建

在開始編寫程式碼之前,我們需要搭建Spring Cloud Sleuth的執行環境。假設我們有兩個微服務:service-aservice-b。我們將在這兩個服務中整合Spring Cloud Sleuth。

四、建立Spring Boot專案

首先,我們建立兩個Spring Boot專案,分別為service-aservice-b,並新增必要的依賴。

  1. service-a的pom.xml中新增依賴
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-sleuth</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-zipkin</artifactId>
    </dependency>
</dependencies>
  1. service-b的pom.xml中新增依賴
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-sleuth</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-zipkin</artifactId>
    </dependency>
</dependencies>

五、配置Zipkin

為了收集和展示追蹤資料,我們需要配置Zipkin。可以透過Docker來快速啟動一個Zipkin例項:

docker run -d -p 9411:9411 openzipkin/zipkin

六、編寫程式碼

接下來,我們編寫程式碼來實現兩個服務的呼叫和鏈路追蹤。

  1. service-a中的程式碼
package cn.juwatech.servicea;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import org.springframework.cloud.sleuth.Tracer;

@RestController
public class ServiceAController {

    @Autowired
    private RestTemplate restTemplate;
    
    @Autowired
    private Tracer tracer;

    @GetMapping("/service-a")
    public String callServiceB() {
        tracer.currentSpan().tag("custom-tag", "service-a-call");
        return restTemplate.getForObject("http://localhost:8081/service-b", String.class);
    }
}
  1. service-b中的程式碼
package cn.juwatech.serviceb;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.cloud.sleuth.Tracer;

@RestController
public class ServiceBController {
    
    @Autowired
    private Tracer tracer;

    @GetMapping("/service-b")
    public String serviceB() {
        tracer.currentSpan().tag("custom-tag", "service-b-response");
        return "Response from Service B";
    }
}
  1. 在兩個服務的主類中新增RestTemplate Bean
package cn.juwatech.servicea;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
public class ServiceAApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceAApplication.class, args);
    }

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
package cn.juwatech.serviceb;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ServiceBApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceBApplication.class, args);
    }
}

七、測試鏈路追蹤

啟動兩個服務,並訪問http://localhost:8080/service-a。隨後,訪問Zipkin UI(預設地址為http://localhost:9411),可以看到請求的追蹤資訊。

八、配置自定義追蹤

為了更好地監控和除錯,我們可以新增自定義的追蹤資訊。例如,新增自定義標籤、日誌等。

  1. service-aservice-b中新增自定義標籤
import org.springframework.cloud.sleuth.Span;
import org.springframework.cloud.sleuth.Tracer;

@Autowired
private Tracer tracer;

public void someMethod() {
    Span newSpan = tracer.nextSpan().name("new-span").start();
    try (Tracer.SpanInScope ws = tracer.withSpan(newSpan.start())) {
        // 自定義邏輯
        newSpan.tag("custom-key", "custom-value");
    } finally {
        newSpan.end();
    }
}

九、總結

透過本文的介紹,我們學習瞭如何使用Spring Cloud Sleuth來實現分散式系統的鏈路追蹤。透過整合Zipkin,可以方便地收集和展示追蹤資料,從而提高系統的可觀測性和除錯能力。

本文著作權歸聚娃科技微賺淘客系統開發者團隊,轉載請註明出處!

相關文章