目录
服务监控与追踪(Spring Cloud Sleuth 和 Zipkin)
二、核心工具:Spring Cloud Sleuth + Zipkin
服务监控与追踪(Spring Cloud Sleuth 和 Zipkin)
一、为什么需要服务监控与追踪?
在微服务架构中,一个请求可能经过多个服务(如网关 → 订单服务 → 库存服务 → 支付服务)。当请求失败或性能下降时,传统日志难以定位问题根源。服务监控与追踪通过记录请求的完整调用链,帮助开发者快速排查问题、优化性能。
二、核心工具:Spring Cloud Sleuth + Zipkin
-
Spring Cloud Sleuth
- 作用:生成和传播分布式追踪 ID,自动记录服务间调用关系。
- 核心概念:
- Trace:全局唯一的请求 ID,标识一个完整的调用链。
- Span:调用链中的一个节点(如服务 A 调用服务 B),包含时间戳、状态等信息。
- 原理:通过拦截 HTTP 请求 / 响应,在请求头中注入
X-B3-TraceId
、X-B3-SpanId
等追踪信息,实现跨服务传递。
-
Zipkin
- 作用:收集、存储和可视化追踪数据,提供查询界面。
- 核心组件:
- Collector:接收追踪数据(支持 HTTP、Kafka 等多种协议)。
- Storage:存储数据(默认内存,生产环境常用 MySQL、Cassandra)。
- Query:提供 API 查询追踪信息。
- UI:可视化界面,展示调用链耗时、错误等。
三、场景示例:电商下单调用链追踪
假设用户下单请求经过以下服务:
网关 → 订单服务 → 库存服务 → 支付服务
场景描述:
- 用户通过网关发起下单请求。
- 订单服务创建订单,并调用库存服务扣减库存。
- 库存服务扣减成功后,订单服务调用支付服务。
- 若支付失败,需回滚库存(结合 Seata 分布式事务)。
使用 Sleuth + Zipkin 的追踪流程:
-
配置集成:
- 在所有服务中添加依赖:
<!-- Sleuth --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency> <!-- Zipkin --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency>
- 配置
application.yml
:spring: zipkin: base-url: http://localhost:9411 # Zipkin服务地址 sleuth: sampler: probability: 1.0 # 采样率(0-1,1表示全部记录)
- 启动 Zipkin 服务:
docker run -d -p 9411:9411 openzipkin/zipkin
- 在所有服务中添加依赖:
-
代码实现:
// 订单服务 @RestController public class OrderController { @Autowired private RestTemplate restTemplate; @GetMapping("/order") public String createOrder() { // 1. 创建订单 log.info("创建订单"); // 2. 调用库存服务 String stockResult = restTemplate.getForObject( "http://stock-service/deduct", String.class); // 3. 调用支付服务 String paymentResult = restTemplate.getForObject( "http://payment-service/pay", String.class); return "下单成功"; } }
-
追踪结果分析:
- 在 Zipkin UI(
http://localhost:9411
)中输入TraceId
,查看完整调用链:
关键信息:
- 每个服务的调用耗时(如库存服务耗时 200ms,支付服务耗时 500ms)。
- 错误节点(如支付服务返回 500 错误)。
- 服务间的依赖关系(网关 → 订单 → 库存 → 支付)。
四、高级功能与优化
-
异步调用支持:
- Sleuth 支持异步线程的追踪 ID 传递,需配置
AsyncSpanCustomizer
。
- Sleuth 支持异步线程的追踪 ID 传递,需配置
-
日志集成:
- 将 Sleuth 的
TraceId
注入日志,方便关联日志与调用链:import brave.Tracer; ... Tracer tracer = Tracer.currentTracer(); log.info("当前TraceId: {}", tracer.currentSpan().context().traceIdString());
- 将 Sleuth 的
-
性能优化:
- 调整采样率:生产环境可设置
probability: 0.1
(10% 的请求被记录)。 - 使用消息队列:将追踪数据异步发送到 Zipkin,避免阻塞业务线程。
- 调整采样率:生产环境可设置
-
五、适用场景
- 排查调用链性能瓶颈:快速定位响应慢的服务节点。
- 错误定位:通过调用链上下文关联各服务的异常日志。
- 服务依赖分析:可视化服务间调用关系,辅助架构优化。
-
六、总结
Spring Cloud Sleuth 与 Zipkin 的组合为微服务架构提供了强大的追踪能力,帮助开发者从 “黑盒” 调试转向 “透明化” 监控。在电商、金融等高并发场景中,结合 Prometheus(指标监控)、Grafana(可视化)等工具,可构建完整的可观测性体系。