SpringBoot实战(二十二)集成 Sleuth、Zipkin

目录

    • 一、简介
      • 1.Sleuth
      • 2.Zipkin
    • 二、搭建 zipkin-server
      • 1.jar包启动
      • 2.docker启动
      • 3.自己搭建
        • **Maven依赖**
        • 添加启动类注解
      • 4.页面截图
    • 三、搭建 sleuth-zipkin
      • 1.Maven 依赖
      • 2.yaml配置
      • 3.代码实现
        • DemoController.java
        • DemoFeignClient.java
      • 4.测试

一、简介

1.Sleuth

  • 官方文档: https://spring.io/projects/spring-cloud-sleuth
  • GitHub: https://github.com/spring-cloud/spring-cloud-sleuth

Sleuth 是一个分布式跟踪系统,用于跟踪应用程序中的请求和操作。它可以帮助我们了解应用程序的结构和性能,并定位问题的根本原因。Sleuth 可以与 Zipkin 等分布式跟踪系统配合使用,从而提供更全面的应用程序跟踪和分析功能。

Sleuth 在 Spring Boot 中提供了一个便捷的集成方式。它可以轻松地跟踪应用程序中的请求和操作,并将跟踪信息记录到日志文件中。这使得我们可以更轻松地了解应用程序的结构和性能,并快速定位问题的根本原因。

Sleuth 核心概念:

  • trace:跟踪,一个 Trace 表示一个请求或操作的完整的调用链,从客户端发起请求开始,到服务端响应请求结束。
  • span:跨度,一个 Span 表示一个请求或操作的一部分,它包含了一些有用的信息,如开始时间、结束时间、操作名称等。
  • traceId:跟踪ID,一个 Trace ID 是一个唯一的标识符,它用于将一组 Span 关联在一起,形成一个完整的 Trace。
  • spanId:跨度ID,一个 Span ID 是一个唯一的标识符,它用于标识一个 Span。

在 Sleuth 中,每个请求或操作都会生成一个 Trace,并且每个 Trace 包含多个 Span。每个 Span 包含一个唯一的 Span ID,并与一个 Trace ID 相关联。通过 Trace ID 和 Span ID,我们可以将多个 Span 关联在一起,形成一个完整的 Trace。

2.Zipkin

  • 官方网站: https://zipkin.io/
  • 官方文档: https://zipkin.io/pages/quickstart
  • GitHub: https://github.com/openzipkin/zipkin

Zipkin 是一个分布式流程跟踪系统。可以用来收集请求时间数据,从而解决服务体系结构中的延迟问题。功能包括数据收集和数据查看。

Zipkin 核心概念:

  • Annotation:用于定位一个请求的开始和结束,主要包含 cs/cf/ss/sf 四个时间点。当这个 Annotation 被记录了,这个 PRC 也被认为完成了。四个时间点按顺序发生:

    • cs:Client Start,表示客户端发起请求,一个 Span 的开始。
    • ss:Service Start,表示服务端收到请求。
    • cf:Client Finish,表示客户端获取到服务端的返回信息,一个 Span 的结束。
    • sf:Service Finish,表示服务端完成处理,并将结果发送给客户端。
    • ss-cs=网络延迟时间
    • sf-ss=逻辑处理时间
    • cf-cs=整个流程时间
  • Collector:接收或收集各个应用传输的数据,跟踪一个 HTTP 请求的工作流程:

    1.把当前调用链的 trace 信息添加到 HTTP Header 里面;

    2.记录当前调用的时间戳;

    3.发送 HTTP 请求,把 trace 相关的 header 信息携带上;

    4.调用结束之后,记录当前调用花费的时间;

    5.然后把上面流程产生的信息汇集成一个 span,把 span 信息上传到 zipkin 的 Collector 模块;

    6.下一个 HTTP 请求继续从第一步开始。

Zipkin 使用流程:

如果日志文件中有 traceId,则可以直接跳转到具体位置。或者,我们可以根据服务名称、操作名称、标签和持续时间等属性进行查询。Zipkin 可以帮我们汇总一些有用的数据,例如:在服务中花费的时间百分比,以及操作是否失败等。如下所示:

在这里插入图片描述

Zipkin 的 UI 还提供了一个依赖关系图,显示通过每个应用程序跟踪的请求书。有助于我们识别聚合行为,包括错误路径或对已弃用服务的调用。

在这里插入图片描述

使用 Zipkin 来查看数据,就需要应用向 Zipkin 发送数据。目前最流行的方法是通过 HTTP 或 Kafka,其他还可以使用例如 Apache ActiveMQ、gRPC 和 RabbitMQ等。提供给 Zipkin UI 的数据会存储在内存中,或者可以使用支持的后端(如 Apache Cassadra 或 Elasticsearch)来永久存储。

