一、前言
我们在使用微服务的时候,往往涉及到各个微服务之间的调用,肯定会存在深度的调用链路,如果出现BUG或者异常,就会让问题定位和处理效率非常低。有了Sleuth ,就可以帮助我们记录、跟踪应用程序中的请求和操作。通常与 Zipkin 配合使用,从而提供更全面的可视化应用程序跟踪和分析功能。
就像ElasticSearch和Kibana一样!
复杂的链路调用如下图所示:
在继续往下看的同时,需要你具备Springboot整合Nacos构建一个聚合项目的能力。
当然如果不想自己来,小编也给大家准备好了。大家可以下载运行一下,开始下面的实战!
防止Github访问不了,这里把代码提交到了Gitee。
cloud-sleuth-zipkin-demo代码下载地址:https://gitee.com/wang-zhenjun/cloud-sleuth-zipkin-demo
二、Spring Cloud Sleuth 介绍
1、简介
Spring Cloud Sleuth 是 Spring Cloud 生态系统的一部分,它是一个分布式追踪解决方案,用于监视微服务架构中的请求流程,并帮助开发者跟踪请求在不同微服务之间的传播路径。
Sleuth主要用于解决微服务架构中的分布式系统跟踪和调试问题。
官网文档:https://docs.spring.io/spring-cloud-sleuth/docs/2.2.8.RELEASE/reference/html/。
2、核心概念
我们可以看一下官网的图片:
简单名词介绍:
❝
cs:「客户端发送」,客户已提出请求。该注释指示跨度的开始。sr:「服务器已接收」,服务器端收到请求并开始处理。从此时间戳中减去cs时间戳即可得出网络延迟。ss:「服务器发送」,在请求处理完成时(当响应发送回客户端时)进行注释。从这个时间戳中减去sr时间戳就可以得出服务器端处理请求所需的时间。cr:「客户端已收到」,表示跨度的结束。客户端已成功收到服务器端的响应。从此时间戳中减去cs时间戳即可得出客户端从服务器接收响应所需的整个时间。
❞
详细信息可以看官网介绍,总结一下:
名词 |
翻译 |
解释 |
Trace |
追踪 |
Trace 是一个请求的整体追踪。它代表了从请求的起始点到结束点的完整路径,经过多个微服务。每个 Trace 都有一个唯一的 Trace ID。 |
Span |
跨度 |
Span 是 Trace 中的一个小段,它代表了请求在某个特定微服务上的处理过程。Spans 之间有父子关系,它们可以形成一个层次结构,以表示请求的处理路径。 |
Trace ID |
追踪标识 |
Trace ID 是唯一标识一个 Trace 的标识符。它在整个 Trace 中保持不变,用于将不同的 Span 关联到同一个 Trace 上。 |
Span ID |
跨度标识 |
Span ID 是唯一标识一个 Span 的标识符。它用于在不同 Span 之间建立父子关系。 |
Parent Span ID |
父 Span 标识 |
父 Span ID 是标识一个 Span 的父 Span 的标识符。它用于建立 Span 之间的关系。 |
Annotations |
注解 |
Annotations 是关于 Span 的额外信息,通常用于记录 Span 的开始和结束时间、操作名称、以及其他相关信息。Annotations 可以帮助你更好地理解请求的处理过程。 |
Binary Annotations |
二进制注解 |
Binary Annotations 是键值对形式的信息,用于记录与 Span 相关的自定义信息,例如请求的状态、错误信息等。 |
Collector |
收集器 |
Collector 是用于收集追踪信息的组件,它将追踪数据发送到后端存储或可视化工具(如Zipkin或Jaeger)。Collector 可以将 Span 数据持久化,以供分析和监视使用。 |
Sampler |
采样器 |
Sampler 用于确定是否对一个请求进行追踪。它决定是否为请求创建一个 Trace。Sampler 可以根据策略决定是否记录某个请求的 Trace 数据,以避免记录过多的追踪信息,从而降低性能开销。 |
「官网的图,每一个代表一个组件,他们之间进行调用,画的少了Trace Id,加上就好了。」
每个组件都会生成一个 Trace Id(全局唯一),还会有 Span Id、Parent Id 三部分组成。链路上的所有组件组成一个完整的 Trace。
「注意:」
「头链路Parent Id = null,其余的都指向上一个组件的Span Id,从而形成链路。」
「一次链路调用所有的组件Trace Id都是一样的。」
「这里说的组件就是一个个的微服务!」
三、 Zipkin介绍和搭建
1、定义
Zipkin 是一个分布式追踪系统。它有助于收集解决服务架构中的延迟问题所需的计时数据。功能包括该数据的收集和查找。
Zipkin官网地址:https://zipkin.io/。
2、核心概念
名词 |
翻译 |
解释 |
Trace |
追踪 |
Trace 代表整个请求的追踪路径,跨越不同的服务。 |
Span |
跨度 |
Span 是基本工作单位,代表了请求在单个服务中的处理过程。 |
Trace ID |
追踪标识 |
Trace ID 是唯一标识一个 Trace 的标识符,用于将不同的 Span 关联到同一个 Trace 上。 |
Annotations |
注解 |
Annotations 用于记录 Span 的关键事件,通常包括开始和结束时间、操作名称等。 |
Binary Annotations |
二进制注解 |
Binary Annotations 用于记录额外的自定义信息,例如请求状态、错误信息等。 |
Collector |
收集器 |
Collector 负责接收和存储从不同服务发送的 Span 数据,以便后续的检查和分析。 |
Query and Visualization |
查询和可视化 |
提供了查询和可视化界面,允许用户查看和分析跟踪数据,以帮助故障排查和性能优化。 |
尽管Sleuth 和 Zipkin有些术语和概念中有相似之处,但它们是两个不同的工具,各自有自己的实现和用途。
「Spring Cloud Sleuth 用于生成和传播跟踪信息,而 Zipkin 用于收集、存储、查询和可视化这些信息。它们可以协同工作,但也可以独立使用。」
3、docker搭建
官方有三种方式搭建,推荐使用:「如果您熟悉 Docker,这是首选的启动方法。」
Docker Zipkin项目能够构建 docker 镜像、提供脚本和docker-compose.yml 用于启动预构建镜像的脚本。
https://github.com/openzipkin/docker-zipkin/blob/master/docker-compose.yml。
最快的启动方式是直接运行最新的镜像:
docker run -d -p 9411:9411 openzipkin/zipkin
我们启动成功,在Windows下访问看是否成功!
http://192.168.239.130:9411/zipkin/
「注意:」
「Zipkin默认将追踪数据信息保存到内存,重启服务后追踪数据丢失,Zipkin支持将追踪数据持久化到MySQL或ES。」
可以直接使用docker-componse运行:
docker-componse运行脚本:https://github.com/openzipkin/zipkin/tree/master/docker/examples
可以自行试一下,这里就不带大家演示了!
四、Springboot整合
今天我们来进行简单的链路模拟:
「service-order模块调用service-stock模块调用service-message模块」
「通信我们使用openFeign来进行调用,三个模块统一使用nacos进行注册」
大家可以下载一下项目体验一下,可以自己搭建,就是一个聚合项目!
结构如下:
1、导入依赖
这是父依赖。
2.7.3
2021.0.1
2021.0.1.0
1.8
UTF-8
UTF-8
1.18.26
org.springframework.cloud
spring-cloud-dependencies
${spring.cloud.dependencies.version}
pom
import
org.springframework.boot
spring-boot-dependencies
${spring.boot.version}
pom
import
com.alibaba.cloud
spring-cloud-alibaba-dependencies
${spring.cloud.alibaba.version}
pom
import
org.springframework.boot
spring-boot-starter-web
${spring.boot.version}
org.springframework.boot
spring-boot-starter-test
${spring.boot.version}
org.projectlombok
lombok
${org.projectlombok.lombok}
spring-cloud-dependencies里包含了sleuth、zipkin的依赖,父不需要再定义管理版本。
子依赖要比父依赖多了sleuth、zipkin两个,还有openFeign的包!
org.springframework.cloud
spring-cloud-starter-sleuth
org.springframework.cloud
spring-cloud-sleuth-zipkin
org.springframework.cloud
spring-cloud-starter-openfeign
org.springframework.cloud
spring-cloud-starter-loadbalancer
2、yml配置
三份自己改一下端口和应用名称:service-order、service-stock、service-message;端口分别为:9000、9001、9002
server:
port: 9000
spring:
application:
# 应用名称
name: service-order
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: localhost:8848
zipkin:
base-url: http://192.168.239.130:9411
sender:
type: web # 设置使用 http 的方式传输数据
3、详细代码
记得在启动类上添加注解:@EnableFeignClients,表示开启feign调用。
完整的结构如下:
下面把具体代码给大家:OrderController :
/**
* @author wangzhenjun
* @date 2023/10/31 14:25
*/
@Slf4j
@RequiredArgsConstructor
@RequestMapping("/order")
@RestController
public class OrderController {
private final RemoteStockFeignService remoteStockFeignService;
/**
* 模拟下单流程
* @param userId
* @param productId
* @return
*/
@GetMapping("/createOrder")
public String createOrder(@RequestParam("userId") Integer userId, @RequestParam("productId") Integer productId) {
log.info("====>订单模块库存模块短信模块