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)Zipkin:Zipkin是一个分布式跟踪系统。 它有助于收集解决服务体系结构中的延迟问题所需的时序数据。 功能包括该数据的收集和查找。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 文件

<!--包含了sleuth+zipkin-->
<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

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别名所在的包

4、controller

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

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

<!--包含了sleuth+zipkin-->
<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

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别名所在的包

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

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