08.Sleuth(Micrometer)+ZipKin分布式链路追逐

news/2024/10/23 22:17:10/文章来源:https://www.cnblogs.com/changming06/p/18498463

1.Sleuth进入维护模式

替代方案 -> Micrometer Tracing

2.分布式链路追踪概述

2.1 出现背景

在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的服务节点调用来协调产生最后的结果,每一个前端请求都会形成一条复杂的分布式服务调用链路,链路中的任何一环出现高延时或错误都会引起整个请求最后的失败。

随着系统的复杂化,导致微服务的增多,调用链路的变长

2.2 要解决的问题

在大规模分布式与微服务集群下,如何实时的观测系统的整体调用链路情况、如何快速发现并定位到问题、如何尽可能精确的判断故障对系统的影响范围与影响程度、如何尽可能精确的梳理出服务之间的依赖关系,并判断出服务之间的依赖关系是否合理、如何尽可能精确的分析整个系统调用链路的性能与瓶颈点、如何尽可能精确的分析系统的存储瓶颈与容量规划。

分布式链路追踪技术要解决的问题,分布式链路追踪(Distributed Tracing),就是将一次分布式请求还原成调用链路,进行日志记录,性能监控并将一次分布式请求的调用情况集中展示。比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。

3.新一代Spring Cloud Sleuth:Micrometer

3.1 相关地址

Micrometer官网

Sleuth官网

Sleuth_GItHub地址

Spring Cloud Sleuth will not work with Spring Boot 3.x onward. The last major version of Spring Boot that Sleuth will support is 2.x.

GitHub介绍,Spring Clour Sleuth不支持SpringBoot 3.x。

3.2 ZipKin

Micrometer负责收集数据,ZipKin复杂数据的展现。因为收集到的数据是一个个节点,不直观。

3.3 小总结

将前端请求到,后端系统响应结果的这个过程中,所走过的分布式节点,进行日志记录和性能监控,并进行Web展示。

3.4 其他的分布式链路追踪的解决方案

技术 说明
Cat 由大众点评开源,基于Java开发的实时应用监控平台,包括实时应用监控,业务监控。集成方案是通过代码埋点的方式来实现监控,比如:拦截器,过滤器等。对代码的侵入性很大,集成成本较高。风险较大。
ZipKin 由大众点评开源,基于Java开发的实时应用监控平台,包括实时应用监控,业务监控。集成方案是通过代码埋点的方式来实现监控,比如:拦截器,过滤器等。对代码的侵入性很大,集成成本较高。风险较大。
Pinpoint Pinpoint是一款开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能强大,接入端无代码侵入。
Skywalking Skywalking是国人开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能较强,接入端无代码侵入。

4.分布式链路追踪原理

一条链路通过Trace Id唯一标识,Span标识发起的请求信息,各span通过parent id 关联起来

5.Zipkin

5.1 官网

https://zipkin.io

5.2 概述

Zipkin是一种分布式链路跟踪系统图形化的工具,Zipkin 是 Twitter 开源的分布式跟踪系统,能够收集微服务运行过程中的实时调用链路信息,并能够将这些调用链路信息展示到Web图形化界面上供开发人员分析,开发人员能够从ZipKin中分析出调用链路中的性能瓶颈,识别出存在问题的应用程序,进而定位问题和解决问题。

5.3 下载地址

https://zipkin.io/pages/quickstart.html

In this section we’ll walk through building and starting an instance of Zipkin for checking out Zipkin locally. There are three options: using Java, Docker or running from source.

java 方式,下载的是jar包,直接执行就好。

6.案例

6.1 Micrometer和Zipkin分工

Micrometer 采集数据,Zipkin图像展示

6.2 总体父工程POM

新增的

<properties><micrometer-tracing.version>1.2.0</micrometer-tracing.version><micrometer-observation.version>1.12.0</micrometer-observation.version><feign-micrometer.version>12.5</feign-micrometer.version><zipkin-reporter-brave.version>2.17.0</zipkin-reporter-brave.version>
</properties><!--micrometer-tracing-bom导入链路追踪版本中心  1-->
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-tracing-bom</artifactId><version>${micrometer-tracing.version}</version><type>pom</type><scope>import</scope>
</dependency>
<!--micrometer-tracing指标追踪  2-->
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-tracing</artifactId><version>${micrometer-tracing.version}</version>
</dependency>
<!--micrometer-tracing-bridge-brave适配zipkin的桥接包 3-->
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-tracing-bridge-brave</artifactId><version>${micrometer-tracing.version}</version>
</dependency>
<!--micrometer-observation 4-->
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-observation</artifactId><version>${micrometer-observation.version}</version>
</dependency>
<!--feign-micrometer 5-->
<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-micrometer</artifactId><version>${feign-micrometer.version}</version>
</dependency>
<!--zipkin-reporter-brave 6-->
<dependency><groupId>io.zipkin.reporter2</groupId><artifactId>zipkin-reporter-brave</artifactId><version>${zipkin-reporter-brave.version}</version>
</dependency>

