如何在 Spring Boot 中进行分布式追踪
在 Spring Boot 中进行分布式追踪
分布式系统中的应用程序由多个微服务组成,它们可以位于不同的服务器、容器或云中。当出现问题时,如性能瓶颈、错误或延迟,了解问题的根本原因变得至关重要。分布式追踪是一种用于跟踪和分析分布式应用程序性能和行为的工具。本文将介绍如何在Spring Boot应用程序中进行分布式追踪,以及如何使用Spring Cloud Sleuth和Zipkin来实现这一目标。
什么是分布式追踪?
分布式追踪是一种监视分布式系统的方法,通过追踪和分析请求在不同服务之间的传递路径和时间来帮助诊断性能问题。分布式追踪通常包括以下主要组件:
-
跟踪器(Tracer):用于在请求进入和离开应用程序时创建唯一的跟踪标识符,并记录事件和时间戳。
-
跟踪(Trace):代表一次请求的完整生命周期,包括多个服务和操作。
-
跨度(Span):代表一次操作或事件,跨度通常包含有关操作的信息,如名称、持续时间和标签。
-
采样(Sampling):用于确定哪些请求应该记录并进行跟踪,以防止数据过于庞大。
使用 Spring Cloud Sleuth 进行分布式追踪
Spring Cloud Sleuth是Spring Cloud的一部分,它提供了在Spring Boot应用程序中进行分布式追踪的支持。Spring Cloud Sleuth集成了Zipkin,一个开源的分布式追踪系统,用于收集、存储和查询跟踪数据。以下是如何在Spring Boot应用程序中使用Spring Cloud Sleuth的步骤:
步骤1:添加依赖项
在您的Spring Boot项目的pom.xml
文件中添加Spring Cloud Sleuth的依赖项:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
步骤2:配置应用程序名称
您可以配置应用程序的名称,以便在分布式追踪中标识不同的应用程序。在application.properties
或application.yml
文件中添加以下配置:
spring.application.name=my-service
步骤3:启动 Zipkin 服务器
要使用Spring Cloud Sleuth,您需要启动一个Zipkin服务器。您可以使用Docker、Java应用程序或其他方法来启动Zipkin服务器。以下是使用Docker启动Zipkin服务器的示例命令:
docker run -d -p 9411:9411 openzipkin/zipkin
步骤4:运行应用程序
运行您的Spring Boot应用程序。Spring Cloud Sleuth将自动为每个请求创建唯一的跟踪标识符,并记录相关的跟踪和跨度。
步骤5:查看追踪数据
打开浏览器并访问Zipkin服务器的Web界面(默认端口9411)。您将能够查看和分析应用程序的分布式追踪数据。
使用 Spring Cloud Sleuth 进行手动追踪
除了自动追踪外,Spring Cloud Sleuth还允许您手动创建和记录跟踪数据。这对于记录自定义事件或特定操作非常有用。以下是一个示例代码,演示如何在Spring Boot应用程序中手动创建跟踪:
import org.springframework.cloud.sleuth.annotation.NewSpan;
import org.springframework.stereotype.Service;@Service
public class MyService {@NewSpan("custom-span-name")public void performCustomOperation() {// 在这里执行自定义操作}
}
在上述示例中,我们使用@NewSpan
注解来创建一个新的跨度,您可以为跨度指定名称。然后,您可以在performCustomOperation
方法中执行自定义操作,该操作将被记录到分布式追踪中。
使用 Sleuth 的 Trace 和 Span
在代码中,您可以通过 Tracer
和 Span
来访问当前跟踪和跨度信息。以下是更多关于如何使用 Tracer
和 Span
的示例代码,演示了它们的一些常见用法:
import org.springframework.cloud.sleuth.Tracer;
import org.springframework.cloud.sleuth.annotation.NewSpan;
import org.springframework.stereotype.Service;@Service
public class MyService {private final Tracer tracer;public MyService(Tracer tracer) {this.tracer = tracer;}@NewSpan("custom-span-name")public void performCustomOperation() {// 访问当前跨度Span currentSpan = tracer.currentSpan();// 访问当前跟踪Trace currentTrace = tracer.currentTrace();// 创建一个自定义的子跨度Span customSpan = tracer.nextSpan().name("custom-subspan").start();try {// 在子跨度内执行操作// ...// 设置子跨度的标签customSpan.tag("custom-tag", "tag-value");} finally {// 完成子跨度customSpan.finish();}}
}
在上述示例中,我们注入了 Tracer
对象,它允许我们访问当前跟踪和跨度。我们还创建了一个自定义的子跨度,并在其中执行操作。最后,我们通过调用 finish()
方法来完成子跨度。您可以为跨度设置标签以添加有关操作的额外信息。
高级配置和自定义
Spring Cloud Sleuth 提供了丰富的配置选项和自定义功能,以适应不同的追踪需求。您可以配置要记录的采样率、设置追踪信息的导出方式,甚至将追踪数据发送到不同的追踪系统。
以下是一些高级配置示例:
配置采样率
您可以配置采样率以决定哪些请求应该记录和追踪。以下是一个示例配置,将采样率设置为50%:
spring.sleuth.sampler.probability=0.5
自定义导出
如果您想将追踪数据导出到不同的追踪系统,例如Jaeger或AWS X-Ray,您可以配置自定义的 SpanReporter
。这需要一些额外的编程工作,但允许您集成其他追踪工具。
配置 Zipkin
如果您希望将追踪数据发送到 Zipkin 服务器之外的其他地方,您可以配置 Zipkin 发送器的类型。以下是一个示例配置,将追踪数据发送到自定义的远程服务器:
spring.zipkin.sender.type=web
spring.zipkin.base-url=http://custom-zipkin-server:9411/
结论
在分布式系统中进行追踪是确保应用程序性能和可用性的重要组成部分。Spring Cloud Sleuth 提供了一种方便而强大的方式来实现分布式追踪,它集成了 Zipkin,使您能够轻松查看和分析跟踪数据。通过使用 Spring Cloud Sleuth,您可以更好地了解应用程序的行为,快速诊断性能问题,并提高系统的可维护性。
本文介绍了如何在 Spring Boot 应用程序中集成 Spring Cloud Sleuth,并使用自动追踪、手动追踪、Trace 和 Span 来记录和分析分布式应用程序的性能数据。希望这篇文章对您有所帮助,让您更好地理解如何在 Spring Boot 应用程序中进行分布式追踪。通过使用 Spring Cloud Sleuth,您可以建立一个更可观察和可管理的分布式系统,提供更好的用户体验。
相关文章:

如何在 Spring Boot 中进行分布式追踪
在 Spring Boot 中进行分布式追踪 分布式系统中的应用程序由多个微服务组成,它们可以位于不同的服务器、容器或云中。当出现问题时,如性能瓶颈、错误或延迟,了解问题的根本原因变得至关重要。分布式追踪是一种用于跟踪和分析分布式应用程序性…...

Lniux三剑客——Grep
前言 echo guangge{01…100…2} 第二个是间隔多少个计数 命令别名 alias, unalias , 作用是封装命令: alias rm ‘rm -i’ 命令历史 history !行号 !! 上一次的命令 ctrl a 移动到行首 ctrl e 移动到行尾 Grep 格式: gre…...

选实验室超声波清洗机易忽视的内容?小型清洗机的优点有?
实验室超声波清洗机如今在行业内占据着重要的一席之地,摒弃了传统模式,坚持以超声波为主的清洗方式,在市场中获得的反响强烈。服务好,有诚信的实验室超声波清洗机能够消除客户的后顾之忧,工作人员会以真诚态度向客户提…...

基于Java使用SpringBoot+Vue框架实现的前后端分离的美食分享平台
✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 在当今社会࿰…...

开源数据库MySQL 8.0 OCP认证精讲视频、环境和题库 之二
修改用户的初始密码: mysql>alteruserrootlocalhostidentifiedbyQaz1234; 或者: mysql>alteruseruser0identifiedbyQaz_1234; 在版本5.x中: mysql>setpasswordpassword(Qaz_1234); 可执行文件: 服务器端&…...

AI对网络安全的影响与挑战
近年来,随着人工智能(AI)技术的快速发展,网络安全领域也开始逐渐引入生成式AI应用。根据最新的数据研究,生成式AI对网络安全和合规的影响最大,同时也包括了IT和云的运维、硬件和软件支持领域。通过AI和自动…...

微信小程序备案流程操作详解,值得收藏
目录 一、小程序备案法律法规参考 二、备案前准备 2.1 备案入口 2.1.1、未上架小程序 2.1.2、已上架小程序 (二)备案类型 (三)备案材料准备 3.1、小程序备案材料 3.2、前置审批材料 3.3、个人备案 3.4、非个人备案 三、备案整体流程 (一)备案信息填写 1、主体信息…...

【NLTK系列01】:nltk库介绍
一、说明 NLTK是个啥?它是个复杂的应用库,可以实现基本预料库操作,比如,、将文章分词成独立token,等操作。从词统计、标记化、词干提取、词性标记,停用词收集,包括语义索引和依赖关系解析等。 …...

人机环境系统智能有利于防止人工智能失控
当前,人工智能的失控是一个备受关注的话题。尽管目前还没有出现完全失控的人工智能系统,但确实存在一些潜在的风险和挑战需要我们重视和应对。一些可能导致人工智能失控的因素包括: 误用和恶意使用:人工智能技术可以被用于恶意活动…...

用于多目标检测的自监督学习(SELF-SUPER VISED LEARNING FOR MULTIPLE OBJECTDETECTION)
在本章中,我们提出了一种新的自监督学习(SSL)技术,以从头顶图像中提供关于实例分割不确定性的模型信息。我们的SSL方法通过使用测试时数据增强和基于回归的旋转不变伪标签细化技术来改进对象检测。我们的伪标签生成方法提供多个经过几何变换的图像作为卷积神经网(CNN)的输…...

HDLbits: ps2data
这一题在上一题基础上多了一个输出,并且这个输出是不需要像上一题考虑出错的情况的,所以只要把输入in按次序排好就可以。我一开始的想法是在状态切换判断的always块里把in赋给out,但是不正确,代码如下: module top_mo…...

SpringCloudAlibaba SpringCloud SpringBoot 版本对照
由于 Spring Boot 3.0,Spring Boot 2.7~2.4 和 2.4 以下版本之间变化较大,目前企业级客户老项目相关 Spring Boot 版本仍停留在 Spring Boot 2.4 以下,为了同时满足存量用户和新用户不同需求,社区以 Spring Boot 3.0 和 2.4 分别为…...

Swift基础
本文是个比较简单的学习笔记,更详细的内容见 Swift官方文档 1、相等性比较 Swift标准库用 < 和 运算符定义了 >、>、<,所以实现 Comparable 的 < 运算符就会自动得到这些运算符的实现,实际上 Comparable 继承自 Equatable&…...

基于php+thinkphp+vue的校园二手交易网站
运行环境 开发语言:PHP 数据库:MYSQL数据库 应用服务:apache服务器 使用框架:ThinkPHPvue 开发工具:VScode/Dreamweaver/PhpStorm等均可 项目简介 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发…...

SystemVerilog Assertions应用指南 第一章(1.25章节 “first_match”运算符)
任何时候使用了逻辑运算符(如“and”和“or”)的序列中指定了时间窗,就有可能出现同一个检验具有多个匹配的情况。“ first match”构造可以确保只用第一次序列匹配,而丢弃其他的匹配。当多个序列被组合在一起,其中只需时间窗内的第一次匹配来检验属性剩余的部分时,“ first ma…...

python和go执行字符串表达式
1、python/eval python里可以使用内置的eval函数,来执行一个字符串表达式的结果,字符串表达式里可以是变量、函数、运算符等 def test():return True flag False print(eval("test() and True and flag" )) 执行结果为False 2、golang/go…...

Python算法练习 10.14
leetcode 2095 删除链表的中间节点 给你一个链表的头节点 head 。删除 链表的 中间节点 ,并返回修改后的链表的头节点 head 。 长度为 n 链表的中间节点是从头数起第 ⌊n / 2⌋ 个节点(下标从 0 开始),其中 ⌊x⌋ 表示小于或等于…...

云上攻防-云原生篇Docker安全系统内核版本漏洞CDK自动利用容器逃逸
文章目录 云原生-Docker安全-容器逃逸&内核漏洞云原生-Docker安全-容器逃逸&版本漏洞-CVE-2019-5736 runC容器逃逸-CVE-2020-15257 containerd逃逸 云原生-Docker安全-容器逃逸&CDK自动化 云原生-Docker安全-容器逃逸&内核漏洞 细节部分在权限提升章节会详解&…...

C# Sqlite数据库的搭建及使用技巧
C# Sqlite数据库的搭建 前言: 今天我们来学一下Sqlite的数据库的搭建,Sqlite数据库不比MySqL数据库,SQlite数据是一个比较轻量级的数据库,SQLite提供了比较多的工具集,对数据基本上不挑,什么数据都可以处理ÿ…...

gerrit代码review使用基本方法
1、repo拉取代码 repo init -u ssh://gerrit.senseauto.com/senseauto_manifest -b develop -m senseauto-config.xml --repo-urlssh://gerrit.senseauto.com:29418/senseauto_repo --repo-branchdevelop --no-repo-verify repo sync -j4 repo forall -j 4 -p -c ‘git lfs p…...

网络监控与故障排除:netstat命令的使用指南
文章目录 概述什么是 netstat 命令?netstat 命令的作用和功能netstat 命令的常见用途 安装和基本用法安装 netstat 命令netstat 命令的基本语法查看活动网络连接 查看网络接口信息查看所有网络接口信息查看指定网络接口信息网络接口状态说明 网络连接状态显示所有连…...

Blender:渲染一个简单动画
接上 Blender:对模型着色_六月的翅膀的博客-CSDN博客 目标是做一个这种视频 先添加一个曲线,作为相机轨迹 然后添加一个相机 对相机添加物体约束,跟随路径,选择曲线,然后点击动画路径 假如对相机设置跟随路径后&…...

一篇文章带你用动态规划解决股票购买时机问题
动态规划的解题步骤可以分为以下五步,大家先好好记住 1.创建dp数组以及明确dp数组下标的含义 2.制定递推公式 3.初始化 4.遍历顺序 5.验证结果 股票购买时机问题的解题核心思路 当天的收益是根据前一天持有股票还是不持有股票的状态决定的 那么很自然的我们就想…...

【设计模式】使用建造者模式组装对象并加入自定义校验
文章目录 1.前言1.1.创建对象时的痛点 2.建造者模式2.1 被建造类准备2.2.建造者类实现2.3.构建对象测试2.4.使用lombok简化建造者2.5.lombok简化建造者的缺陷 3.总结 1.前言 在我刚入行不久的时候就听说过建造者模式这种设计模式,当时只知道是用来组装对象…...

简单聊聊低代码
在数字经济迅速发展的背景下,越来越多的企业开始建立健全业务系统、应用、借助数字化工具提升管理效率,驱动业务发展,促进业绩增长。在这一过程中,和许多新技术一样,低代码(Low-code)开发被推上…...

SystemVerilog Assertions应用指南 第一章(1.27章节 “within”运算符)
“ within”构造允许在一个序列中定义另一个序列。 seq1 within seq2 这表示seq1在seq2的开始到结束的范围内发生,且序列seq2的开始匹配点必须在seq1的开始匹配点之前发生,序列seq1的结束匹配点必须在seq2的结束匹配点之前结束。属性p32检查序列s32a在信号“ start”的上升沿和…...

2023年09月 C/C++(七级)真题解析#中国电子学会#全国青少年软件编程等级考试
C/C++编程(1~8级)全部真题・点这里 Python编程(1~6级)全部真题・点这里 第1题:红与黑 有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。 时间限…...

[Mono Depth/3DOD]单目3D检测基础
1. 数据增强 图像放缩和裁剪后,相机内参要做相应变化 import random def random_scale(image, calib, scale_range(0.8, 1.2)):scale random.uniform(*scale_range)width, height image.sizeimage image.resize((int(width * scale), int(height * scale)))cal…...

【Docker 内核详解】namespace 资源隔离(三):PID namespace
namespace 资源隔离(三):PID namespace 1.PID namespace 中的 init 进程2.信号与 init 进程3.挂载 proc 文件系统4.unshare() 和 setns() PID namespace 隔离非常实用,它对进程 PID 重新标号,即两个不同 namespace 下的…...

1600*C. Game On Leaves(博弈游戏树)
Problem - 1363C - Codeforces 解析: 我们将目标结点 x 当作树的根,显然,到当 x 的度为 1 的时候,此时行动的人胜利。 我们假设现在的情况为,只剩余三个点,再选择任意一个点,则对方获胜。但是两…...