为什么需要在微服务中使用链路追踪?Spring Cloud 可以选择哪些微服务链路追踪方案?

ops/2024/9/20 7:08:25/ 标签: 微服务, spring cloud, 架构

引言:在当今的软件开发领域中,微服务架构已经成为了构建大型应用程序的主流方式之一。随着微服务数量的增加和服务之间复杂性的提高,对于了解和监控服务之间的调用关系变得越来越重要。而链路追踪技术的出现,为解决这一难题提供了有效的方法。

题目

为什么需要在微服务中使用链路追踪?Spring Cloud 可以选择哪些微服务链路追踪方案?

推荐解析

微服务系统中,少则五六个服务,多则上百个服务,如果某个环节出现问题了,一次调用可能涉及到很多服务,如果服务之间的日志没有关联,那么排查起来非常困难,这个时候就需要链路追踪。

链路追踪可以可视化地追踪请求从一个微服务到另一个微服务的调用情况,从而帮助问题的排查。另外一个方面就是链路追踪还可以帮助优化性能,可视化服务之间的依赖关系,并进行服务的监控与报警。

简单的实现就是在日志中定义一个统一的 TraceId, 串联整体调用链路,每个服务之间还会定义一个 spanId,标志服务内的调用链路。

Spring Cloud 有哪些链路追踪方案?

Spring Cloud 提供了很多的微服务链路追踪方案,以下是一些常见的方案:

1)Zipkin: ZipKin 是 Twitter 开源的一个实现分布式实时追踪系统,SpringCloud Sleuth 提供了与 Zipkin 的集成,通过在微服务中添加相关的依赖和配置,将追踪信息发送给 Zipkin 服务器,并且通过 Zipkin UI 实现可视化展示以及查询。

2)Jaeger:Jaeger 是 Uber 开源的分布式追踪系统,也被纳入了 CNCF(云原生计算基金会)的维护。通过使用 SpringCloud Sleuth 和 Jaeger 客户端,将追踪信息发送到 Jaeger 实现监控信息的可视化。

3)SkyWalking:SkyWalking 是 Apache 开源的一款应用系统监控与分析的工具,它提供了对 Java、Go、C++ 等多种语言的支持,并且可以与 Spring Cloud Sleuth 集成,将追踪数据发送到 SkyWalking 服务器进行可视化展示以及分析。

以上这些方案都可以和 Spring Cloud Sleuth 进行集成,然后完成链路追踪功能的实现。

链路追踪的作用

1)识别性能瓶颈

链路追踪可以帮助团队识别整个系统中的性能瓶颈。通过追踪每个服务的执行时间,可以直观地看到哪些服务或组件在处理请求时耗时较长。开发人员可以通过查看请求的调用链路,定位到特定的服务或操作,从而找到导致延迟的原因。

2)分析请求路径

链路追踪允许分析请求从开始到结束的完整路径,包括跨服务调用的所有步骤。这种详细的路径分析帮助团队了解请求处理过程中的延迟在哪里发生,是在数据传输过程中、在数据库查询中,还是在服务逻辑处理阶段。

3)优化资源使用

链路追踪提供的数据可以帮助团队优化资源使用。例如,通过分析哪些服务的调用最频繁,可以合理配置资源,确保高频服务有足够的资源支持,而不至于因为资源不足导致响应时间增加。

4)监控服务依赖关系

微服务架构中的服务通常依赖于其他服务。链路追踪帮助团队可视化服务之间的依赖关系,识别哪些服务是性能关键路径上的瓶颈。这些信息对于优化服务架构、减少服务间的延迟和提高整体性能非常重要。

5)异常检测和响应

链路追踪不仅有助于性能优化,还可以帮助检测异常行为。例如,如果某个服务的响应时间突然增加,这可能是由于异常条件或错误的处理逻辑。通过链路追踪,团队可以迅速定位问题的根源,并进行及时修复。

