微服务请求存在的问题
微服务跳来跳去,追踪难,排查难
微服务调⽤链路出现了问题怎么快速排查
微服务调⽤链路耗时⻓怎么定位是哪个服务
链路追踪系统解决的问题
分布式应⽤架构虽然满⾜了应⽤横向扩展的需求,但是运维和诊断的过程变得越来越复杂,例如会遇到接⼝诊
断困难、应⽤性能诊断复杂、架构分析复杂等难题,传统的监控⼯具并⽆法满⾜,分布式链路系统由此诞⽣
核⼼:将⼀次请求分布式调⽤,使⽤GPS定位串起来,记录每个调⽤的耗时、性能等⽇志,并通过可视化⼯具展示出来。
常用的链路追踪技术栈
主要包括以下几种,结合其核心特点与应用场景进行对比分析
Spring Cloud Sleuth + Zipkin
核心功能
Sleuth:作为Spring Cloud生态的原生组件,负责为分布式请求生成唯一的追踪标识(Trace ID和Span ID),并将这些标识通过日志或HTTP头传播到各微服务,实现调用链路的透明化跟踪
Zipkin:提供数据收集、存储、分析和可视化功能,接收Sleuth发送的追踪数据,展示完整的调用链路图,支持性能瓶颈定位和故障排查
集成方式
- 依赖配置:添加spring-cloud-starter-sleuth和spring-cloud-sleuth-zipkin依赖,配置Zipkin服务器地址即可
- 数据采样:通过spring.sleuth.sampler.probability设置采样率(如1.0表示全量采集)
适用场景
- 需要与Spring Cloud深度集成的项目;
- 快速搭建基础链路追踪能力,适合中小型微服务系统
Apache SkyWalking
核心功能
- 探针(Agent):无侵入式部署,支持Java、.NET、Node.js等多语言,自动采集服务间调用、数据库访问等性能数据
- OAP服务:负责数据聚合、分析和存储,支持Elasticsearch、MySQL等多种存储后端
- 界面:提供拓扑图、调用链详情、服务性能指标(如响应时间、吞吐量)的可视化
优势
- 低侵入性:仅需通过探针注入,无需修改业务代码;
- 多维度监控:支持服务网格、日志关联、告警功能,适用于复杂分布式系统
适用场景
- 多语言混合技术栈的大型微服务架构;
- 需要一体化监控(APM)与告警能力的场景
阿里云鹰眼
- 阿里云自研的分布式追踪系统,深度集成于阿里云生态,适合云原生环境,提供商业化支持
Jaeger
- CNCF孵化的开源项目,支持OpenTracing标准,适合云原生环境,与Kubernetes生态兼容性较好
技术选型对比
| 技术栈 | 侵入性 | 多语言支持 | 可视化能力 | 适用规模 |
|---|---|---|---|---|
| Sleuth + Zipkin | 低(需依赖) | 仅Java | 基础链路图 | 中小型Spring Cloud项目 |
| Apache SkyWalking | 无 | 广泛 | 丰富(拓扑、指标) | 大型复杂系统 |
| 阿里云鹰眼 | 无 | 有限 | 商业化高级功能 | 阿里云生态项目 |
实践建议
- 轻量级需求:优先选择 Sleuth + Zipkin,配置简单且与Spring Cloud无缝集成
- 企业级监控:采用 SkyWalking,尤其适用于多语言、高并发的分布式系统
- 云原生环境:结合 Jaeger 或云厂商提供的追踪服务(如阿里鹰眼),利用其与容器化部署的兼容性
什么是Sleuth
⼀个组件,专⻔⽤于记录链路数据的开源组件。
⽂档:https://spring.io/projects/spring-cloud-sleuth
什么是zipkin
官⽹
https://zipkin.io/
https://zipkin.io/pages/quickstart.html
⼤规模分布式系统的APM⼯具(Application
Performance Management),基于Google Dapper的
基础实现,和sleuth结合可以提供可视化web界⾯分析
调⽤链路耗时情况
使用
spring-cloud-starter-sleuth 在 Spring Cloud 2024.x 中已被 Micrometer Tracing 取代。(就是把sleuth剥离成一个单独的项目)
配置pom
<properties>
<!-- **************************** 分布式核心 **************************** -->
<micrometer-tracing.version>1.3.5</micrometer-tracing.version>
<zipkin-reporter-brave.version>3.4.3</zipkin-reporter-brave.version>
<!-- **************************** 分布式核心 **************************** -->
</properties>
<dependencyManagement>
<dependencies>
......
<!-- **************************** 分布式核心 **************************** -->
<!-- 链路追踪 Micrometer Tracing -->
<!-- 使用 Brave 作为链路追踪实现 -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing-bridge-brave</artifactId>
<version>${micrometer-tracing.version}</version>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing</artifactId>
<version>${micrometer-tracing.version}</version>
</dependency>
<dependency>
<groupId>io.zipkin.reporter2</groupId>
<artifactId>zipkin-reporter-brave</artifactId>
<version>${zipkin-reporter-brave.version}</version>
</dependency>
<!-- **************************** 分布式核心 **************************** -->
......
</dependencies>
</dependencyManagement>
配置之前需要将网关中的一些配置去掉。
online-edu-api-gateway/src/main/java/org/online_edu/filter/UserGlobalFilter.java
//@Component
public class UserGlobalFilter implements GlobalFilter, Ordered {
......
}
online-edu-api-gateway/src/main/resources/application.yml
server:
port: 8888
spring:
application:
name: online-edu-api-gateway
cloud:
nacos:
discovery:
server-addr: xxx.xxx.xxx.xxx:8848
username: nacos
password: xxxxxxxxx
gateway:
routes: #数组形式
- id: order-service #路由唯⼀标识
# uri: http://127.0.0.1:8000 #想要转发到的地址
uri: lb://online-edu-order-service # 从nacos获取名称转发,lb是负载均衡轮训策略
order: 1 #优先级,数字越⼩优先级越⾼
predicates: #断⾔ 配置哪个路径才转发
- Path=/order-server/**
# - Before=2025-03-28T01:01:01.000+08:00
# - Query=token
filters: #过滤器,请求在传递过程中通过过滤器修改
- StripPrefix=1 #去掉第⼀层前缀
discovery:
locator:
enabled: true #开启网关拉取nacos的服务
现在可以在订单服务中增加链路追踪了。
最后增加子服务依赖,更新online-edu-order-service/pom.xml。
......
<dependencies>
......
<!-- 链路追踪 Micrometer Tracing -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing-bridge-brave</artifactId>
</dependency>
<dependency>
<groupId>io.zipkin.reporter2</groupId>
<artifactId>zipkin-reporter-brave</artifactId>
</dependency>
</dependencies>
先启动网关服务。
在启动订单服务。
运行接口:

online-edu-order-service: 服务名称
abc123def456: traceId(整个请求链路的唯一标识)
789xyz: spanId(当前操作的标识)
服务器安装Zipkin
因为我装了docker,直接用dorker安装。
docker run -d -p 9411:9411 openzipkin/zipkin
这样只要服务器放开9411端口,就可以直接访问到了。
需要追踪链路的微服务都需要加,网关服务必加。

online-edu-api-gateway/src/main/java/org/online_edu/GatewayApplication.java

需要追踪链路的微服务都需要加,网关服务必加。

