Spring Cloud Sleuth提供了分散式追蹤(distributed tracing)的一個解決方案。其基本思路是在服務調用的請求和響應中加入ID,標明上下游請求的關係。利用這些信息,可以方便地分析服務調用鏈路和服務間的依賴關係。 Only Sleuth 在Spring Tool Suit ...
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。