Sleuth链路追踪是非常重要的微服务组件,是构建微服务的基石,下面我就全面来详解Sleuth链路追踪@mikechen
Sleuth定义
Sleuth链路追踪,是一种用于监视、和跟踪分布式系统中请求的传播路径的技术。
Sleuth链路追踪,也是Spring Cloud Sleuth库的一个关键功能,允许你跟踪分布式系统中请求的传播路径。
Sleuth作用
在复杂的微服务架构系统中,一个请求可能需要经过多个服务、和组件的处理,形成了一个复杂的服务调用链路。
如下图所示:
就会出现如下问题:
- 当一个请求在系统中出现问题时,很难迅速定位问题的根源。
- 每个服务的响应时间、吞吐量和资源利用率,以及服务之间的调用关系,如何跟踪?
- 以及服务之间的调用关系非常复杂,开发人员很难理解整个系统的调用关系,以及每个服务之间的依赖关系。
因此,对于复杂的微服务架构系统,链路追踪工具和技术变得尤为重要了。
Sleuth原理
Sleuth的原理,如下图所示:
Sleuth的工作原理主要涉及三个核心概念:Span、Trace和Annotations。
1. Span(跨度)
- Span是Sleuth中的基本工作单元,代表着系统中的一个工作单元。
- 每个Span都有自己的唯一标识符(spanId),以及所属的Trace的标识符(traceId)。
- 在分布式系统中,一个请求会由多个Span组成,它们共同构成了请求的传播路径。
2. Trace(跟踪):
- Trace是由一系列Span组成的有向无环图(DAG),代表着一个请求在系统中的传播路径。
- 每个Trace都有一个唯一的标识符(traceId),它用于标识整个请求链路。
- 通过跟踪Trace,开发人员可以了解请求在系统中的整个传播路径,从而进行故障排除和性能优化。
3. Annotations(注解):
- Annotations是Span中的一种注解,用于记录Span的各种事件和操作。
- Sleuth预定义了一些常见的Annotations,如:Client Send(客户端发送请求)、Client Receive(客户端接收响应)、Server Send(服务端接收请求)等。
- 开发人员还可以自定义Annotations,以记录特定操作或事件。
一句话总结:Span代表着系统中的一个工作单元,Trace代表着一个请求在系统中的传播路径,而Annotations则用于记录Span中的各种事件和操作。
Sleuth使用
1、添加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency>
2、编写业务代码
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; @RestController public class MyController { @Autowired private RestTemplate restTemplate; @GetMapping("/my-endpoint") public String myEndpoint() { // 发起一个外部服务调用 restTemplate.getForObject("http://example.com/api/resource", String.class); return "Request processed successfully!"; } }
3、运行程序
在日志中查看Sleuth自动生成的traceId和spanId,以及记录了请求的传播路径。
[traceId=5b65bc9a15f3580f,spanId=5b65bc9a15f3580f] Received GET request for /api/resource [traceId=5b65bc9a15f3580f,spanId=bd2a558185f3580f,parent=5b65bc9a15f3580f] Processed GET request for /api/resource [traceId=5b65bc9a15f3580f,spanId=05d141cc35f3580f,parent=bd2a558185f3580f] Sending response for GET request for /api/resource
Sleuth将自动为每个请求生成traceId和spanId,并记录请求的传播路径,帮助你更好地理解系统的行为和性能。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注作者「mikechen」公众号,获取更多技术干货!

后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》