使用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-a
和service-b
。我們將在這兩個服務中整合Spring Cloud Sleuth。
四、建立Spring Boot專案
首先,我們建立兩個Spring Boot專案,分別為service-a
和service-b
,並新增必要的依賴。
- 在
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>
- 在
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
六、編寫程式碼
接下來,我們編寫程式碼來實現兩個服務的呼叫和鏈路追蹤。
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);
}
}
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";
}
}
- 在兩個服務的主類中新增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
),可以看到請求的追蹤資訊。
八、配置自定義追蹤
為了更好地監控和除錯,我們可以新增自定義的追蹤資訊。例如,新增自定義標籤、日誌等。
- 在
service-a
和service-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,可以方便地收集和展示追蹤資料,從而提高系統的可觀測性和除錯能力。
本文著作權歸聚娃科技微賺淘客系統開發者團隊,轉載請註明出處!