• SpringCloud Sleuth 分布式请求链路追踪


    SpringCloud Sleuth 分布式请求链路追踪

    SpringCloud Sleuth 概念

    1、为什么要使用SpringCloud Sleuth?当前面临什么问题?

    微服务框架中,一个客户端发起的请求在后端系统中会经过多个不同的服务节点调用来协同产生最后的请求结果,每个前端请求都会形成一条复杂的分布式服务调用链路,链路中的任何一环出现高延迟或错误都会引起整个请求最后的失败。Spring Cloud Sleuth为Spring Cloud实现了分布式跟踪解决方案且兼容Zipkin,结合Zipkin做链路跟踪。Spring Cloud Sleuth服务链路跟踪功能可以帮助我们快速的发现错误根源以及监控分析每条请求链路上的性能。

    2、SpringCloud Sleuth 是什么?

    (1)SpringCloud Sleuth 是一套提供了完整的服务追踪的解决方案,在分布式系统中提供追踪解决方案并且兼容支持 zipkin
    (2)ZipkinZipkin是一个分布式跟踪系统。 它有助于收集解决服务体系结构中的延迟问题所需的时序数据。 功能包括该数据的收集和查找。Zipkin最初是为了在Cassandra上存储数据而构建的,因为Cassandra是可扩展的,具有灵活的模式,并且在Twitter中大量使用。 除了支持Cassandra,还支持ElasticSearch和MySQL。如果日志文件中有跟踪ID,则可以直接跳至该跟踪ID。 还可以基于属性进行查询,例如服务,操作名称,标签和持续时间,服务中花费的时间百分比以及操作是否失败。

    3、解决问题:通过 zipkin 监控、追踪并记录请求调用经过的各个服务节点。

    搭建分布式请求链路

    一、Zipkin 的下载安装和概念
    1、下载 zipkin: https://repo1.maven.org/maven2/io/zipkin/zipkin-server/2.14.1/zipkin-server-2.14.1-exec.jar
    值得注意的是,SpringCloud 从 F 版起就已不需要自己构建 Zipkin Server 了,只需要调用 jar 包即可。

    2、运行下载好的 jar 包:java -jar zipkin-server-2.14.1-exec.jar
    在这里插入图片描述
    3、访问:http://127.0.0.1:9411
    在这里插入图片描述
    4、完整的调用链路图:表示一请求链路,一条链路通过 Trace Id 唯一标识Span表示发起的请求信息,各个 Span 通过 parent id关联起来。

    (1)完整的调用链路图(原理图)
    在这里插入图片描述
    Trace:类似树结构的 Span 集合,表示一个调用链路存在的唯一标识。
    Span:表示调用链路的来源,可以理解成每个一次请求或响应。

    (2)简化后如下图所示:
    在这里插入图片描述
    (3)整个链路的依赖关系如下:
    +

    二、服务提供者
    1、修改 cloud-cloud-provider-ek-payment8001(cloud-provider-ek-payment8002)负载均衡服务提供者。
    2、引入 pom 文件

    
    
         org.springframework.cloud
         spring-cloud-starter-zipkin
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3、修改 yml 配置文件

    server:
      port: 8001
    
    
    spring:
      application:
        name: cloud-payment-service
      datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: org.gjt.mm.mysql.Driver
        url: jdbc:mysql://localhost:3306/db2021?useUnicode=true&characterEncoding=utf-8&useSSL=false
        username: root
        password: 123456
    
      # Sleuth zipkin配置
      zipkin:
        base-url: http://localhost:9411
      sleuth:
        sampler:
          # 采样率值介于 0 到 1 之间,1 则表示全部采集
          probability: 1
    
    eureka:
      client:
        #表示收将自己注册到EurekaServer,默认为true
        register-with-eureka: true
        #是否从EurekaServer抓取已有的注册信息,默认为true,单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
        fetchRegistry: true
        service-url:
    		#defaultZone: http://localhost:7001/eureka  #单机版
            defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka  #集群版
      instance:
        instance-id: payment8001
        #访问路径可以显示IP地址
        prefer-ip-address: true
        #eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认为30秒)
        lease-renewal-interval-in-seconds: 1
        #eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认为90秒),超时将删除服务
        lease-expiration-duration-in-seconds: 2
    
    mybatis:
      mapperLocations: classpath:mapper/*.xml
      type-aliases-package: springcloud.atguigu.springcloud.entities #所有entity别名所在的包
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    4、controller

    @RestController
    @Slf4j
    public class PaymentController {
        //SpringCloud Sleuth、Zipkin 请求链路跟踪测试
        @GetMapping(value = "/payment/zipkin")
        public String paymentZipkin() {
            return "服务:" + serverPort + "--》 Zipkin 请求链路跟踪测试";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    三、服务消费者
    1、修改cloud-consumer-ek-order80服务消费者
    2、引入 pom 依赖

    
    
         org.springframework.cloud
         spring-cloud-starter-zipkin
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3、修改 yml 配置文件

    server:
      port: 8002
    
    
    spring:
      application:
        name: cloud-payment-service
      datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: org.gjt.mm.mysql.Driver
        url: jdbc:mysql://localhost:3306/db2021?useUnicode=true&characterEncoding=utf-8&useSSL=false
        username: root
        password: 123456
    
      # Sleuth zipkin配置
      zipkin:
        base-url: http://localhost:9411
      sleuth:
        sampler:
          # 采样率值介于 0 到 1 之间,1 则表示全部采集
          probability: 1
    
    eureka:
      client:
        #表示收将自己注册到EurekaServer,默认为true
        register-with-eureka: true
        #是否从EurekaServer抓取已有的注册信息,默认为true,单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
        fetchRegistry: true
        service-url:
          #      defaultZone: http://localhost:7001/eureka  #单机版
          defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka  #集群版
      instance:
        instance-id: payment8002
        #访问路径可以显示IP地址
        prefer-ip-address: true
        #eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认为30秒)
        lease-renewal-interval-in-seconds: 1
        #eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认为90秒),超时将删除服务
        lease-expiration-duration-in-seconds: 2
    
    mybatis:
      mapperLocations: classpath:mapper/*.xml
      type-aliases-package: springcloud.atguigu.springcloud.entities #所有entity别名所在的包
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    4、controller

    @RestController
    @Slf4j
    public class OrderController {
    
        public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";
        @Resource
        private RestTemplate restTemplate;
        //SpringCloud Sleuth、Zipkin 请求链路跟踪测试
        @GetMapping(value = "/consumer/payment/zipkin")
        public String paymentZipkin() {
            return restTemplate.getForObject(PAYMENT_URL + "/payment/zipkin", String.class);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    四、测试验证
    1、地址栏输入:http://localhost/consumer/payment/zipkin
    2、刷新 Zipkin 监控:http://localhost:9411
    (1)查找: 可以看到微服务数量请求调用深度Span总数
    在这里插入图片描述(1)依赖关系: cloud-order-server 依赖于 cloud-payment-service
    在这里插入图片描述

  • 相关阅读:
    基于5G网关的风力发电远程监测方案优势
    【LVGL】组件的样式的设置、更改、删除API函数
    计算机基础(一):面向CPU编程
    Linux进程概念和控制(必备知识)
    基于JAVA婚纱租赁系统的设计与实现
    Lottie 动画导出为 GIF/MP4 以及与 QML 集成演示
    Linux内核分析(十六)--内存管理之管理机制
    Spark SQL简介
    香港服务器在国内访问太慢怎么能提高?
    神经网络物联网未来现状和趋势及看法
  • 原文地址:https://blog.csdn.net/m0_67265464/article/details/126597155