由于Micrometer Tracing是一个门面工具自身并没有实现完整的链路追踪系统,具体的链路追踪另外需要引入的是第三方链路追踪系统的依赖。

引入组件说明

micrometer-tracing-bom:导入链路追踪版本中心,体系化说明

micrometer-tracing:指标追踪

micrometer-tracing-bridge-brave:一个Micrometer模块,用于与分布式跟踪工具 Brave 集成,以收集应用程序的分布式跟踪数据。Brave是一个开源的分布式跟踪工具,它可以帮助用户在分布式系统中跟踪请求的流转,它使用一种称为"跟踪上下文"的机制,将请求的跟踪信息存储在请求的头部,然后将请求传递给下一个服务。在整个请求链中,Brave会将每个服务处理请求的时间和其他信息存储到跟踪数据中,以便用户可以了解整个请求的路径和性能。

micrometer-observation:一个基于度量库 Micrometer的观测模块,用于收集应用程序的度量数据。

feign-micrometer:一个Feign HTTP客户端的Micrometer模块,用于收集客户端请求的度量数据。

zipkin-reporter-brave:一个用于将 Brave 跟踪数据报告到Zipkin 跟踪系统的库。

补充包:spring-boot-starter-actuator SpringBoot框架的一个模块用于监视和管理应用程序。

6.3 服务提供者8001修改

6.3.1 pom修改

micrometer-tracing-bom不用引入

<!--micrometer-tracing指标追踪  1-->
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-tracing</artifactId>
</dependency>
<!--micrometer-tracing-bridge-brave适配zipkin的桥接包 2-->
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-tracing-bridge-brave</artifactId>
</dependency>
<!--micrometer-observation 3-->
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-observation</artifactId>
</dependency>
<!--feign-micrometer 4-->
<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-micrometer</artifactId>
</dependency>
<!--zipkin-reporter-brave 5-->
<dependency><groupId>io.zipkin.reporter2</groupId><artifactId>zipkin-reporter-brave</artifactId>
</dependency>
6.3.2 YML修改
# ========================zipkin===================
management:zipkin:tracing:endpoint: http://localhost:9411/api/v2/spanstracing:sampling:probability: 1.0 #采样率默认为0.1(0.1就是10次只能有一次被记录下来),值越大收集越及时。
6.3.3 新建PayMicrometerController
import cn.hutool.core.util.IdUtil;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;public class PayMicrometerController {/*** Micrometer(Sleuth)进行链路监控的例子* @param id* @return*/@GetMapping(value = "/pay/micrometer/{id}")public String myMicrometer(@PathVariable("id") Integer id){return "Hello, 欢迎到来myMicrometer inputId:  "+id+" \t    服务返回:" + IdUtil.simpleUUID();}
}

6.4 API接口PayFeignApi修改

@GetMapping(value = "/pay/micrometer/{id}")
String myMicrometer(@PathVariable("id") Integer id);

6.5 服务调用者80修改

6.5.1 POM
 <!--micrometer-tracing指标追踪  1-->
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-tracing</artifactId>
</dependency>
<!--micrometer-tracing-bridge-brave适配zipkin的桥接包 2-->
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-tracing-bridge-brave</artifactId>
</dependency>
<!--micrometer-observation 3-->
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-observation</artifactId>
</dependency>
<!--feign-micrometer 4-->
<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-micrometer</artifactId>
</dependency>
<!--zipkin-reporter-brave 5-->
<dependency><groupId>io.zipkin.reporter2</groupId><artifactId>zipkin-reporter-brave</artifactId>
</dependency>
6.5.2 YML修改
# zipkin图形展现地址和采样率设置
management:zipkin:tracing:endpoint: http://localhost:9411/api/v2/spanstracing:sampling:probability: 1.0 #采样率默认为0.1(0.1就是10次只能有一次被记录下来),值越大收集越及时。
6.5.3 业务类修改
import com.atguigu.cloud.apis.PayFeignApi;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@RestController
@Slf4j
public class OrderMicrometerController
{@Resourceprivate PayFeignApi payFeignApi;@GetMapping(value = "/feign/micrometer/{id}")public String myMicrometer(@PathVariable("id") Integer id){return payFeignApi.myMicrometer(id);}
}

7.测试

访问 localhost:x/feign/micrometer/1,会看到

{"code":"500","message":"No fallback available.","data":null,"timestamp":1729692505995}

进入http://localhost:9411/

可以看到依赖关系,以及执行时间等

