Sleuth使用手册
基本介绍
SpringCloud提供的分布式系统中链路追踪解决方法。在SpringCloud2022版本中,Sleuth以被移除,而且不再支持Springboot3.x,其核心代码迁移到Micrometer Tracinghttps://micrometer.io/docs/tracing项目。目前最新支持Sleuth的Spring Cloud版本是2021.0.7,Spring Boot版本是2.6.14,Sleuth版本是3.1.8。
基础概念
- spanID:代表一组基本的工作单元。当请求到达各个服务组件的时候,通过一个唯一标识(SpanID)来标记它的开始、具体过程、结束。
- traceID:由一组TraceID相同的Span串联形成一个树状结构。为了实现请求路径,当请求到达分布式系统的入口端点时,只需要服务跟踪框架为该请求创建一个唯一的标识,请求在分布式系统内部流转时始终传递该唯一值。
- Annotation:用它记录一段时间内的事件。
cs - Client Sent -客户端发送一个请求,这个注解描述了这个Span的开始. sr - Server Received -服务端获得请求并准备开始处理它,如果将其sr减去cs时间戳便可得到网络传输的时间。 ss - Server Sent (服务端发送响应)–该注解表明请求处理的完成(当请求返回客户端),如果ss的时间戳减去sr时间戳,就可以得到服务器请求的时间。 cr - Client Received (客户端接收响应)-此时Span的结束,如果cr的时间戳减去cs时间戳便可以得到整个请求所消耗的时间。
常用注解
@NewSpan:注解一个方法,创建一个新的span。@ContinueSpan:注解一个方法,继承上一个span。
Spring Cloud使用Sleuth实现链路跟踪
- 引入相关依赖。
xml
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${spring-boot.version}</version>
<!--type和scope在子项目添加依赖管理时必须添加,否则不生效-->
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<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>
</dependencies>- 编写一个web接口,启动应用,使用log输出日志。
java
@SpringBootApplication
@RestController
public class SleuthSpringCloudStudtyMain {
private static final Logger log = LoggerFactory.getLogger(SleuthSpringCloudStudtyMain.class);
public static void main(String[] args) {
SpringApplication.run(SleuthSpringCloudStudtyMain.class, args);
}
@GetMapping("/helloWorld")
public String helloWorld(@RequestParam("name") String name) {
log.info(name + " hello world");
return name + " hello world";
}
}- 启动应用后,调用web接口,可以看到控制台日志,在接口上添加上了链路跟踪信息
[application name,trace id, span id]。
log
2023-05-27 15:50:18.209 INFO [sleuth-spring-cloud-study,c90b9f93a60bc8cb,c90b9f93a60bc8cb] 25716 --- [nio-7101-exec-2] c.c.s.SleuthSpringCloudStudtyMain : chenzhuowen1 hello worldSpring Cloud下Sleuth集成Zipkin客户端
- 引入相关依赖。
xml
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-boot.version>2.6.14</spring-boot.version>
<spring-cloud.version>2021.0.7</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${spring-boot.version}</version>
<!--type和scope在子项目添加依赖管理时必须添加,否则不生效-->
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--sleuth依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
</dependencies>- 在应用配置文件中配置zipkin服务器地址。
yaml
spring:
application:
name: sleuth-spring-cloud-study
zipkin:
base-url: http://localhost:9411
server:
port: 7101- 编写应用代码。
java
@SpringBootApplication
@RestController
public class SleuthSpringCloudStudtyMain {
private static final Logger log = LoggerFactory.getLogger(SleuthSpringCloudStudtyMain.class);
public static void main(String[] args) {
SpringApplication.run(SleuthSpringCloudStudtyMain.class, args);
}
@GetMapping("/helloWorld")
public String helloWorld(@RequestParam("name") String name) {
log.info(name + " hello world");
return name + " hello world";
}
}- 启动zipkin服务,通过http://127.0.0.1:9411/zipkin/访问控制台。

- 启动微服务应用并调用接口,可以看到zipkin控制台会显示出服务调用链信息。

