SpringCloud Sleuth分布式链路请求跟踪

时间:2022-09-19 01:05:22


????个人主页:不断前进的皮卡丘
????博客描述:梦想也许遥不可及,但重要的是追梦的过程,用博客记录自己的成长,记录自己一步一步向上攀登的印记
????个人专栏:微服务专栏

基本介绍

分布式链路追踪之Spring Cloud Sleuth+Zipkin最全教程!

为什么需要使用Sleuth

随着我们的系统越来越庞大,各个服务间的调用关系也变得越来越复杂。当客户端发起一个请求时,这个请求经过多个服务后,最终返回了结果,经过的每一个服务都有可能发生延迟或错误,从而导致请求失败。这时候我们就需要请求链路跟踪工具来帮助我们,理清请求调用的服务链路,解决问题。
SpringCloud Sleuth分布式链路请求跟踪

Sleuth基本介绍

pring Cloud Sleuth提供了一套完整的服务跟踪的解决方案
在分布式系统中提供追踪解决方案并且兼容支持了zipkin(负责展现)
https://github.com/spring-cloud/spring-cloud-sleuth
SpringCloud Sleuth分布式链路请求跟踪

https://cloud.spring.io/spring-cloud-sleuth/reference/html/
SpringCloud Sleuth分布式链路请求跟踪

SpringCloud Sleuth分布式链路请求跟踪

Spring Cloud Sleuth实现了一种分布式的服务链路跟踪解决方案,通过使用Sleuth可以让我们快速定位某个服务的问题。简单来说,Sleuth相当于调用链监控工具的客户端,集成在各个微服务上,负责产生调用链监控数据。
Spring Cloud Sleuth只负责产生监控数据,通过日志的方式展示出来,并没有提供可视化的UI界面。
学习Sleuth之前必须了解它的几个概念:

  • Span:基本的工作单元,相当于链表中的一个节点,通过一个唯一ID标记它的开始、具体过程和结束。我们可以通过其中存储的开始和结束的时间戳来统计服务调用的耗时。除此之外还可以获取事件的名称、请求信息等。
  • Trace:一系列的Span串联形成的一个树状结构,当请求到达系统的入口时就会创建一个唯一ID(traceId),唯一标识一条链路。这个traceId始终在服务之间传递,直到请求的返回,那么就可以使用这个traceId将整个请求串联起来,形成一条完整的链路。
  • Annotation:一些核心注解用来标注微服务调用之间的事件,重要的几个注解如下:
    • cs(Client Send):客户端发出请求,开始一个请求的生命周期
    • sr(Server Received):服务端接受请求并处理;sr-cs = 网络延迟 = 服务调用的时间
    • ss(Server Send):服务端处理完毕准备发送到客户端;ss - sr = 服务器上的请求处理时间
    • cr(Client Reveived):客户端接受到服务端的响应,请求结束; cr - sr = 请求的总时间

完整的调用链路
表示一请求链路,一条链路通过Trace Id唯一标识,Span标识发起的请求信息,各span通过parent id 关联起来。

SpringCloud Sleuth分布式链路请求跟踪

上图what
一条链路通过Trace Id唯一标识,Span标识发起的请求信息,各span通过parent id 关联起来。
SpringCloud Sleuth分布式链路请求跟踪

整个链路的依赖关系如下:
SpringCloud Sleuth分布式链路请求跟踪

名词解释
Trace:类似于树结构的Span集合,表示一条调用链路,存在唯一标识
span:表示调用链路来源,通俗的理解span就是一次请求信息

zipkin

基本介绍

Zipkin是 Twitter 的一个开源项目,基于 Google Dapper实现。可以使用它来收集各个服务器上请求链路的跟踪数据,并通过它提供的 REST API 接口来辅助我们查询跟踪数据以实现对分布式系统的监控程序,从而及时地发现系统中出现的延迟升高问题并找出系统性能瓶颈的根源。除了面向开发的API接口之外,它也提供了方便的 UI 组件帮助我们直观的搜索跟踪信息和分析请求链路明细,比如:可以查询某段时间内各用户请求的处理时间等。
SpringCloud Sleuth分布式链路请求跟踪
zipkin架构介绍

zipkin服务端搭建

启动zipkin

首先需要下载服务端的jar包,地址:https://search.maven.org/artifact/io.zipkin/zipkin-server/2.23.4/jar
SpringCloud Sleuth分布式链路请求跟踪

SpringCloud Sleuth分布式链路请求跟踪

下载完成将会得到对应的jar包,如下图:
SpringCloud Sleuth分布式链路请求跟踪
SpringCloud从F版起已不需要自己构建Zipkin server了,只需要调用jar包即可
运行jar(在jar包所在目录,输入cmd命令,然后输入下面的命令)

java -jar zipkin-server-2.23.4-exec.jar

出现下面的界面,说明启动完成
SpringCloud Sleuth分布式链路请求跟踪
此时可以访问zipkin的UI界面,http://localhost:9411/zipkin/
SpringCloud Sleuth分布式链路请求跟踪

服务提供者(cloud-provider-payment8001)

修改pom文件

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

yml

server:
  port: 8001

spring:
  application:
    name: cloud-payment-service
  zipkin:
    base-url: http://localhost:9411
  sleuth:
      sampler:
        #采样率值介于0~1之间,1表示全部采样
        probability: 1
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/cloud2022?serverTimezone=Asia/Shanghai&useSSL=true&useUnicode=true&characterEncoding=UTF-8
    username: root
    password: a87684009.

mybatis:
  mapperLocations: classpath:/mapper/*.xml
  type-aliases-package: com.zyh.springcloud.entities

eureka:
  client:
    register-with-eureka: true
    fetchRegistry: true
    service-url:
      defaultZone: http://localhost:7001/eureka

Controller( PaymentController )

 @GetMapping("/payment/zipkin")
    public String paymentZipkin(){
        return "hi ,I'm paymentzipkin server,welcome to 皮卡丘,O(∩_∩)O哈哈~";
    }

服务消费者(cloud-consumer-order80)

pom文件

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

yml

server:
  port: 80
spring:
  application:
    name: cloud-consumer-order80
  zipkin:
    base-url: http://localhost:9411
  sleuth:
      sampler:
        probability: 1

eureka:
  client:
    register-with-eureka: true
    fetchRegistry: true
    service-url:
      defaultZone: http://localhost:7001/eureka

业务类OrderController

 //==> zipkin+sleuth
    @GetMapping("/consumer/payment/zipkin")
    public String paymentZipkin(){
        String result = restTemplate.getForObject(PATH+"/payment/zipkin/", String.class);
        return result;
    }

测试

依次启动eureka7001/8001/80
测试(可以多刷新页面几次)
SpringCloud Sleuth分布式链路请求跟踪
SpringCloud Sleuth分布式链路请求跟踪