1. 程式人生 > >淺嘗Spring Cloud Sleuth

淺嘗Spring Cloud Sleuth

Spring Cloud Sleuth提供了分散式追蹤(distributed tracing)的一個解決方案。其基本思路是在服務呼叫的請求和響應中加入ID,標明上下游請求的關係。利用這些資訊,可以方便地分析服務呼叫鏈路和服務間的依賴關係。

Only Sleuth

在Spring Tool Suite的檔案選單中,點選新建Spring Starter Project。

在請求處理方法內加上一行日誌程式碼。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@SpringBootApplication
public class SpringcloudSleuthApplication {

    private static Logger log = LoggerFactory.getLogger(SpringcloudSleuthApplication.class);
    @RequestMapping("/")
    public String home() {
        log.info("Handling home");
        return "Hello World";
    }

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

設定應用程式埠及名稱。

server.port=10001

spring.application.name=sleuth-demo-without-zipkin

啟動程式並瀏覽頁面後,可以看到日誌資訊裡多了點東西。

[sleuth-demo-without-zipkin,6c00dba1679ee164,6c00dba1679ee164,false]

這一串資料裡包含四個部分

  • appname - 應用程式名稱
  • traceId - 追蹤系統中的唯一標識
  • spanId - 具體操作的唯一標識
  • exportable - 是否日誌要匯出到Zipkin

Sleuth + Zipkin

Zipkin Server

要想把追蹤資料傳送到Zipkin上,首先需要建立一個Zipkin Server應用程式,在pom.xml里加上如下依賴:

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
  </dependency>

  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
  </dependency>

  <dependency>
    <groupId>io.zipkin.java</groupId>
    <artifactId>zipkin-server</artifactId>
    <version>2.11.5</version>
  </dependency>
  
  <dependency>
    <groupId>io.zipkin.java</groupId>
    <artifactId>zipkin-autoconfigure-ui</artifactId>
    <version>2.11.5</version>
  </dependency>
</dependencies>

然後在啟動類加上@EnableZipkinServer標記。

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

import zipkin2.server.internal.EnableZipkinServer;

@EnableZipkinServer
@SpringBootApplication
public class SpringcloudZipkinServerApplication {

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

application.properties檔案中可修改預設埠,server.port=10000

開啟相關頁面,如下:

Zipkin Client

再新建一個應用程式。

啟動程式程式碼基本一樣。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@SpringBootApplication
public class SpringcloudZipkinApplication {

    private static Logger log = LoggerFactory.getLogger(SpringcloudZipkinApplication.class);
    @RequestMapping("/")
    public String home() {
        log.info("Handling home");
        return "Hello World";
    }
    
    public static void main(String[] args) {
        SpringApplication.run(SpringcloudZipkinApplication.class, args);
    }
}

application.properties檔案里加上Zipkin Server的地址,同時為了每次都將資料傳入Zipkin,需要把spring.sleuth.sampler.probability的值改為1.0。

server.port=10002

spring.application.name=sleuth-demo-with-zipkin
spring.zipkin.base-url=http://localhost:10000
spring.sleuth.sampler.probability=1.0

啟動Zipkin Client後,可以看到Zipkin Server頁面上多了一條追蹤資料。

再次重新整理Zipkin Client頁面,又會有條新的資料。

在看控制檯的日誌記錄,exportable項變成了true,說明資料已傳入Zipkin。