You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

8.4 KiB

SpringCloud Sleuth + Zipkin 概览

认识 SpringCloud sleuth

  • SpringCloud Sleuth 实现的功能是:它会自动为当前应用构建起各通信通道的跟踪机制
    • 通过诸如 RabbitMQ、Kafka(或者其他任何 SpringCloud Stream 绑定器实现的消息中间件)传递的请求
    • 通过 Zuul、Gateway 代理传递的请求
    • 通过 RestTemplate 发起的请求

Service A -Rest[FLAG]-> ServiceB -Kafka[FLAG]-> Service D (服务与服务之间的时间消耗)
-Rest[FLAG]-> Service C


  • SpringCloud Sleuth 跟踪实现原理
    • 为了实现请求跟踪:当请求发送到分布式系统的入口端点时,只需要服务跟踪框架为该请求创建一个唯一的跟踪标识,Trace ID
    • 为了统计各处理单元的时间延迟,当请求到达各个服务组件时,或是处理逻辑到达某个状态时,也通过一个唯一标识来标记它的开始、具体过程以及结束,Span ID

Service A[traceld, spanldA] -> Service B[traceld, spanldA1] -> Service D[traceld, spanldA11]
-> Service C[traceld,spanldA2]


  • Zipkin 的基础概念
    • Zipkin 解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现
    • Zipkin 有四大核心组件构成:
      • Collector:收集器组件
      • Storage:存储组件
      • API: RESTFUAPI提供外部访问接口
      • U:Web Ul,提供可视化査询页面
  • Zipkin流程图.png

  • Zipkin Web UI 预览
    • 链路追踪与服务依赖 Zipkin 展示预览
    • ZipkinWebUI.png

集成 SpringCloud Sleuth 实现微服务通信跟踪

  • 集成 SpringCloud Sleuth 的步骤

    • 第一原则:保证你的微服务存在跨进程通信,否则,意义不大(完全可以通过更简单的方式实现)
    • 在 pom.xml中添加依赖配置
      • 注意日志中的输出变化
  • 代码中调用方法的打印是 10 进制的, Sleuth 打印是 16进制的打印

  • PS: 命令行退出 mysql \q

  • echo 'ibase=10,obase=16;xxxxxxxxxxx' | bc


搭建 Zipkin Server 实现对跟踪信息的收集

  • 搭建 Zipkin Server 的步骤
    • Tips:SpringCloud Finchley 版本(包含)之后,官方不建议自己搭建 Zipkin-Server, 提供了已经打包好的jar 文件(SpringBoot工程),直接下载启动即可
    • 下载地址:curl -sSL https://zipkin.io/quickstart.sh | bash -s
      • 选择自己需要的版本,我的是 zipkin-server-2.21.7-exec.jar
      • 选择 exec.jar 结尾的 jar

  • 启动命令: nohup java -jar zipkin-server-2.21.7-exec.jar --server.port=8888 &


  • 启动命令
    • java -jar zipkin-server-2.21.7-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSOL_USER=root --MYSQL_PASS=root --MYSQL_DB=by_zipkin

SpringCloud Sleuth 整合 Zipkin 实现分布式链路跟踪、收集

  • SpringCloud Sleuth 整合 Zipkin 的步骤
    • 简单的两个步骤(Zipkin Server 使用 MySQL 实现跟踪数据持久化)
    • pom 文件中添加依赖
<!-- zipkin = spring-cloud-starter-sleuth + spring-cloud-sleuth-zipkin-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
  • bootstrap 中增加 Zipkin 的配置
   kafka:
     bootstrap-servers: 127.0.0.1:9092
     producer:
       retries: 3
     consumer:
       auto-offset-reset: latest
   sleuth:
     sampler:
       # ProbabilityBasedSampler 抽样策略
       probability: 1.0  # 采样比例, 1.0 表示 100%, 默认是 0.1
       # RateLimitingSampler 抽样策略, 设置了限速采集, spring.sleuth.sampler.probability 属性值无效
       rate: 100  # 每秒间隔接受的 trace 量
   zipkin:
     sender:
       type: kafka # 默认是 web
     base-url: http://localhost:9411/

  • 下载、安装 Kafka 配置跟踪数据传输

  • 启动内置 zk

