【Hoxton.SR1版本】Spring Cloud Sleuth分布式请求链路跟踪

目录

一、简介

二、重要概念

三、搭建链路跟踪

四、总结


一、简介

在分布式微服务中,我们通常根据业务模块分服务,由前端发起一个请求,后端可能跨几个服务调用才能完成这个请求(如下图)。如果系统越来越庞大,服务之间的调用与被调用关系就会变得很复杂,调用关系也许如下:

在这里插入图片描述

假如一个请求中需要跨几个服务调用,其中一个服务由于网络延迟等原因挂掉了,那么这时候我们需要分析具体哪一个服务出问题了就会显得很困难。Spring Cloud Sleuth服务链路跟踪功能就可以帮助我们快速的发现错误根源以及监控分析每条请求链路上的性能等等。Spring Cloud Sleuth提供了一套完整的服务跟踪的解决方案,在分布式系统中提供追踪解决方案并且兼容支持了zipkin。

Spring Cloud Sleuth官网学习资料:

https://spring.io/projects/spring-cloud-sleuth

https://docs.spring.io/spring-cloud-sleuth/docs/2.2.5.RELEASE/reference/html/

二、重要概念

【a】Span: 基本的工作单元。Span包括一个64位的唯一ID,一个64位trace码,描述信息,时间戳事件,key-value 注解(tags),span处理者的ID(通常为IP)。

【b】Trace: 包含一系列的工作单元span,它们组成了一个树型结构。

【c】Annotation 
用于及时记录存在的事件。常用的Annotation如下:

  • cs:客户端发送(client send) 客户端发起一个请求,表示span开始;
  • sr:服务器接收(server received) 服务器接收到客户端的请求并开始处理,sr - cs 的时间为网络延迟;
  • ss:服务器发送(server send)  服务器处理完请求准备返回数据给客户端。ss - sr 的时间表示服务器端处理请求花费的时间;
  • cr:客户端接收(client received) 客户端接收到处理结果,表示span结束。 cr - cs 的时间表示客户端接收服务端数据的时间;

将Span和Trace在一个系统中使用Zipkin注解的过程图形化:

在这里插入图片描述

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

三、搭建链路跟踪

Spring Cloud Hoxton新版本已经不推荐自己手动搭建zipkin-server监控平台,而是提供了可执行 jar java -jar xxx.jar运行第三方zipkin的jar包来搭建zipkin服务端。首先我们需要下载响应的jar包,下载地址如下:

https://dl.bintray.com/openzipkin/maven/io/zipkin/java/zipkin-server/

选择exec.jar结尾的jar下载即可,笔者已经将此jar包放于博客资源处,有需要的小伙伴们可以自行下载:

https://download.csdn.net/download/Weixiaohuai/12774550

我们使用如下命令启动zipkin-server:

java -jar zipkin-server-2.12.9-exec.jar

 如果看到类似上图的运行结果,说明我们的zipkin-server已经搭建成功, zipkin-serve提供了可视化的运行控制台:http://localhost:9411/zipkin/

下面我们基于前面构建的【springcloud-provider-payment8001】和【springcloud-consumer-order80】进行改造,来介绍如何查看服务调用的链路情况。

(一)、springcloud-provider-payment8001模块的改造主要有如下三点:

【a】pom.xml添加zipkin依赖

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

【b】application.yml指定加zipkin的服务端地址、采样率等

server:
  port: 8001    #指定服务端口号
spring:
  application:
    name: springcloud-payment-service  #指定服务名称
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource          # 当前数据源操作类型
    driver-class-name: com.mysql.jdbc.Driver             # mysql驱动包&useSSL=false
    url: jdbc:mysql://localhost:3306/springcloud?useUnicode=true&characterEncoding=utf-8  #数据库地址
    username: root  #数据库用户名
    password: root  #数据库用户密码
  zipkin:
    base-url: http://localhost:9411/
  sleuth:
    sampler:
      probability: 1 #指定采样率  介于0到1的值,1表示全部采样
