分布式请求链路跟踪-SpringCloud Sleuth

时间:2023-03-17 15:42:00


文章目录

  • ​​1.概述​​
  • ​​1.1.为什么会出现这个技术? 需要解决哪些问题?​​
  • ​​1.2.是什么?​​
  • ​​1.3.如何解决问题?​​
  • ​​2.搭建链路监控步骤​​
  • ​​2.1.zipkin​​
  • ​​2.2.服务提供者​​
  • ​​2.3.服务消费者(调用方)​​
  • ​​2.4.测试​​

1.概述

1.1.为什么会出现这个技术? 需要解决哪些问题?

微服务的现状

  随着业务的发展,单体架构变为微服务架构,并且系统规模也变得越来越大,各微服务间的调用关系也变得越来越复杂。

  

分布式请求链路跟踪-SpringCloud Sleuth


  

多服务协同工作

在微服务的应用中,一个由客户端发起的请求在后端系统中会经过多个不同的微服务调用来协同产生最后的请求结果
  
复杂的调用链条容易出错
  在复杂的微服务架构系统中,几乎每一个前端请求都会形成一个复杂的分布式服务调用链路,在每条链路中任何一个依赖服务出现延迟超时或者错误都有可能引起整个请求最后的失败

例如:

  在微服务系统中,一个来自用户的请求,请求先达到前端A(如前端界面)然后通过远程调用,到达系统中间件B,C(负载均衡,网关等),最后达到后端服务D,E,后端经过一系列的业务逻辑计算最后将数据返回给用户,对于这样一个请求,经历了这么多个服务,怎么样将它的请求过程的数据记录下来呢?这就需要用到服务链路追踪

分布式请求链路跟踪-SpringCloud Sleuth

1.2.是什么?

Spring Cloud Sleuth提供了一套完整的服务跟踪的解决方案,在分布式系统中提供追踪解决方案并且兼容支持了zipkin

官网: ​​https://github.com/spring-cloud/spring-cloud-sleuth​

分布式请求链路跟踪-SpringCloud Sleuth

微服务跟踪(sleuth)其实是一个工具,它在整个分布式系统中能跟踪一个用户请求的过程(包括数据采集,数据传输,数据存储,数据分析,数据可视化),捕获这些跟踪数据,就能构建微服务的整个调用链的视图,这是调试和监控微服务的关键工具。

SpringCloudSleuth有4个特点

特点

说明

提供链路追踪

通过sleuth可以很清楚的看出一个请求经过了哪些服务,可以方便的理清服务局的调用关系

性能分析

通过sleuth可以很方便的看出每个采集请求的耗时,分析出哪些服务调用比较耗时,当服务调用的耗时随着请求量的增大而增大时,也可以对服务的扩容提供一定的提醒作用

数据分析优化链路

对于频繁地调用一个服务,或者并行地调用等,可以针对业务做一些优化措施

可视化

对于程序未捕获的异常,可以在zipkpin界面上看到

1.3.如何解决问题?

Spring Cloud Sleuth提供了一套完整的服务跟踪的解决方案,在分布式系统中提供追踪解决方案并且兼容支持了 zipkin

官网的流程图

分布式请求链路跟踪-SpringCloud Sleuth

2.搭建链路监控步骤

2.1.zipkin

下载
SpringCloud从F版起已不需要自己构建Zipkin Server了,只需调用jar包即可.
下载地址: ​​​https://repo1.maven.org/maven2/io/zipkin/zipkin-server/​​ 目标jar包: zipkin-server-2.12.9-exec.jar

运行jar

分布式请求链路跟踪-SpringCloud Sleuth

运行控制台
访问: http://localhost:9411/zipkin/

相关术语

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

分布式请求链路跟踪-SpringCloud Sleuth


上图what:

分布式请求链路跟踪-SpringCloud Sleuth


分布式请求链路跟踪-SpringCloud Sleuth


名词解释:

Trace:类似于树结构的Span集合,表示一条调用链路,存在唯一标识

span:表示调用链路来源,通俗的理解span就是一次请求信息

2.2.服务提供者

pom:

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

application.yml
改 application.yml,添加以下内容

spring:
zipkin:
base-url: http://localhost:9411 # zipkin 地址
sleuth:
sampler:
# 采样率值 介于0-1之间 ,1表示全部采集
probability: 1

controller层
改业务类 PaymentController增加:

@GetMapping("/payment/zipkin")
public String paymentZipkin(){
return "hi, i am paymentzipkin server fall back!"
}

2.3.服务消费者(调用方)

pom.xml
改 pom.xml,增加:

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

application.yml

改 application.yml,添加以下内容

spring:
zipkin:
base-url: http://localhost:9411 # zipkin 地址
sleuth:
sampler:
# 采样率值 介于0-1之间 ,1表示全部采集
probability: 1

controller层

改业务类OrderController,增加:

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

2.4.测试

访问:localhost/consumer/payment/zipkin

在控制台查看调用链路

分布式请求链路跟踪-SpringCloud Sleuth