从本章节,也可以看出来,约定大于配置的思想体现,事先配置好各组件的版本信息,事半功倍。

只是为了记录自己的学习历程,且本人水平有限,不对之处,请指正。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sream

构建 arrays.stream(数组) 根据数组构建 collection.stream 根据集合构建 stream.of 根据对象创建 生成 Instream.range(a,b) 合并 stream.concat(流1,流2)

SvnKit提交代码

官网地址:https://svnkit.com/documentation.html#high-level-api svnkit提交代码提供的API 官方api地址 官网地址:https://svnkit.com/javadoc/org/tmatesoft/svn/core/wc/SVNClientManager.html 官方案例地址 https://wiki.svnkit.com/Committing_To_A_Repository svnkit调…

基于ubuntu配置环境时遇到的问题

新手都会遇到的配置问题:问了一下,具体原因是 连不上archive.ubuntu.com 解决方案是: 查找一下IP地址,然后ping一下 在 Ubuntu 中查找地址的指令是 $ ip addr show但是我先不ping,我先用vi讲我原来的源注释掉!(PS:这里真的很小心,一直在normal和insert模式下来回切换!!…

线性 DP

最长上升子序列问题是一个经典的线性动态规划问题。 例题:B3637 最长上升子序列 分析:设原始数组为 \(a\),定义状态 \(dp_i\) 表示以 \(a_i\) 结尾的上升子序列的最大长度。注意这个状态定义中有两个重点,第一个重点是 \(dp_i\) 只维护所有原始序列中以 \(a_i\) 结尾的上升…

20222422 2024-2025-1 《网络与系统攻防技术》实验三实验报告

一、实验内容 1、方法对后门实验中的msf编码器进行进一步的探索使用,使用msfvenom指令生成如jar之类的文件,从而尝试达到免杀的目的; 通过Veil等工具对目标程序进行加壳或者其他操作来实现免杀; 使用C+ShellCode编程实现免杀;2、应用 通过组合应用各种技术尽可能地实现恶意…

Java 解析 XML 转换为 Json

我们使用 Java 开发项目时偶尔会需要使用到 Xml 文件的解析, 一般情况下都会使用 DOM4j、SAX、JDOM 等方案,但这些方案比较代码编写较为繁琐。我们经常使用的 Json 进行数据传输或存储,如果能够将 Xml 快速转换为 Json,将会大大减轻我们后续开发和维护的工作量。 本篇博客简…

热力学与统计力学

统计力学 泊松分布 \[P(k,\lambda)=\frac{\lambda e^{-k}}{k!} \]其中\(\lambda\)是期望的事件数,k是观测到的事件数。 玻尔兹曼分布 \[P_i=\frac{e^{-\beta E_i}}{Z} \]其中\(P_i\)是状态i的概率,\(\beta=\frac{1}{KT}\) Z是配分函数\(Z=\sum_j e^{-\beta E_j}\) 麦克斯韦-玻…

20222409 2024-2025-1 《网络与系统攻防技术》实验二实验报告

1.实验内容 1.1 本周学习内容后门技术:学习了后门的定义及其在网络安全中的作用。后门是一种隐秘的进入方式,允许攻击者绕过正常的认证机制,获取系统访问权限。在实验中实践了如何利用后门获取shell。 netcat:可以用于创建TCP/UDP连接,实现远程shell访问和文件传输。 soca…

经典力学

经典力学 概述 包括运动学和动力学,附加一套分析力学的语言其实就是这一部分的全部核心了。利用最基础的力、能量、动量、速度、加速度等概念再加上目前的这些基本定理自己就可以解决所有的经典力学问题。不过应试的时候还是需要我们去背记一些模型甚至是公式以便加快解题速度…

宝塔面板安装教程

安装前请确保是【全新的机器】,没有安装其他任何环境,否则会影响您的业务使用! 填写好服务器信息,点击“立即安装到服务器”即全自动完成安装,在安装过程中请勿刷新页面! 数据传输过程中加密处理,不保存任何账号密码信息,请放心使用。 系统兼容性推荐:CentOS 7.x >…

FEE-Frontiers in Ecology and Evolution

Frontiers in Ecology and Evolution是一本经同行评议的基础科学和应用科学研究期刊,为自然和人类世界提供生态学和进化的见解。@目录一、征稿简介二、重要信息三、服务简述四、投稿须知 一、征稿简介二、重要信息期刊官网:https://ais.cn/u/3eEJNv三、服务简述 Frontiers in…

实验2 C++

任务1: t.h1 #pragma once2 3 #include <string>4 5 // 类T: 声明6 class T {7 // 对象属性、方法8 public:9 T(int x = 0, int y = 0); // 普通构造函数 10 T(const T &t); // 复制构造函数 11 T(T &&t); // 移动构造函数 12 ~T(…