二、搭建 zipkin-server

zipkin-server 是 Zipkin 的服务端,集成了 UI 界面来进行查看。zipkin-server 可以自己去官网下载已有的独立 jar 包,或者 docker 镜像进行使用:

1.jar包启动

  • jar包下载地址: https://repo1.maven.org/maven2/io/zipkin/zipkin-server/

或者可以直接执行以下命令来下载最新版本 jar 包:

# 下载zipkin.jar
curl -sSL https://zipkin.io/quickstart.sh | bash -s
# 启动zipkin.jar
java -jar zipkin.jar

命令执行截图:

在这里插入图片描述

2.docker启动

  • docker 镜像地址: https://hub.docker.com/r/openzipkin/zipkin

执行以下命令来拉取最新镜像:

# 拉取镜像
docker pull openzipkin/zipkin
# 启动镜像
docker run -d -p 9411:9411 openzipkin/zipkin

在这里插入图片描述

下面主要说下我们自己搭建的过程。

3.自己搭建

注意:SpringBoot 2.2.x 以后的版本,不再支持自己搭建服务,之前是通过 @EnableZipkinServer 注解,现在这个注解不起作用了。所以 SpringBoot 2.2.x 以后的版本只能使用 jar 包或 docker 来启动。

SpringBoot 2.1.x 及以下的版本可以通过以下方式自己搭建:

Maven依赖

<!-- zipkin-server -->
<dependency>
    <groupId>io.zipkin.java</groupId>
    <artifactId>zipkin-server</artifactId>
    <version>${zipkin.server.version}</version>
</dependency>
<dependency>
    <groupId>io.zipkin.java</groupId>
    <artifactId>zipkin-autoconfigure-ui</artifactId>
    <version>${zipkin.server.version}</version>
</dependency>

添加启动类注解

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import zipkin2.server.internal.EnableZipkinServer;

@EnableZipkinServer
@SpringBootApplication
public class ZipkinServerApplication {

    public static void main(String[] args) {
        // 启动应用
        SpringApplication.run(ZipkinServerApplication.class, args);
    }

}

SpringBoot 2.2.x 以后的版本,启动会报错 zipkin2.server.internal.ZipkinHealthIndicator.<init>(ZipkinHealthIndicator.java:26)

完整报错信息如下:

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2023-07-24 16:13:59.158 ERROR 4976 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

An attempt was made to call a method that does not exist. The attempt was made from the following location:

    zipkin2.server.internal.ZipkinHealthIndicator.<init>(ZipkinHealthIndicator.java:26)

The following method did not exist:

    org.springframework.boot.actuate.health.CompositeHealthIndicator.<init>(Lorg/springframework/boot/actuate/health/HealthAggregator;)V

The method's class, org.springframework.boot.actuate.health.CompositeHealthIndicator, is available from the following locations:

    jar:file:/D:/maven_repository/org/springframework/boot/spring-boot-actuator/2.2.13.RELEASE/spring-boot-actuator-2.2.13.RELEASE.jar!/org/springframework/boot/actuate/health/CompositeHealthIndicator.class

It was loaded from the following location:

    file:/D:/maven_repository/org/springframework/boot/spring-boot-actuator/2.2.13.RELEASE/spring-boot-actuator-2.2.13.RELEASE.jar


Action:

Correct the classpath of your application so that it contains a single, compatible version of org.springframework.boot.actuate.health.CompositeHealthIndicator

Disconnected from the target VM, address: '127.0.0.1:50399', transport: 'socket'

Process finished with exit code 1

4.页面截图

注意:默认页面上的数据是存放在内存里的,重启就会消失,如果需要持久化,可以放到 ES 或者 数据库 中。

启动页面:

在这里插入图片描述

zipkin-server 页面: http://localhost:9411

在这里插入图片描述

三、搭建 sleuth-zipkin

1.Maven 依赖

<!-- Sleuth -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<!-- Zipkin -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>

2.yaml配置

server:
  port: 8081

spring:
  application:
    name: sleuth-feign-a
  zipkin:
    # zipkin-server地址
    base-url: http://localhost:9411/
  sleuth:
    sampler:
      # 采样比例,0-1 之间,1 表示全部采集
      probability: 1.0

# 用于打印更多 sleuth 日志
#logging:
#  level:
#    org.springframework.cloud.sleuth: DEBUG

3.代码实现

这里我们搭建了两个服务:sleuth-feign-asleuth-feign-b。由服务a调用服务b,完成链路调用。

DemoController.java

import com.demo.common.Result;
import com.demo.feign.DemoFeignClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
@RequestMapping("/demo")
public class DemoController {