简单 Demo

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.sleuth.Span;
import org.springframework.cloud.sleuth.Tracer;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class MyController {@Autowiredprivate Tracer tracer;@GetMapping("/hello")public String hello() {// 创建一个Span表示一个操作Span span = tracer.nextSpan().name("sayHello").start();try {// 在Span中添加自定义标签span.tag("custom-tag", "hello-tag");// 模拟处理请求的逻辑Thread.sleep(100);return "Hello World!";} catch (InterruptedException e) {e.printStackTrace();return "Error!";} finally {// 结束Spanspan.end();}}
}

其他补充

鱼聪明 AI 的回答:

鱼聪明 AI 地址:https://www.yucongming.com/

链路追踪是一种监控和分析分布式系统中请求调用的方式,通过跟踪一个请求在系统中的传递路径,从而帮助开发人员和运维人员理解系统的结构和性能瓶颈。下面将详细介绍链路追踪的实现原理和技术细节:

1. TraceId 和 SpanId

  • TraceId: TraceId 是整个请求调用链路的唯一标识符,用于标识一次完整的请求。当一个请求进入系统时,系统会为该请求生成一个唯一的 TraceId,并将其在整个调用链路中传递。
  • SpanId: SpanId 用于标识一个请求在调用链路中的某个环节,比如一个服务的调用或者一个数据库操作。在调用链路中,每个服务或者组件都会生成一个唯一的 SpanId,并将其与 TraceId 关联起来。

2. 传递方式

链路追踪通过在请求中携带 TraceId 和 SpanId 来实现跨服务的追踪,通常有以下几种传递方式:

  • HTTP Header: 在 HTTP 请求的 Header 中添加特定的字段来传递 TraceId 和 SpanId,比如 X-Trace-IdX-Span-Id
  • 日志埋点: 在每个服务的日志中添加 TraceId 和 SpanId,并在服务间调用时传递日志,通过日志解析的方式来获取调用链路信息。
  • RPC 协议支持: 一些 RPC 框架(如 gRPC)会直接支持链路追踪,可以通过配置来实现自动传递 TraceId 和 SpanId。

3. 采样策略

由于系统中的请求可能非常频繁,如果对所有请求都进行链路追踪可能会对系统性能产生较大影响。因此,通常会采用采样策略来决定哪些请求需要进行链路追踪,哪些请求可以被忽略。常见的采样策略有以下几种:

  • 固定采样: 按照一定比例对请求进行采样,比如每 1000 个请求中采样一个。
  • 动态采样: 根据系统的负载情况和性能要求动态调整采样率,以保证系统的性能和资源利用率。

4. 数据存储和展示

链路追踪收集到的数据通常会被存储到后端存储系统中,并通过可视化界面展示给用户。常见的存储系统包括 Elasticsearch、HBase 等,而展示界面则可以是 Web 界面或者专门的链路追踪工具(如 Zipkin、Jaeger 等)。

5. 集成与扩展

链路追踪通常会与系统中的其他监控和管理工具集成,比如日志系统、监控系统、报警系统等,以实现全面的系统监控和管理。同时,链路追踪还可以通过扩展来支持更多的功能,比如异常追踪、性能分析等。

通过以上技术细节和实现原理,链路追踪可以帮助开发人员和运维人员更好地理解系统的结构和性能特征,从而提高系统的可靠性和可维护性。

欢迎交流

本文主要介绍微服务的链路追踪常见方案,以及为什么要有链路追踪,关于 SpringCloud 的知识,大家可以多去尝试使用一些开源的热门框架实现一些小 Demo 即可,在文末还有三个问题,欢迎小伙伴在评论区进行留言回答,近期面试鸭小程序已全面上线,想要刷题的小伙伴可以积极参与!

1)链路追踪系统通常会带来一定的性能开销,尤其是在高流量和复杂的微服务架构中。这些开销包括额外的网络传输、存储成本以及处理时间。你的系统中如何管理链路追踪的性能开销?有没有采取一些优化措施来减少这种开销?

2)你的系统是如何应对这种分布式跟踪的挑战的?你采用了哪些工具或技术来实现跨服务的链路追踪?

3)如何确保链路追踪系统中的数据隐私和安全性?


http://www.ppmy.cn/ops/48566.html

相关文章

把服务器上的镜像传到到公司内部私有harbor上,提高下载速度

一、登录 docker login https://harbor.cqxyy.net/ -u 账号 -p 密码 二、转移镜像 minio 2024.05版 # 指定tag docker tag minio/minio:RELEASE.2024-05-10T01-41-38Z harbor.cqxyy.net/customer-software/minio:RELEASE.2024-05-10T01-41-38Z# 推送镜像 docker push harbo…

【TensorFlow深度学习】DQN(Deep Q-Network)算法详解

DQN&#xff08;Deep Q-Network&#xff09;算法详解 DQN&#xff08;Deep Q-Network&#xff09;算法详解&#xff1a;深度强化学习的里程碑DQN算法原理代码实现结语 DQN&#xff08;Deep Q-Network&#xff09;算法详解&#xff1a;深度强化学习的里程碑 在强化学习的浩瀚宇…

动态防护开启教程和体验感受

动态防护是雷池 WAF 社区版在版本 [6.0.0] 中新增的一个功能&#xff0c;它属于站点高级防护的一部分。动态防护的主要作用是自动动态加密网站的 HTML 和 JavaScript 源码&#xff0c;目的是阻止爬虫和攻击自动化程序的分析。这项功能在 [6.0.0] 版本中标记为 BETA 版本&#x…

Rust anyhow 简明教程

anyhow 是 Rust 中的一个库&#xff0c;旨在提供灵活的、具体的错误处理能力&#xff0c;建立在 std::error::Error 基础上。它主要用于那些需要简单错误处理的应用程序和原型开发中&#xff0c;尤其是在错误类型不需要被严格区分的场景下。 以下是 anyhow 的几个关键特性&…

陕西移动联合中兴通讯,赋能5G RedCap智慧工厂建设

前不久&#xff0c;陕西移动联合中兴通讯、高新兴等产业伙伴在中兴通讯西安智能终端生产基地顺利完成5G RedCap在智慧工厂的应用实践。本次实践证明了5G RedCap在智慧工厂场景下的应用可行性&#xff0c;为RedCap在工业智能制造行业的应用打下基础。   5G RedCap技术是5G-A实现…

Ubuntu软件操作的相关命令

更新源 : sudo apt-get update 安装包 : sudo apt-get install package 删除包 : sudo apt-get remove package 搜索软件包 : sudo apt-cache search package 获取包的相关信息&#xff0c;如说明、⼤⼩、版本等 : sudo apt-cache show package 重新安装包 : sudo apt-get…

机器视觉:光源的类型以及主要参数

光源在机器视觉中起着决定性的作用&#xff0c;决定了视觉算法的复杂性&#xff0c;也决定了视觉系统的精度和稳定性。光源用于突出目标物体的特征&#xff0c;增加目标物体与背景的对比度&#xff0c;克服环境光线的干扰。光源的选择与打光方式在视觉系统的前期评估中非常重要…

spring和Mybatis的各种查询

文章目录 六**、MyBatis的各种查询功能**6.1、查询一个实体类的对象6.2、查询一个list集合6.3、查询单个数据6.4、查询一条数据为Map集合6.5、查询多条数据为Map集合 七、**特殊SQL的执行**7.1、模糊查询7.2、批量删除7.3、动态设置表名7.4、添加功能获取自增的主键 八、**自定…

攻防演练之-成功的钓鱼邮件溯源

书接上文&#xff0c;《网络安全攻防演练风云》专栏之攻防演练之-网络安全产品大巡礼二&#xff0c;这里。 演练第一天并没有太大的波澜&#xff0c;白天的时间过得很快。夜色降临&#xff0c;攻防演练中心内的灯光依旧明亮。对于网络安全团队来说&#xff0c;夜晚和白天并没有…

如何把路由器设备的LAN口地址为三大私网地址

要将路由器的LAN口地址配置为三大私有IP地址范围之一&#xff08;10.0.0.0/8、172.16.0.0/12 或 192.168.0.0/16&#xff09;&#xff0c;我们需要访问路由器的管理界面并进行相应的设置。 下面是步骤&#xff1a; 连接到路由器&#xff1a; 连接到路由器的管理界面&#xf…

Flutter基础 -- Flutter容器布局

