SpringCloud Sleuth 分布式请求链路追踪

2022年11月23日13:27:29

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
SpringCloud Sleuth 分布式请求链路追踪
3、访问:http://127.0.0.1:9411
SpringCloud Sleuth 分布式请求链路追踪
4、完整的调用链路图:表示一请求链路,一条链路通过Trace Id 唯一标识Span表示发起的请求信息,各个 Span 通过parent id关联起来。

(1)完整的调用链路图(原理图)
SpringCloud Sleuth 分布式请求链路追踪
Trace:类似树结构的 Span 集合,表示一个调用链路存在的唯一标识。
Span:表示调用链路的来源,可以理解成每个一次请求或响应。

(2)简化后如下图所示:
SpringCloud Sleuth 分布式请求链路追踪
(3)整个链路的依赖关系如下:
SpringCloud Sleuth 分布式请求链路追踪

二、服务提供者
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:8001spring:application:name: cloud-payment-servicedatasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: org.gjt.mm.mysql.Driverurl: jdbc:mysql://localhost:3306/db2021?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername: rootpassword:123456# Sleuth zipkin配置zipkin:base-url: http://localhost:9411sleuth:sampler:# 采样率值介于 0 到 1 之间,1 则表示全部采集probability:1eureka:client:#表示收将自己注册到EurekaServer,默认为trueregister-with-eureka:true#是否从EurekaServer抓取已有的注册信息,默认为true,单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡fetchRegistry:trueservice-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:2mybatis:mapperLocations: classpath:mapper/*.xmltype-aliases-package: springcloud.atguigu.springcloud.entities#所有entity别名所在的包

4、controller

@RestController@Slf4jpublicclassPaymentController{//SpringCloud Sleuth、Zipkin 请求链路跟踪测试@GetMapping(value="/payment/zipkin")publicStringpaymentZipkin(){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:8002spring:application:name: cloud-payment-servicedatasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: org.gjt.mm.mysql.Driverurl: jdbc:mysql://localhost:3306/db2021?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername: rootpassword:123456# Sleuth zipkin配置zipkin:base-url: http://localhost:9411sleuth:sampler:# 采样率值介于 0 到 1 之间,1 则表示全部采集probability:1eureka:client:#表示收将自己注册到EurekaServer,默认为trueregister-with-eureka:true#是否从EurekaServer抓取已有的注册信息,默认为true,单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡fetchRegistry:trueservice-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:2mybatis:mapperLocations: classpath:mapper/*.xmltype-aliases-package: springcloud.atguigu.springcloud.entities#所有entity别名所在的包

4、controller

@RestController@Slf4jpublicclassOrderController{publicstaticfinalString PAYMENT_URL="http://CLOUD-PAYMENT-SERVICE";@ResourceprivateRestTemplate restTemplate;//SpringCloud Sleuth、Zipkin 请求链路跟踪测试@GetMapping(value="/consumer/payment/zipkin")publicStringpaymentZipkin(){return restTemplate.getForObject(PAYMENT_URL+"/payment/zipkin",String.class);}}

四、测试验证
1、地址栏输入:http://localhost/consumer/payment/zipkin
2、刷新 Zipkin 监控:http://localhost:9411
(1)查找: 可以看到微服务数量请求调用深度Span总数
SpringCloud Sleuth 分布式请求链路追踪(1)依赖关系:cloud-order-server 依赖于cloud-payment-service
SpringCloud Sleuth 分布式请求链路追踪

  • 作者:陌守
  • 原文链接:https://blog.csdn.net/qq_36763419/article/details/121065169
    更新时间:2022年11月23日13:27:29 ,共 4372 字。