    @Value("${server.port:}")
    private String port;

    @Autowired
    private DemoFeignClient demoFeignClient;

    @GetMapping("/test")
    public Result<Object> test() {
        String data = "This is a test! port:" + port;
        log.info(">>>>>>>>>> 【INFO】data:{}", data);
        return Result.succeed().setData(data);
    }

    @GetMapping("/feignTest")
    public Result<Object> feignTest() {
        return demoFeignClient.test();
    }
}

DemoFeignClient.java

import com.demo.common.Result;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(value = "sleuth-feign-b")
public interface DemoFeignClient {

    @GetMapping("/demo/test")
    Result<Object> test();
}

4.测试

服务启动后,请求地址:http://localhost:8081/demo/feignTest

重新访问 zipkin-server 地址:http://localhost:9411

在这里插入图片描述

我们利用日志中的 traceIdspanId 均可进行定位到该次请求:

在这里插入图片描述

在这里插入图片描述

整理完毕,完结撒花~ 🌻





参考地址:

1.Spring Boot 中的 Sleuth 是什么, 如何使用,https://blog.csdn.net/2302_77835532/article/details/131552092

2.SpringBoot集成ZipKin实现链路跟踪,https://blog.csdn.net/huxiang19851114/article/details/122976149

3.spring boot集成zipkin-server,https://blog.csdn.net/zjgxxxxxxx/article/details/126421350

4.Spring Boot中的Zipkin:分布式跟踪系统,https://blog.csdn.net/JasonXu94/article/details/131552472

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/45664.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

7-17-7.24 三维重建

3D重建 context capture中无人机航拍建模的基本原理 如何测量物体的实际长宽数据 1.添加用户控制点 2.添加范围约束&#xff0c;标定两个控制点之间的实际距离 无人机航拍中坐标和经纬度信息是如何确定的 pos数据由飞控系统在相机拍照时生成&#xff0c;与相片一一对应&#…

python与深度学习(五):CNN和手写数字识别

目录 1. 说明2. 卷积运算3. 填充4. 池化5. 卷积神经网络实战-手写数字识别的CNN模型5.1 导入相关库5.2 加载数据5.3 数据预处理5.4 数据处理5.5 构建网络模型5.6 模型编译5.7 模型训练、保存和评价5.8 模型测试5.9 模型训练结果的可视化 6. 手写数字识别的CNN模型可视化结果图7…

数学建模学习(2):数学建模各类常用的算法全解析

一、评价类算法 常见的评价算法 1.层次分析法 基本思想 是定性与定量相结合的多准则决策、评价方法。将决策的有关元素分解成 目标层、准则层和方案层 &#xff0c;并通过人们的 判断对决策方案的 优劣进行排序 &#xff0c;在此基础上进行定性和定量分析。它把人的思维过程…

AWS IAM介绍

前言 AWS是世界上最大的云服务提供商&#xff0c;它提供了很多组件供消费者使用&#xff0c;其中进行访问控制的组件叫做IAM(Identity and Access Management)&#xff0c; 用来进行身份验证和对AWS资源的访问控制。 功能 IAM的功能总结来看&#xff0c;主要分两种&#xff1…

【代码随想录day20】二叉搜索树的最小绝对差

题目 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等于两值之差的绝对值。 思路 最简单的一个思路是使用中序遍历&#xff0c;从二叉排序树中得到有序序列&#xff0c;存储到self.elem中&…

Mac苹果系统安装双系统Windows10 Windows11 BOOTCAMP

Mac系统安装双系统Windows10 BOOTCAMP详细 1.下载Windows系统2.开始安装3.安装驱动4.默认启动5.备注 1.下载Windows系统 注意一下所有安装全程接充电器操作&#xff0c;以免安装过程中电脑断电带来不必要影响。 从下列方式选择合适的系统进行下载。 MSDN https://msdn.itelly…

【code】使用git将本地代码托管至码云

创建远程仓库 在码云&#xff08;gitee.com&#xff09;网站上登录你的账号&#xff0c;然后点击页面右上角的加号图标&#xff0c;选择"新建仓库"&#xff0c;填写仓库名称、描述等信息&#xff0c;创建一个新的远程仓库。 生成SSH密钥 在Git上传代码到远程仓库…

p7付费课程笔记5:串行gc以及并行gc

前言 前段时间我们学习jvm的基础结构和gc相关的基础知识&#xff0c;今天我们详细讲讲几大gc。 串行gc 串行 GC 对年轻代使用 mark-copy (标记-复制) 算法&#xff0c;对老年代使用 mark-sweep-compact (标记-清除-整理) 算法。 两者都是单线程的垃圾收集器&#xff0c;不能…