目录 1. MaterialApp 1.1 组件定义 1.2 主要功能和属性 1.3 示例 2. 脚手架 Scaffold 2.1 定义 2.2 Scaffold 的属性 2.3 示例 PS: 对于 Scaffold 和 MaterialApp 3. 线性布局 Column Row 3.1 Row 3.2 Column 4. 盒模型 Box Model 4.1 定义 4.2 示例 5. 容器 C…

C#——类和对象详情

类和对象 类 类是一种数据结构&#xff0c;它可以包含数据成员&#xff08;常量和字段&#xff09;、函数成员&#xff08;方法、属性、事件、索引器、运算符、实例构造函数、静态构造函数和析构函数&#xff09;以及嵌套类型。类类型支持继承&#xff0c;继承是一种机制&…

深入讲解Java线程中 wait 和 notify 的用法和原理

基本概念 wait 和 notify 是 Java 中用于线程间通信的方法&#xff0c;定义在 Object 类中。它们的主要作用是在多线程环境中协调线程的执行顺序。 wait 方法 作用&#xff1a;使当前线程进入等待状态&#xff0c;直到其他线程调用 notify 或 notifyAll 方法唤醒它。调用条件…

【车载音视频电脑】嵌入式AI分析车载DVR,支持8路1080P

产品特点 采用H.265 & H.264编解码&#xff0c;节约存储空间、传输流量&#xff1b; 高分辨率&#xff1a;支持8路1080P*15FPS/4路1080P*30FPS、720P、D1等编解码&#xff1b; 支持1张SATA硬盘&#xff0c;取用方便&#xff0c;满足大容量存储要求&#xff1b; 支持1个…

[word] word表格如何设置外框线和内框线 #媒体#笔记

word表格如何设置外框线和内框线 点击表格的左上角按钮从而选中表格 点击边框按钮边上的下拉箭头&#xff0c;选择边框和底纹 点击颜色边上的下拉箭头&#xff0c;选择红色 点击取消掉中间的边框&#xff0c;只保留外围边框 点击颜色边上的下拉箭头&#xff0c;选择另外一个颜…

common.js和es6中模块引入的区别

common.js CommonJS 是一种模块系统&#xff0c;主要用于 Node.js 环境。它使用 require 函数来引入模块&#xff0c;并使用 module.exports 来导出模块。 语法&#xff1a; 导出模块&#xff1a; // moduleA.js const name Jo; module.exports name;// 或者导出一个对象…

openlayers 绘图功能,编辑多边形,长度面积测量,tip提示(七)

本篇介绍一下使用openlayers添加tips&#xff0c;比如测量时&#xff0c;实时显示长度、面积等&#xff0c;两种方法&#xff1a; 使用Overlay&#xff0c;会添加指定的HTML元素到dom中&#xff0c;会跟随地图的平移】缩放等动作使用vector样式&#xff0c;会渲染到地图的canv…

【十大排序算法】归并排序

归并排序&#xff0c;如同秋日落叶&#xff0c;分散而细碎&#xff0c; 然而风吹叶动&#xff0c;自然而有序&#xff0c; 彼此相遇&#xff0c;轻轻合拢&#xff0c; 最终成就&#xff0c;秩序之谧。 文章目录 一、归并排序二、发展历史三、处理流程四、算法实现五、算法特性…

使用C#快速搭建一个在windows运行的exe应用

文章目录 一、前言1.1 编写语言需要工具1.2 选择自己需要的组件进行安装 二、新建项目1.1 新建一个 .NET4.x 的项目1.2 添加一个小案例1.3 对界面进行美化1.3.1、配置Form属性1.3.2、配置Button按钮 1.4 查看组将的相关代码 三、后记 一、前言 这是一个比较旧的内容&#xff0…

Redis宣布商用后,Redis国产化替代方案有那些?

一、背景 Redis作为使用最为广泛的开源缓存中间件&#xff0c;现已成为IT开发中必不可少的核心组件。官方修改协议印证了“开源”不意味着“无偿使用”&#xff0c;相关限制或将对基于开源Redis提供中间件产品的厂商&#xff0c;及提供Redis服务的云厂商产生一定影响。 二、国…