mybatis:
  mapperLocations: classpath:mapper/*.xml   #mapper.xml文件扫描位置
  type-aliases-package: com.wsh.springcloud.entity    # 所有Entity别名类所在包
eureka:
  client:
    register-with-eureka: true  #注册到Eureka注册中心
    fetch-registry: true  #开启检索服务
    service-url:
#      defaultZone: http://localhost:7001/eureka/    #单机版Eureka注册中心
      defaultZone: http://springcloud-eureka7001.com:7001/eureka/,http://springcloud-eureka7002.com:7002/eureka/   #集群版Eureka注册中心
  instance:
    instance-id: payment8001
    prefer-ip-address: true   #访问路径可以显示IP地址
    lease-renewal-interval-in-seconds: 30  #Eureka客户端向服务端发送心跳的时间间隔(默认30秒发送一次心跳)
    lease-expiration-duration-in-seconds: 90  #Eureka服务端超过90秒(默认90秒)没有收到客户端的心跳,将会剔除该服务实例

【c】PaymentController添加如下测试方法

/**
     * 测试zipkin服务链路跟踪
     */
    @GetMapping("/payment/zipkin/{name}")
    public String paymentZipkin(@PathVariable("name") String name) {
        return "hello, [paymentZipkin] the name is :" + name + ", the server port is " + serverPort;
    }

(二)、springcloud-consumer-order80模块的改造跟上面基本一样

【a】pom.xml加入如下依赖

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

【b】application.yml配置文件

server:
  port: 80
spring:
    application:
        name: springcloud-order-service
    zipkin:
      base-url: http://localhost:9411/
    sleuth:
      sampler:
        probability: 1 #指定采样率 介于0到1的值,1表示全部采样
eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: true  #注册到Eureka注册中心
    fetch-registry: true  #开启检索服务
    service-url:
      #      defaultZone: http://localhost:7001/eureka/    #单机版Eureka注册中心
      defaultZone: http://springcloud-eureka7001.com:7001/eureka/,http://springcloud-eureka7002.com:7002/eureka/   #集群版Eureka注册中心


【c】添加如下测试方法

@GetMapping("/consumer/payment/zipkin/{name}")
    public String paymentZipkin(@PathVariable("name") String name) {
        return restTemplate.getForObject("http://localhost:8001" + "/payment/zipkin/" + name, String.class);
    }

改造完成,我们启动eureka、payment8001和order80,浏览器访问多次: http://localhost/consumer/payment/zipkin/weishihuai

然后我们进入zipkin可视化监控页面:http://localhost:9411/zipkin/

我们可以筛选相应的服务查看具体的请求,zipkin提供了可视化的界面让我们很方便的查看每个接口请求的耗时时间、请求是否成功等等。

点击某个服务还可以查看详情,可以看到调用链信息、trace id 、span id等,,如下图所示: 

 

 调用链路相关服务的依赖关系如下图:

至此,我们也实现了一个比较简单的Spring Cloud Sleuth服务链路跟踪。

四、总结

Spring Cloud Sleuth提供了服务链路跟踪功能,方便我们查看各个服务之间的依赖关系以及在服务发现异常时快速定位错误原因等,当然这只是比较简单的功能,后期还可以进行持久化zipkin监控的信息、集成日志等更多功能。以上相关项目的代码我已经放在Gitee上,有需要的小伙伴可以去拉取进行学习:https://gitee.com/weixiaohuai/springcloud_Hoxton,由于笔者水平有限,如有不对之处,还请小伙伴们指正,相互学习,一起进步。

关于持久化服务链路跟踪信息,可以参考笔者前面总结的Spring Cloud旧版本(Camden)的实现方法:

使用Mysq保存服务链路跟踪信息:https://blog.csdn.net/Weixiaohuai/article/details/82927030

使用RabbitMQ异步收集链路跟踪信息:https://blog.csdn.net/Weixiaohuai/article/details/82883280

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值