Kafka_2.13-2.7.0 bin/zookeeper-server-start.sh config/zookeeper.properties
  • 启动 kafka
kafka_2.13-2.7.0 bin/kafka-server-start.sh config/server.properties
  • 启动 zipkin
zipkin java -DKAFKA_BOOTSTRAP_SERVERS=127.0.0.1:9092 -jar zipkin-server-2.21.7-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_USER=root --MYSQL_PASS=root --MYSQL_DB=imooc_zipkin

SpringCloud Sleuth 设置采样率、抽样收集策略

  • SpringCloud Sleuth 采样收集

    • 收集跟踪信息是一把双刃剑,需要做好权衡
      • 收集的跟踪信息越多,越能反映出系统的实际运行情况
      • 高并发场景下,大量的请求调用会产生海量的跟踪日志信息,性能开销太大
    • Sleuth --(Kafka[策略True])--> Zipkin
  • 可以自由选择 Zipkin brave 自带的两个抽样策略

    • ProbabilityBasedSampler 采样率策略
      • 默认使用的策略, 以请求百分比的方式配置和收集跟踪信息: 它的默认值为 0.1,代表收集 10% 的请求跟踪信息
      • spring.sleuth.samplerprobability=0.5
    • RateLimitingSampler 抽样策略
      • 限速采集,也就是说它可以用来限制每秒追踪请求的最大数量,优先级更高
      • spring.sleuth.sampler.rate=10
  • 开发环境下,配置尽可能高的采样率, 方便解决问题和性能瓶颈等的尽早发现

  • 线上环境采样率不宜过高


  sleuth:
    sampler:
      # ProbabilityBasedSampler 抽样策略
      probability: 1.0  # 采样比例, 1.0 表示 100%, 默认是 0.1
      # RateLimitingSampler 抽样策略, 设置了限速采集, spring.sleuth.sampler.probability 属性值无效
      rate: 100  # 每秒间隔接受的 trace 量
  • 使用代码的方式 [SamplerConfig.java]
  • PS: 代码和配置文件: 只使用一种方式即可
  • PS: 采样策略也使用一个即可, 通常只使用限速采集

SpringCloud Sleuth + Zipkin 分布式日志追踪总结

  • SpringCloud sleuth + Zipkin 逻辑架构
    • 跟踪、收集所涉及到的三个组件(模块) Sleuth、Zipkin、Brave
    • 三个组件之间的关系
      • Brave 是一个 tracer 库,提供的是 tracer 接囗
      • Sleuth 采用了 Brave 作为 tracer库
      • Sleuth可以不使用 Zipkin
  • SpringCloudsleuthZipkin逻辑架构.png

  • Brave 解读
    • Brave 的两个最基本、也是最核心的概念
      • trace: 以看作是一个逻辑执行过程中的整个链条
      • span:是 trace 跟踪的基本单位
void order(){
    GoodsService();
    AccountService();
}

void Accountservice(){
    DeductBalance();
}
        Span: Order                 _
        /        \                   |
     Child      Child                |
     /             \                 |
 Span: Goods      Span: Account      Trace
                    |                |  
                   Child             |
                    |                |
                  Span: Deduct      -

  • Brave 中常用的数据结构及其说明
    • Tracing:工具类,用于生成 Tracer 类实例
    • Tracer :也是工具类,用于生成 Span
    • Span:实际记录每个功能块执行信息的类
    • TraceContext :记录 trace 的执行过程中的元数据信息类
    • Propagation :用于在分布式环境或者跨进程条件下的trace 跟踪时实现 TraceContext 传递的工具类
  • Brave中常用的数据结构及其说明.png

  • SpringCloud Sleuth 实现跨服务 Trace 追踪
    • SpringCloud Sleuth 和 Brave 提供了很多不同的分布式框架的支持,例如 qRPC、Kafka、HTTP 等
    • Brave 实现跨服务(或者跨线程)Trace追踪的核心是通过 TraceContext 中核心信息的传递来实现的
    • 样例:Brave 针对 HTTP 服务进行Context 传递的标准流程
    • 实现跨服务Trace追踪.png