分布式进阶链路追踪SpringCloudSleuth、Zipkin【实战篇

2023年 11月 21日 28.1k 0

一、前言

我们在使用微服务的时候,往往涉及到各个微服务之间的调用,肯定会存在深度的调用链路,如果出现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("====>订单模块库存模块短信模块

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论