✨ SpringCloud Sleuth分布式链路请求跟踪
- 基本介绍
- 为什么需要使用Sleuth
- Sleuth基本介绍
- zipkin
- 基本介绍
- zipkin服务端搭建
- 启动zipkin
- 服务提供者(**cloud-provider-payment8001)**
- 修改pom文件
- yml
- Controller( **PaymentController )**
- 服务消费者(cloud-consumer-order80)
- pom文件
- yml
- **业务类OrderController**
- 测试
个人主页:不断前进的皮卡丘
博客描述:梦想也许遥不可及,但重要的是追梦的过程,用博客记录自己的成长,记录自己一步一步向上攀登的印记
个人专栏:微服务专栏
分布式链路追踪之Spring Cloud Sleuth+Zipkin最全教程!
随着我们的系统越来越庞大,各个服务间的调用关系也变得越来越复杂。当客户端发起一个请求时,这个请求经过多个服务后,最终返回了结果,经过的每一个服务都有可能发生延迟或错误,从而导致请求失败。这时候我们就需要请求链路跟踪工具来帮助我们,理清请求调用的服务链路,解决问题。
pring Cloud Sleuth提供了一套完整的服务跟踪的解决方案
在分布式系统中提供追踪解决方案并且兼容支持了zipkin(负责展现)
https://github.com/spring-cloud/spring-cloud-sleuth
https://cloud.spring.io/spring-cloud-sleuth/reference/html/
Spring Cloud Sleuth实现了一种分布式的服务链路跟踪解决方案,通过使用Sleuth可以让我们快速定位某个服务的问题。简单来说,Sleuth相当于调用链监控工具的客户端,集成在各个微服务上,负责产生调用链监控数据。
Spring Cloud Sleuth只负责产生监控数据,通过日志的方式展示出来,并没有提供可视化的UI界面。
学习Sleuth之前必须了解它的几个概念:
完整的调用链路
表示一请求链路,一条链路通过Trace Id唯一标识,Span标识发起的请求信息,各span通过parent id 关联起来。
上图what
一条链路通过Trace Id唯一标识,Span标识发起的请求信息,各span通过parent id 关联起来。
整个链路的依赖关系如下:
名词解释
Trace:类似于树结构的Span集合,表示一条调用链路,存在唯一标识
span:表示调用链路来源,通俗的理解span就是一次请求信息
Zipkin是 Twitter 的一个开源项目,基于 Google Dapper实现。可以使用它来收集各个服务器上请求链路的跟踪数据,并通过它提供的 REST API 接口来辅助我们查询跟踪数据以实现对分布式系统的监控程序,从而及时地发现系统中出现的延迟升高问题并找出系统性能瓶颈的根源。除了面向开发的API接口之外,它也提供了方便的 UI 组件帮助我们直观的搜索跟踪信息和分析请求链路明细,比如:可以查询某段时间内各用户请求的处理时间等。
zipkin架构介绍
首先需要下载服务端的jar包,地址:https://search.maven.org/artifact/io.zipkin/zipkin-server/2.23.4/jar
下载完成将会得到对应的jar包,如下图:
SpringCloud从F版起已不需要自己构建Zipkin server了,只需要调用jar包即可
运行jar(在jar包所在目录,输入cmd命令,然后输入下面的命令)
java -jar zipkin-server-2.23.4-exec.jar
出现下面的界面,说明启动完成
此时可以访问zipkin的UI界面,http://localhost:9411/zipkin/
<!--新增依赖-->
<!--包含了sleuth+zipkin-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
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
@GetMapping("/payment/zipkin")
public String paymentZipkin(){
return "hi ,I'm paymentzipkin server,welcome to 皮卡丘,O(∩_∩)O哈哈~";
}
<!--包含了sleuth+zipkin-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
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
//==> zipkin+sleuth
@GetMapping("/consumer/payment/zipkin")
public String paymentZipkin(){
String result = restTemplate.getForObject(PATH+"/payment/zipkin/", String.class);
return result;
}