目录

SpringCloudSleuthMicrometerZipKin分布式链路追踪

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

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

(1)Sleuth 官宣,改头换面

(2)Sleuth 未来替换方案

Micrometer Tracing

二、分布式链路追踪概述

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

在微服务框架中,

一个由客户端发起的请求在后端系统中会经过 多个不同的的服务节点 调用来 协同 产生最后的请求结果

,每一个前段请求都会形成一条复杂的

分布式服务调用链路

,链路中的

任何一环出现 高延时错误 都会引起整个请求最后的失败 https://i-blog.csdnimg.cn/direct/b9fa4621d32a48d48106a5ca1a5c384e.png

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

https://i-blog.csdnimg.cn/direct/06c9c2861a2d45ceb6e8d3dbe1f4fd5d.png

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

  1. 在分布式与微服务场景下, 我们需要解决如下问题

    1. 在大规模分布式与微服务集群下,如何实时观测 系统的整体调用链路情况
    2. 在大规模分布式与微服务集群下,如何 快速发现并定位到问题
    3. 在大规模分布式与微服务集群下,如何尽可能精确的判断 故障对系统的影响范围与影响程度
    4. 在大规模分布式与微服务集群下,如何尽可能精确的梳理出 服务之间的依赖关系 ,并判断出服务之间的依赖关系是否合理
    5. 在大规模分布式与微服务集群下,如何尽可能精确的分析 整个系统调用链路的性能与瓶颈点
    6. 在大规模分布式与微服务集群下,如何尽可能精确的分析 系统的存储瓶颈与容量规划
  2. 上述问题就是我们的落地议题答案:分布式链路追踪技术要解决的问题,分布式链路追踪(Distributed Tracing),就是

    将一次分布式请求还原成调用链路,进行日志记录,性能监控并将一次分布式请求的调用情况集中展示 。比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等

三、新一代 Spring Cloud Sleuth:Micrometer

(1)(官网重要提示)

3.1.1新一代 Sleuth

  1. sleuth 被 micrometer 替代 https://i-blog.csdnimg.cn/direct/77a49b34ad2c48f29930dea22d292ceb.png

3.1.2官网

  1. github:

3.1.3说明

  1. 老项目还能用 Sleuth 开发吗 https://i-blog.csdnimg.cn/direct/e482eb4552884d0dbba21bf744890aa5.png
  2. 版本注意 https://i-blog.csdnimg.cn/direct/33b3c50669b04e938c92d15dd86b635d.png

(2)zipkin 那?

Spring Cloud Sleuth (

micrometer

) 提供

了一套完整的分布式链路追踪(Distributed Tracing)解决方案且兼容支持了

zipkin 展现 https://i-blog.csdnimg.cn/direct/4cc26a5fac0d46cfa7ed20639c2dbda2.png https://i-blog.csdnimg.cn/direct/cf8640a2f14c4c7890f79e378b51dfa9.png

(3)小总结

将一次分布式请求还原成调用链路,进行日志记录和性能监控,并将一次分布式请求的调用情况集中 web 展示 https://i-blog.csdnimg.cn/direct/40dec6742c034ef8ae6de775befd59c2.png

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

https://i-blog.csdnimg.cn/direct/954f832166544b5ea30e3afdad3b4891.png

四、分布式链路追踪原理

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

https://i-blog.csdnimg.cn/direct/d1ebfde13ca14b78ad0fad56c8cae05c.png

假定三个微服务调用的链路如下图所示: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就是一次请求信息) https://i-blog.csdnimg.cn/direct/87ea2a4652b345de96c8101838e33601.png https://i-blog.csdnimg.cn/direct/a1f2d71f05ed49ac8539a6b750f96a45.png

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

  1. 一条链路通过Trace Id唯一标识,Span标识发起的请求信息,各span通过parent id 关联起来 https://i-blog.csdnimg.cn/direct/bd1fd6c2ce40485c88a38ad90ad77532.png
  2. 解读: https://i-blog.csdnimg.cn/direct/34e1a2918cff45fbaaaf6fd1dcb6ef66.png

五、Zipkin

(1)官网

(2)是什么

Zipkin 是 Twitter 开源的分布式链路跟踪工具,用于 收集

微服务运行中的实时调用链路

信息

通过 Web 图形化界面展示

,助力开发人员分析链路性能瓶颈、定位问题应用,进而解决问题

(3)Zipkin 为什么出现?

单有 Sleuth (Micrometer) 行不行? https://i-blog.csdnimg.cn/direct/9d7c59809e124fddb0a5760a823a3e73.png

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

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

5.4.1下载主页

  1. 支持三个方式: https://i-blog.csdnimg.cn/direct/52843acbd9d7417bb54cd0341fbcebe0.png

5.4.2下载地址

https://i-blog.csdnimg.cn/direct/0a99f1c630854fab9a7326ea90c8a9ff.png

  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

https://i-blog.csdnimg.cn/direct/28ca9a8914fc4800b8be896a0a214ad0.png https://i-blog.csdnimg.cn/direct/bb51c53c742a4648a4e1eb1b7963ce0e.png

5.4.4运行控制台

https://i-blog.csdnimg.cn/direct/d1000c64658f4122b6c58f1c6182b3c0.png

六、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>

    https://i-blog.csdnimg.cn/direct/923d53154ab443d2a4999f26ed94c4fc.png https://i-blog.csdnimg.cn/direct/1dc76e76051f45dfbb6a8a6282d7742c.png https://i-blog.csdnimg.cn/direct/4dee3b535b8b43e89ea998a2d483b043.png

  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 https://i-blog.csdnimg.cn/direct/98d837d9fb4048978d3daef073a25196.png https://i-blog.csdnimg.cn/direct/42edb2c92304499ca4c27de0e9957fc1.png

  4. 新建业务类PayMicrometerController https://i-blog.csdnimg.cn/direct/3a0904aacbe246f58035cba1237c5fda.png

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 https://i-blog.csdnimg.cn/direct/627220082d824124b73416d9fccbe0c8.png

  4. 新建业务类 OrderMicrometerController https://i-blog.csdnimg.cn/direct/4d4336759d404a049f95636892e5a734.png

(3)测试

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

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

https://i-blog.csdnimg.cn/direct/40a3ae7cbd0c4601a2ed1ce0de8beda3.png

6.2.3测试地址

https://i-blog.csdnimg.cn/direct/425ccfb68b9f400c87c5548c06530511.png

6.2.4打开浏览器访问

  1. 会出现以下界面: https://i-blog.csdnimg.cn/direct/34102d47239749c0949378d60fd934f4.png
  2. 点击SHOW按钮查看 https://i-blog.csdnimg.cn/direct/470ef99751ad4b5a83f3432576167896.png
  3. 查看依赖关系: https://i-blog.csdnimg.cn/direct/d4eeffe016f1470280c4a0e84bbf57df.png