当前位置:  首页>> 技术小册>> Spring Cloud微服务项目实战

22 | 调用链追踪:集成 Sleuth 和 Zipkin,实现链路打标

在微服务架构中,随着服务数量的增加,服务间的调用关系变得日益复杂。为了有效监控和排查分布式系统中的问题,调用链追踪(Distributed Tracing)成为了一项关键技术。它允许我们追踪一个请求从客户端发起,经过多个服务,直至响应返回客户端的全过程。在Spring Cloud生态中,Spring Cloud Sleuth和Zipkin是实现这一功能的两大核心组件。本章将详细介绍如何在Spring Cloud项目中集成Sleuth和Zipkin,以实现服务调用的链路追踪,并重点讲解如何进行链路打标,以便更精确地追踪和分析问题。

22.1 引言

在微服务架构下,服务间的通信频繁且复杂,一个请求可能跨越多个服务,每个服务又可能调用其他服务。当系统出现问题时,如响应时间过长、请求失败等,快速定位问题源头变得尤为困难。调用链追踪技术通过记录每个请求在各个服务之间的流转信息,帮助开发者快速定位问题,优化系统性能。

22.2 Spring Cloud Sleuth

Spring Cloud Sleuth是Spring Cloud的一个子项目,它提供了一种分布式追踪解决方案。Sleuth通过为每个请求生成一个唯一的追踪ID(Trace ID)和跨进程的传递(Span ID、Parent Span ID等),实现了请求的链路追踪。Sleuth可以自动地将这些追踪信息嵌入到日志、HTTP头部或消息体中,使得开发者可以在日志或监控系统中轻松追踪请求路径。

22.3 Zipkin

Zipkin是一个开源的分布式追踪系统,由Twitter开发并贡献给开源社区。它收集来自各个服务的追踪数据,提供了一个查询界面,允许开发者按时间、服务、请求类型等多种维度查询和展示追踪信息。Zipkin支持多种存储后端,如内存、MySQL、Elasticsearch等,以满足不同规模和需求的生产环境。

22.4 集成Sleuth和Zipkin

22.4.1 添加依赖

首先,在Spring Boot项目中添加Sleuth和Zipkin的依赖。如果使用Maven,可以在pom.xml中添加如下依赖:

  1. <dependencies>
  2. <!-- Spring Cloud Sleuth -->
  3. <dependency>
  4. <groupId>org.springframework.cloud</groupId>
  5. <artifactId>spring-cloud-starter-sleuth</artifactId>
  6. </dependency>
  7. <!-- Zipkin的Spring Boot Starter -->
  8. <dependency>
  9. <groupId>org.springframework.cloud</groupId>
  10. <artifactId>spring-cloud-sleuth-zipkin</artifactId>
  11. </dependency>
  12. <!-- Zipkin的HTTP客户端 -->
  13. <dependency>
  14. <groupId>io.zipkin.brave</groupId>
  15. <artifactId>brave-instrumentation-httpclient</artifactId>
  16. </dependency>
  17. <!-- 其他服务相关依赖 -->
  18. </dependencies>

确保你的pom.xml中包含了Spring Cloud的依赖管理(BOM),以便正确解析版本。

22.4.2 配置Zipkin Server

Zipkin Server负责收集并存储追踪数据。你可以下载Zipkin的官方发布包并运行,或者使用Docker容器快速部署。这里以Docker为例,运行以下命令启动Zipkin Server:

  1. docker run -d -p 9411:9411 openzipkin/zipkin

此命令将启动一个Zipkin Server实例,并监听9411端口。

22.4.3 配置服务以发送追踪数据到Zipkin

在Spring Boot应用的application.ymlapplication.properties文件中,配置Sleuth以将追踪数据发送到Zipkin Server:

  1. spring:
  2. zipkin:
  3. base-url: http://localhost:9411/
  4. sleuth:
  5. sampler:
  6. probability: 1.0 # 设置为1.0表示对所有请求进行追踪

这里的probability设置决定了采样率,即多少比例的请求会被追踪。设置为1.0表示对所有请求进行追踪,这在开发或测试环境中很有用,但在生产环境中可能会因为产生大量追踪数据而影响性能,因此需要谨慎设置。

22.5 实现链路打标

链路打标(Tagging)是在调用链追踪过程中,为特定的追踪信息添加自定义标签或注解的行为。这些标签可以是业务相关的数据,如用户ID、订单号等,也可以是技术相关的数据,如调用结果、异常信息等。通过链路打标,开发者可以更加精确地追踪和分析问题。

在Spring Cloud Sleuth中,可以使用Tracer接口或Span对象来实现链路打标。以下是一个使用Span对象进行链路打标的示例:

  1. import org.springframework.cloud.sleuth.Tracer;
  2. import org.springframework.cloud.sleuth.Span;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5. @RestController
  6. public class SampleController {
  7. private final Tracer tracer;
  8. public SampleController(Tracer tracer) {
  9. this.tracer = tracer;
  10. }
  11. @GetMapping("/sample")
  12. public String sampleMethod() {
  13. // 获取当前Span
  14. Span currentSpan = tracer.currentSpan();
  15. if (currentSpan != null) {
  16. // 添加自定义标签
  17. currentSpan.tag("user.id", "12345");
  18. currentSpan.tag("order.id", "67890");
  19. }
  20. // 模拟业务逻辑
  21. // ...
  22. return "Sample response";
  23. }
  24. }

在这个示例中,通过注入Tracer对象并调用其currentSpan()方法获取当前请求的Span对象,然后使用tag()方法添加自定义标签。这些标签随后会被发送到Zipkin Server,并在Zipkin的UI界面中展示,便于开发者进行分析。

22.6 验证与调试

完成上述配置后,启动你的Spring Boot应用和Zipkin Server,然后发送请求到你的应用。在Zipkin的UI界面中,你应该能够看到请求的追踪信息,包括每个服务的调用顺序、时间戳、以及你添加的自定义标签。

如果遇到问题,可以检查以下几个方面:

  • 确保所有服务的spring.zipkin.base-url配置正确指向Zipkin Server。
  • 检查服务的日志输出,确认是否有关于Sleuth或Zipkin的错误信息。
  • 确认Zipkin Server的存储后端配置正确,且服务有权限写入数据。
  • 验证网络设置,确保服务能够访问Zipkin Server的端口。

22.7 总结

通过集成Spring Cloud Sleuth和Zipkin,我们可以有效地实现微服务架构中的调用链追踪。链路打标作为一项重要功能,使我们能够在追踪信息中添加自定义的业务或技术标签,从而更精确地追踪和分析问题。在实际应用中,建议根据业务需求和系统规模合理设置采样率,并定期检查Zipkin Server的性能和存储情况,以确保系统的稳定性和高效性。


该分类下的相关小册推荐: