SpringCloud——Sleuth(Micrometer)+ZipKin分布式链路追踪

一、Sleuth 目前也进入维护模式

(1)Sleuth 官宣,改头换面

(2)Sleuth 未来替换方案

Micrometer Tracing

二、分布式链路追踪概述

(1)为什么会出现这个技术?需要解决哪些问题?

在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的的服务节点调用来协同产生最后的请求结果,每一个前段请求都会形成一条复杂的分布式服务调用链路,链路中的任何一环出现高延时错误都会引起整个请求最后的失败

(2)随着问题的复杂化 + 微服务的增多 + 调用链条的变长

(3)在分布式与微服务场景下需要解决的问题

  1. 在分布式与微服务场景下,我们需要解决如下问题
    1. 在大规模分布式与微服务集群下,如何实时观测系统的整体调用链路情况
    2. 在大规模分布式与微服务集群下,如何快速发现并定位到问题
    3. 在大规模分布式与微服务集群下,如何尽可能精确的判断故障对系统的影响范围与影响程度
    4. 在大规模分布式与微服务集群下,如何尽可能精确的梳理出服务之间的依赖关系,并判断出服务之间的依赖关系是否合理
    5. 在大规模分布式与微服务集群下,如何尽可能精确的分析整个系统调用链路的性能与瓶颈点
    6. 在大规模分布式与微服务集群下,如何尽可能精确的分析系统的存储瓶颈与容量规划
  2. 上述问题就是我们的落地议题答案:分布式链路追踪技术要解决的问题,分布式链路追踪(Distributed Tracing),就是将一次分布式请求还原成调用链路,进行日志记录,性能监控并将一次分布式请求的调用情况集中展示。比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等

三、新一代 Spring Cloud Sleuth:Micrometer

(1)(官网重要提示)

3.1.1新一代 Sleuth

  1. sleuth 被 micrometer 替代
  2. https://micrometer.io/docs/tracing

3.1.2官网

  1. Spring Cloud Sleuth
  2. github:https://github.com/spring-cloud/spring-cloud-sleuth

