【SpringCloud】7.0 链路追踪Zipkin+Sleuth

微服务请求存在的问题

微服务跳来跳去,追踪难,排查难
微服务调⽤链路出现了问题怎么快速排查
微服务调⽤链路耗时⻓怎么定位是哪个服务

链路追踪系统解决的问题

分布式应⽤架构虽然满⾜了应⽤横向扩展的需求,但是运维和诊断的过程变得越来越复杂,例如会遇到接⼝诊
断困难、应⽤性能诊断复杂、架构分析复杂等难题,传统的监控⼯具并⽆法满⾜,分布式链路系统由此诞⽣
核⼼:将⼀次请求分布式调⽤,使⽤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>

先启动网关服务。
在启动订单服务。

运行接口:


image.png
online-edu-order-service: 服务名称
abc123def456: traceId(整个请求链路的唯一标识)
789xyz: spanId(当前操作的标识)

服务器安装Zipkin

因为我装了docker,直接用dorker安装。

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

这样只要服务器放开9411端口,就可以直接访问到了。
需要追踪链路的微服务都需要加,网关服务必加。


image.png

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


image.png

需要追踪链路的微服务都需要加,网关服务必加。
image.png
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容