首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01 | 是什么推动了单体应用到微服务架构的演进?
02 | 微服务全家桶:走进 Spring Cloud 的世界
03 | 初窥门径:我们要搭建一个怎样的微服务实战项目?
04 | 十八般兵器:如何搭建项目所需的开发环境?
05 | 牛刀小试:如何搭建优惠券模板服务?
06 | 牛刀小试:如何搭建优惠券计算服务和用户服务?
07 | Nacos体系架构:什么是服务治理?
08 | 服务治理:Nacos集群环境搭建
09 | 集成 Nacos:如何将服务提供者注册到 Nacos 服务器?
10 | 集成 Nacos:如何通过服务发现机制向服务提供者发起调用?
11 | Loadbalancer 实战:通过自定义负载均衡策略实现金丝雀测试
12 | OpenFeign:服务间调用组件 OpenFeign 是怎么“隔空取物”的?
13 | OpenFeign 实战:如何实现服务间调用功能?
14 | OpenFeign 实战:OpenFeign 组件有哪些高级玩法?
15 | 配置中心在微服务中发挥着怎样的作用?
16 | 如何集成 Nacos Config 实现配置项动态刷新?
17 | Sentinel 体系结构:什么是服务容错(降级熔断、流量整形)?
18 | Sentinel 实战:如何实施流量整形与限流策略?
19 | Sentinel 实战:如何为项目添加异常降级方案?
20 | Sentinel 实战:如何接入 Nacos 实现规则持久化?
21 | Sleuth 体系架构:为什么微服务架构需要链路追踪?
22 | 调用链追踪:集成 Sleuth 和 Zipkin,实现链路打标
23 | 调用链追踪:如何通过 ELK 实现日志检索?
24 | 为什么微服务架构少不了微服务网关?
25 | 微服务网关:Gateway 中的路由和谓词有何应用?
26 | 微服务网关:如何设置请求转发、跨域和限流规则?
27 | 微服务网关:如何借助 Nacos 实现动态路由规则?
28 | 消息驱动:谁说消息队列只能削峰填谷?
29 | 消息驱动:如何集成 Stream 实现消息驱动?
30 | 消息驱动:如何高效处理 Stream 中的异常?
31 | 消息驱动:如何通过 RabbitMQ 插件实现延迟消息?
32 | Alibaba Seata 框架:什么是分布式事务?
33 | 分布式事务:搭建 Seata 服务器
34 | 分布式事务:使用 Nacos+Seata 实现AT模式
35 | 分布式事务:使用 Nacos+Seata 实现 TCC 补偿模式
36 | 说透微服务 | 什么是主链路规划?
当前位置:
首页>>
技术小册>>
Spring Cloud微服务项目实战
小册名称: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`中添加如下依赖: ```xml <dependencies> <!-- Spring Cloud Sleuth --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency> <!-- Zipkin的Spring Boot Starter --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-sleuth-zipkin</artifactId> </dependency> <!-- Zipkin的HTTP客户端 --> <dependency> <groupId>io.zipkin.brave</groupId> <artifactId>brave-instrumentation-httpclient</artifactId> </dependency> <!-- 其他服务相关依赖 --> </dependencies> ``` 确保你的`pom.xml`中包含了Spring Cloud的依赖管理(BOM),以便正确解析版本。 ##### 22.4.2 配置Zipkin Server Zipkin Server负责收集并存储追踪数据。你可以下载Zipkin的官方发布包并运行,或者使用Docker容器快速部署。这里以Docker为例,运行以下命令启动Zipkin Server: ```bash docker run -d -p 9411:9411 openzipkin/zipkin ``` 此命令将启动一个Zipkin Server实例,并监听9411端口。 ##### 22.4.3 配置服务以发送追踪数据到Zipkin 在Spring Boot应用的`application.yml`或`application.properties`文件中,配置Sleuth以将追踪数据发送到Zipkin Server: ```yaml spring: zipkin: base-url: http://localhost:9411/ sleuth: sampler: probability: 1.0 # 设置为1.0表示对所有请求进行追踪 ``` 这里的`probability`设置决定了采样率,即多少比例的请求会被追踪。设置为1.0表示对所有请求进行追踪,这在开发或测试环境中很有用,但在生产环境中可能会因为产生大量追踪数据而影响性能,因此需要谨慎设置。 #### 22.5 实现链路打标 链路打标(Tagging)是在调用链追踪过程中,为特定的追踪信息添加自定义标签或注解的行为。这些标签可以是业务相关的数据,如用户ID、订单号等,也可以是技术相关的数据,如调用结果、异常信息等。通过链路打标,开发者可以更加精确地追踪和分析问题。 在Spring Cloud Sleuth中,可以使用`Tracer`接口或`Span`对象来实现链路打标。以下是一个使用`Span`对象进行链路打标的示例: ```java import org.springframework.cloud.sleuth.Tracer; import org.springframework.cloud.sleuth.Span; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class SampleController { private final Tracer tracer; public SampleController(Tracer tracer) { this.tracer = tracer; } @GetMapping("/sample") public String sampleMethod() { // 获取当前Span Span currentSpan = tracer.currentSpan(); if (currentSpan != null) { // 添加自定义标签 currentSpan.tag("user.id", "12345"); currentSpan.tag("order.id", "67890"); } // 模拟业务逻辑 // ... return "Sample response"; } } ``` 在这个示例中,通过注入`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的性能和存储情况,以确保系统的稳定性和高效性。
上一篇:
21 | Sleuth 体系架构:为什么微服务架构需要链路追踪?
下一篇:
23 | 调用链追踪:如何通过 ELK 实现日志检索?
该分类下的相关小册推荐:
Java语言基础5-面向对象初级
Java面试指南
Java语言基础10-Java中的集合
深入拆解 Java 虚拟机
深入理解Java虚拟机
Java语言基础3-流程控制
Java并发编程
Java并发编程实战
Mybatis合辑5-注解、扩展、SQL构建
java源码学习笔记
Java语言基础7-Java中的异常
Java高并发秒杀入门与实战