3.1.3说明

  1. 老项目还能用 Sleuth 开发吗
  2. 版本注意

    (2)zipkin 那?

    Spring Cloud Sleuth (micrometer) 提供了一套完整的分布式链路追踪(Distributed Tracing)解决方案且兼容支持了 zipkin 展现

    (3)小总结

    将一次分布式请求还原成调用链路,进行日志记录和性能监控,并将一次分布式请求的调用情况集中 web 展示

    (4)行业内比较成熟的其它分布式链路追踪技术解决方案

    四、分布式链路追踪原理

    (1)假定 3 个微服务调用的链路

    假定三个微服务调用的链路如下图所示:Service 1 调用 Service 2,Service 2 调用 Service 3 和 Service 4

    (2)上一步完整的调用链路

    1. 那么一条链路追踪会在每个服务调用的时候加上Trace ID 和 Span ID
    2. 链路通过TraceId唯一标识
    3. Span标识发起的请求信息,各span通过parent id 关联起来(Span:表示调用链路来源,通俗的理解span就是一次请求信息)

    (3)彻底把链路追踪整明白

    1. 一条链路通过Trace Id唯一标识,Span标识发起的请求信息,各span通过parent id 关联起来
    2. 解读:

    五、Zipkin

    (1)官网

    OpenZipkin · A distributed tracing system

    (2)是什么

    Zipkin 是 Twitter 开源的分布式链路跟踪工具,用于收集微服务运行中的实时调用链路信息通过 Web 图形化界面展示,助力开发人员分析链路性能瓶颈、定位问题应用,进而解决问题

    (3)Zipkin 为什么出现?

    单有 Sleuth (Micrometer) 行不行?

    1. 说明:当没有配置 Sleuth 链路追踪的时候,INFO 信息里面是 [passjava-question,,,],后面跟着三个空字符串
    2. 当配置了 Sleuth 链路追踪的时候,追踪到的信息是 [passjava-question,504a5360ca906016,e55ff064b3941956,false] ,第一个是 Trace ID,第二个是 Span ID。只有日志没有图,观看不方便,不美观,so,引入图形化Zipkin链路监控让你好看

    (4)下载 + 安装 + 运行一套带走

    5.4.1下载主页

    1. Quickstart · OpenZipkin
    2. 支持三个方式:

    5.4.2下载地址

    1. 点击latest release即可下载
    2. zipkin-server-3.5.0-rc0-exec.jar

    5.4.3运行jar

    java -jar zipkin-server-3.5.0-exec.jar

    5.4.4运行控制台

    http://localhost:9411/zipkin/

    六、Micrometer+ZipKin 搭建链路监控案例步骤

    (1)Micrometer+ZipKin 两者各自的分工

    1. Micrometer:数据采样
    2. ZipKin:图形展示

    (2)步骤

    6.2.1总体父工程 POM

    1. 本案例:
      <!--micrometer-tracing-bom导入链路追踪版本中心  1-->
      <dependency>
          <groupId>io.micrometer</groupId>
          <artifactId>micrometer-tracing-bom</artifactId>
          <version>${micrometer-tracing.version}</version>
          <type>pom</type>
          <scope>import</scope>
      </dependency>
      <!--micrometer-tracing指标追踪  2-->
      <dependency>
          <groupId>io.micrometer</groupId>
          <artifactId>micrometer-tracing</artifactId>
          <version>${micrometer-tracing.version}</version>
      </dependency>
      <!--micrometer-tracing-bridge-brave适配zipkin的桥接包 3-->
      <dependency>
          <groupId>io.micrometer</groupId>
          <artifactId>micrometer-tracing-bridge-brave</artifactId>
          <version>${micrometer-tracing.version}</version>
      </dependency>
      <!--micrometer-observation 4-->
      <dependency>
          <groupId>io.micrometer</groupId>
          <artifactId>micrometer-observation</artifactId>
          <version>${micrometer-observation.version}</version>
      </dependency>
      <!--feign-micrometer 5-->
      <dependency>
          <groupId>io.github.openfeign</groupId>
          <artifactId>feign-micrometer</artifactId>
          <version>${feign-micrometer.version}</version>
      </dependency>
      <!--zipkin-reporter-brave 6-->
      <dependency>
          <groupId>io.zipkin.reporter2</groupId>
          <artifactId>zipkin-reporter-brave</artifactId>
          <version>${zipkin-reporter-brave.version}</version>
      </dependency>

    2. all:
      <?xml version="1.0" encoding="UTF-8"?>
      <project xmlns="http://maven.apache.org/POM/4.0.0"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
      
          <groupId>com.atguigu.cloud</groupId>
          <artifactId>mscloudV6</artifactId>
          <version>1.0-SNAPSHOT</version>
          <packaging>pom</packaging>
          <modules>
              <module>cloud-provider-payment8001</module>
              <module>cloud-consumer-order80</module>
              <module>cloud-api-commons</module>
              <module>cloud-provider-payment8002</module>
              <module>cloud-consumer-feign-order80</module>
          </modules>
      
          <properties>
              <maven.compiler.source>17</maven.compiler.source>
              <maven.compiler.target>17</maven.compiler.target>
              <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
              <hutool.version>5.8.22</hutool.version>
              <lombok.version>1.18.26</lombok.version>
              <druid.version>1.1.20</druid.version>
              <mybatis.springboot.version>3.0.2</mybatis.springboot.version>
              <mysql.version>8.0.11</mysql.version>
              <swagger3.version>2.2.0</swagger3.version>
              <mapper.version>4.2.3</mapper.version>
              <fastjson2.version>2.0.41</fastjson2.version>
              <persistence-api.version>1.0.2</persistence-api.version>
              <spring.boot.test.version>3.1.5</spring.boot.test.version>
              <spring.boot.version>3.2.0</spring.boot.version>
              <spring.cloud.version>2023.0.0</spring.cloud.version>
              <spring.cloud.alibaba.version>2022.0.0.0-RC2</spring.cloud.alibaba.version>
              <micrometer-tracing.version>1.2.0</micrometer-tracing.version>
              <micrometer-observation.version>1.12.0</micrometer-observation.version>
              <feign-micrometer.version>12.5</feign-micrometer.version>
              <zipkin-reporter-brave.version>2.17.0</zipkin-reporter-brave.version>
          </properties>
      
          <dependencyManagement>
              <dependencies>
                  <!--springboot 3.2.0-->
                  <dependency>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-starter-parent</artifactId>
                      <version>${spring.boot.version}</version>
                      <type>pom</type>
                      <scope>import</scope>
                  </dependency>
                  <!--springcloud 2023.0.0-->
                  <dependency>
                      <groupId>org.springframework.cloud</groupId>
                      <artifactId>spring-cloud-dependencies</artifactId>
                      <version>${spring.cloud.version}</version>
                      <type>pom</type>
                      <scope>import</scope>
                  </dependency>
                  <!--springcloud alibaba 2022.0.0.0-RC2-->
                  <dependency>
                      <groupId>com.alibaba.cloud</groupId>
                      <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                      <version>${spring.cloud.alibaba.version}</version>
                      <type>pom</type>
                      <scope>import</scope>
                  </dependency>
                  <!--SpringBoot集成mybatis-->
                  <dependency>
                      <groupId>org.mybatis.spring.boot</groupId>
                      <artifactId>mybatis-spring-boot-starter</artifactId>
                      <version>${mybatis.springboot.version}</version>
                  </dependency>
                  <!--Mysql数据库驱动8 -->
                  <dependency>
                      <groupId>mysql</groupId>
                      <artifactId>mysql-connector-java</artifactId>
                      <version>${mysql.version}</version>
                  </dependency>
                  <!--SpringBoot集成druid连接池-->
                  <dependency>
                      <groupId>com.alibaba</groupId>
                      <artifactId>druid-spring-boot-starter</artifactId>
                      <version>${druid.version}</version>
                  </dependency>
                  <!--通用Mapper4之tk.mybatis-->
                  <dependency>
                      <groupId>tk.mybatis</groupId>
                      <artifactId>mapper</artifactId>
                      <version>${mapper.version}</version>
                  </dependency>
                  <!--persistence-->
                  <dependency>
                      <groupId>javax.persistence</groupId>
                      <artifactId>persistence-api</artifactId>
                      <version>${persistence-api.version}</version>
                  </dependency>
                  <!-- fastjson2 -->
                  <dependency>
                      <groupId>com.alibaba.fastjson2</groupId>
                      <artifactId>fastjson2</artifactId>
                      <version>2.0.40</version>
                  </dependency>
                  <!-- swagger3 调用方式 http://你的主机IP地址:5555/swagger-ui/index.html -->
                  <dependency>
                      <groupId>org.springdoc</groupId>
                      <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
                      <version>${swagger3.version}</version>
                  </dependency>
                  <!--hutool-->
                  <dependency>
                      <groupId>cn.hutool</groupId>
                      <artifactId>hutool-all</artifactId>
                      <version>${hutool.version}</version>
                  </dependency>
                  <!--lombok-->
                  <dependency>
                      <groupId>org.projectlombok</groupId>
                      <artifactId>lombok</artifactId>
                      <version>${lombok.version}</version>
                      <optional>true</optional>
                  </dependency>
                  <!-- spring-boot-starter-test -->
                  <dependency>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-starter-test</artifactId>
                      <version>${spring.boot.test.version}</version>
                      <scope>test</scope>
                  </dependency>
                  <!--micrometer-tracing-bom导入链路追踪版本中心  1-->
                  <dependency>
                      <groupId>io.micrometer</groupId>
                      <artifactId>micrometer-tracing-bom</artifactId>
                      <version>${micrometer-tracing.version}</version>
                      <type>pom</type>
                      <scope>import</scope>
                  </dependency>
                  <!--micrometer-tracing指标追踪  2-->
                  <dependency>
                      <groupId>io.micrometer</groupId>
                      <artifactId>micrometer-tracing</artifactId>
                      <version>${micrometer-tracing.version}</version>
                  </dependency>
                  <!--micrometer-tracing-bridge-brave适配zipkin的桥接包 3-->
                  <dependency>
                      <groupId>io.micrometer</groupId>
                      <artifactId>micrometer-tracing-bridge-brave</artifactId>
                      <version>${micrometer-tracing.version}</version>
                  </dependency>
                  <!--micrometer-observation 4-->
                  <dependency>
                      <groupId>io.micrometer</groupId>
                      <artifactId>micrometer-observation</artifactId>
                      <version>${micrometer-observation.version}</version>
                  </dependency>
                  <!--feign-micrometer 5-->
                  <dependency>
                      <groupId>io.github.openfeign</groupId>
                      <artifactId>feign-micrometer</artifactId>
                      <version>${feign-micrometer.version}</version>
                  </dependency>
                  <!--zipkin-reporter-brave 6-->
                  <dependency>
                      <groupId>io.zipkin.reporter2</groupId>
                      <artifactId>zipkin-reporter-brave</artifactId>
                      <version>${zipkin-reporter-brave.version}</version>
                  </dependency>
      
              </dependencies>
          </dependencyManagement>
      </project>

    6.2.2服务提供者 8001

    1. cloud-provider-payment8001
    2. POM
      <?xml version="1.0" encoding="UTF-8"?>
      <project xmlns="http://maven.apache.org/POM/4.0.0"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
          <parent>
              <groupId>com.atguigu.cloud</groupId>
              <artifactId>mscloudV6</artifactId>
              <version>1.0-SNAPSHOT</version>
          </parent>
      
          <artifactId>cloud-provider-payment8001</artifactId>
      
          <properties>
              <maven.compiler.source>17</maven.compiler.source>
              <maven.compiler.target>17</maven.compiler.target>
              <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
          </properties>
      
      
      
          <dependencies>
              <!--micrometer-tracing指标追踪  1-->
              <dependency>
                  <groupId>io.micrometer</groupId>
                  <artifactId>micrometer-tracing</artifactId>
              </dependency>
              <!--micrometer-tracing-bridge-brave适配zipkin的桥接包 2-->
              <dependency>
                  <groupId>io.micrometer</groupId>
                  <artifactId>micrometer-tracing-bridge-brave</artifactId>
              </dependency>
              <!--micrometer-observation 3-->
              <dependency>
                  <groupId>io.micrometer</groupId>
                  <artifactId>micrometer-observation</artifactId>
              </dependency>
              <!--feign-micrometer 4-->
              <dependency>
                  <groupId>io.github.openfeign</groupId>
                  <artifactId>feign-micrometer</artifactId>
              </dependency>
              <!--zipkin-reporter-brave 5-->
              <dependency>
                  <groupId>io.zipkin.reporter2</groupId>
                  <artifactId>zipkin-reporter-brave</artifactId>
              </dependency>
              <!--SpringCloud consul config-->
              <dependency>
                  <groupId>org.springframework.cloud</groupId>
                  <artifactId>spring-cloud-starter-consul-config</artifactId>
              </dependency>
              <dependency>
                  <groupId>org.springframework.cloud</groupId>
                  <artifactId>spring-cloud-starter-bootstrap</artifactId>
              </dependency>
              <!--SpringCloud consul discovery -->
              <dependency>
                  <groupId>org.springframework.cloud</groupId>
                  <artifactId>spring-cloud-starter-consul-discovery</artifactId>
              </dependency>
              <!-- 引入自己定义的api通用包 -->
              <dependency>
                  <groupId>com.atguigu.cloud</groupId>
                  <artifactId>cloud-api-commons</artifactId>
                  <version>1.0-SNAPSHOT</version>
              </dependency>
              <!--SpringBoot通用依赖模块-->
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-web</artifactId>
              </dependency>
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-actuator</artifactId>
              </dependency>
              <!--SpringBoot集成druid连接池-->
              <dependency>
                  <groupId>com.alibaba</groupId>
                  <artifactId>druid-spring-boot-starter</artifactId>
              </dependency>
              <!-- Swagger3 调用方式 http://你的主机IP地址:5555/swagger-ui/index.html -->
              <dependency>
                  <groupId>org.springdoc</groupId>
                  <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
              </dependency>
              <!--mybatis和springboot整合-->
              <dependency>
                  <groupId>org.mybatis.spring.boot</groupId>
                  <artifactId>mybatis-spring-boot-starter</artifactId>
              </dependency>
              <!--Mysql数据库驱动8 -->
              <dependency>
                  <groupId>mysql</groupId>
                  <artifactId>mysql-connector-java</artifactId>
              </dependency>
              <!--persistence-->
              <dependency>
                  <groupId>javax.persistence</groupId>
                  <artifactId>persistence-api</artifactId>
              </dependency>
              <!--通用Mapper4-->
              <dependency>
                  <groupId>tk.mybatis</groupId>
                  <artifactId>mapper</artifactId>
              </dependency>
              <!--hutool-->
              <dependency>
                  <groupId>cn.hutool</groupId>
                  <artifactId>hutool-all</artifactId>
              </dependency>
              <!-- fastjson2 -->
              <dependency>
                  <groupId>com.alibaba.fastjson2</groupId>
                  <artifactId>fastjson2</artifactId>
              </dependency>
              <!--lombok-->
              <dependency>
                  <groupId>org.projectlombok</groupId>
                  <artifactId>lombok</artifactId>
                  <version>1.18.28</version>
                  <scope>provided</scope>
              </dependency>
              <!--test-->
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-test</artifactId>
                  <scope>test</scope>
              </dependency>
          </dependencies>
      
          <build>
              <plugins>
                  <plugin>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-maven-plugin</artifactId>
                  </plugin>
              </plugins>
          </build>
      
      </project>
    3. YML
    4. 新建业务类PayMicrometerController

    6.2.3Api 接口 PayFeignApi

    6.2.4服务调用者 80

    1. cloud-consumer-feign-order80
    2. POM新增
      <!--micrometer-tracing指标追踪  1-->
          <dependency>
              <groupId>io.micrometer</groupId>
              <artifactId>micrometer-tracing</artifactId>
          </dependency>
          <!--micrometer-tracing-bridge-brave适配zipkin的桥接包 2-->
          <dependency>
              <groupId>io.micrometer</groupId>
              <artifactId>micrometer-tracing-bridge-brave</artifactId>
          </dependency>
          <!--micrometer-observation 3-->
          <dependency>
              <groupId>io.micrometer</groupId>
              <artifactId>micrometer-observation</artifactId>
          </dependency>
          <!--feign-micrometer 4-->
          <dependency>
              <groupId>io.github.openfeign</groupId>
              <artifactId>feign-micrometer</artifactId>
          </dependency>
          <!--zipkin-reporter-brave 5-->
          <dependency>
              <groupId>io.zipkin.reporter2</groupId>
              <artifactId>zipkin-reporter-brave</artifactId>
          </dependency>
    3. YML
    4. 新建业务类 OrderMicrometerController

    (3)测试

    6.2.1本次案例,默认已经成功启动 Zipkin

    6.2.2依次启动 8001/80 两个微服务并注册进入 Consul

    6.2.3测试地址

    6.2.4打开浏览器访问

    1. 会出现以下界面:
    2. 点击SHOW按钮查看
    3. 查看依赖关系:
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值