windows 系统安装sonarqube

SonarQube是一种自动代码审查工具&#xff0c;用于检测代码中的错误&#xff0c;漏洞和代码异味。它可以与您现有的工作流程集成&#xff0c;以便在项目分支和拉取请求之间进行连续的代码检查。 官方网站&#xff1a; https://www.sonarqube.org/ 1. 使用前提条件 运行SonarQ…

FCPX插件-15组金色华丽粒子特效闪耀动画 Awards Backgrounds

Awards Backgrounds是fcpx上一个很棒的电影级效果插件&#xff0c;Awards Backgrounds 包含15组金色华丽粒子特效闪耀动画&#xff0c;可以为您的作品创建豪华的背景或叠加特效&#xff01;包含各种带有可编辑颜色的下落闪闪发光粒子的场景。用于展示奖项提名者、优雅的表演、祝…

【历史上的今天】7 月 24 日:Caldera 诉微软案;AMD 宣布收购 ATI;谷歌推出 Chromecast

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 7 月 24 日&#xff0c;在 1951 年的今天&#xff0c;晶体管发明家 John Bardeen 通知 AT&T 贝尔实验室&#xff0c;他将离开公司&#xff0c;与 Walter B…

数据结构【数组、串、广义表】

第四章 数组、串、广义表 一、数组 1.概念&#xff1a;线性表是通过数组实现的&#xff0c;数组是线性表的推广&#xff0c;数组只有存取元素和修改元素的操作&#xff08;除了初始化和销毁&#xff09;&#xff1b; 2.数组的存储结构&#xff1a;一个数组的所有元素在内存中占…

动手学DL——深度学习预备知识随笔【深度学习】【PyTorch】

文章目录 2、预备知识2.1、数据操作2.2、线性代数&矩阵计算2.3、导数2.4、基础优化方法 2、预备知识 2.1、数据操作 batch&#xff1a;以图片数据为例&#xff0c;一次读入的图片数量。 小批量样本可以充分利用GPU进行并行计算提高计算效率。 数据访问 数组&#xff1a;np…

Java运算符

大体上&#xff0c;与C语言差不多&#xff0c;不同的地方&#xff0c;我用红色字体标注了 算术运算符 1. 基本四则运算符&#xff1a;加减乘除模 ( - * / %) int a 10 ; int b 20 ; System . out . println ( a b ); // 30 System . out . println ( a - b…

二十三种设计模式第十八篇--责任链模式

责任链模式是一种行为型设计模式&#xff0c;它允许你将请求沿着处理者链传递&#xff0c;直到有一个处理者能够处理该请求为止。责任链模式将请求发送者和请求处理者解耦&#xff0c;从而使得多个处理者都有机会处理同一个请求。 该模式包含以下几个关键角色&#xff1a; 抽象…

macOS 源码编译 qpress

╰─➤ git clone https://github.com/PierreLvx/qpress.git ╰─➤ cd qpress ╰─➤ make g -O3 -o qpress -x c quicklz.c -x c qpress.cpp aio.cpp utilities.cpp -lpthread -Wall -Wextra -Werror ╰─➤ sudo make install …

k8s deployment(k8s经典版)|PetaExpress

Deployment是什么&#xff1f; Deployment是指在软件开发中将应用程序或系统部署到目标环境中的过程。它包括将代码编译、配置、打包并安装到目标服务器或设备上的步骤。k8s deployment是&#xff08;k8s经典版&#xff09;中用来管理发布的控制器&#xff0c;在开发的过程中使…

Ubuntu18.04系统安装视频剪辑软件shotcut

Snap Store安装 使用的是最新的Ubuntu 18.04 LTS&#xff08;Bionic Beaver&#xff09;&#xff0c;其本身已安装Snap 如果没有安装&#xff0c;则可以使用以下命令安装SNAP $ sudo apt-get install snapd安装shotcut $ sudo snap install shotcut --classic启动shotcut $…

读kafka生产端源码,窥kafka设计之道(下)

背景 在上一篇文章《读kafka生产端源码&#xff0c;窥kafka设计之道&#xff08;上&#xff09;》 留下了kafka设计上比较优秀的一个点&#xff1b;内存的循环使用。本篇文章准备盘盘它。 好奇 为什么 kafka减少发送消息时向JVM频繁申请内存&#xff0c;就可以降低JVM GC的执…

【深度学习之YOLO8】视频流推断

官方V8模型下载 需要准备两个东西 simsun.ttc字体包YOLOv8官方模型成品 ScreenCapture屏幕图像类 import cv2 import mss import numpy as npclass ScreenCapture:"""parameters----------screen_resolution : Tuple[int, int]屏幕宽高&#xff0c;分别为x&a…
最新文章