谷粒商城二十五springCloud之Sleuth+Zipkin 服务链路追踪

news2024/11/20 7:04:23

为什么用

分布式系统庞大而复杂,服务众多,调用关系网也非常复杂,

  1. 服务上线以后如果出现了某些错误,错误的异常就很难定位。
  2. 一个请求可能调用了非常多的链路,我们需要知道到底哪一块儿出现了错误。

最终希望有一个链路追踪系统,我们从每一个请求进来,到它最终的结束,他们中间都调用了多少的微服务,包括每一个服务调用花费了多长时间。

只有最终结合了链路追踪系统,才可以做好熔断降级,通过链路追踪系统发现,某个服务特别慢,但是它还正常运行着,我们就直接给它降级使用,预防我们整个系统的雪崩问题。

微服务架构是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务单元。由于服务单元数量众多,业务的复杂性,如果出现了错误和异常,很难去定位。
主要体现在,一个请求可能需要调用很多个服务,而内部服务的调用复杂性,决定了问题难以定位。
所以微服务架构中,必须实现分布式链路追踪,去跟进一个请求到底有哪些服务参与,参与的顺序又是怎样的,从而达到每个请求的步骤清晰可见,出了问题,很快定位。

所以就非常有必要在分布式系统中,构建一个服务链路追踪系统。

链路追踪组件有 Google 的 Dapper,Twitter 的 Zipkin,以及阿里的 Eagleeye (鹰眼)等,它们都是非常优秀的链路追踪开源组件。

基本术语和流程

  • Span(跨度):基本工作单元,发送一个远程调度任务就会产生一个 Span,Span 是一个 64 位 ID 唯一标识的,Trace 是用另一个 64 位 ID 唯一标识的,Span 还有其他数据信息,比如摘要、时间戳事件、Span 的 ID、以及进度 ID。

  • Trace(跟踪):一系列 Span 组成的一个树状结构。请求一个微服务系统的 API 接口,这个 API 接口,需要调用多个微服务,调用每个微服务都会产生一个新的 Span,所有由这个请求产生的 Span 组成了这个 Trace。

  • Annotation(标注):用来及时记录一个事件的,一些核心注解用来定义一个请求的开始和结束 。这些注解包括以下:

    • cs - Client Sent -客户端发送一个请求,这个注解描述了这个 Span 的开始
    • sr - Server Received -服务端获得请求并准备开始处理它,如果将其 sr 减去 cs 时间戳便可得到网络传输的时间。
    • ss - Server Sent (服务端发送响应)–该注解表明请求处理的完成(当请求返回客户端),如果 ss 的时间戳减去 sr 时间戳,就可以得到服务器请求的时间。
    • cr - Client Received (客户端接收响应)-此时 Span 的结束,如果 cr 的时间戳减去cs 时间戳便可以得到整个请求所消耗的时间。

在这里插入图片描述

  1. 浏览器发送request请求到service1,产生span A,记录trace id,span id,并标识Server Received(代表这个请求是什么时候收到的),service1进行处理。
    因为该请求是浏览器发的,所以不会记录Client Sent。

  2. 接着远程调用service2,将请求发出去,又会产生一个spanB,记录 client sent(发送请求的时间)和Server Received,两者相减就是我们能的传输时间。

  3. service2处理完成后产生spanC(这代表着下一个请求)并并发发出去,就会产生两个不同的span,产生SpanD和spanF,分别记录了client sent。

  4. service3接收到请求记录Server Received,处理完成后又产生spanE,但是我们不再调用远程方法,spanE就可以被舍弃了。
    service3处理完成spanD后记录serverSent,serverSent与serverRecived相减,就是service3处理请求的时间。

  5. 在返回的响应中,记录Client Received,也就是客户端,service2收到的响应时间。

  6. 此时的链路可以追踪到,spanA - spanB - spanD(spanC不算,只是一个业务处理产生的span),然后spanD返回响应。

  7. service4的链路同service3。

判断是网络故障还是服务故障,拿spanF举例,

  • serverSent减serverRecived如果时间超长,那么就是服务出现了问题
  • serverRecived减clientSent如果时间超长,那么就是网络出现了问题

链路中间的传输时间,每一个服务的处理时间,都打了标签,所以我们都能得到这些数据。

标签是有父子关系的,每一个下级标签的父标签都是上级标签。
有父子关系后,就能画出整个调用链的树形结构了,包括它的链路结构。

在这里插入图片描述

springboot整合Sleuth和zipkin

# 服务提供者与消费者导入依赖
# 所以我们直接把依赖导入到common模块中
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-sleuth</artifactId>
        </dependency>

通过 Sleuth 产生的调用链监控信息,可以得知微服务之间的调用链路,但监控信息只输出
到控制台不方便查看。我们需要一个图形化的工具-zipkin。Zipkin 是 Twitter 开源的分布式跟
踪系统,主要用来收集系统的时序数据,从而追踪系统的调用问题。

在这里插入图片描述
zipkin有ui界面,也有相关的api操作,也能把数据存储到一个地方,同时也能收集数据。

zipkin可以把我们服务的数据收集过来,我们服务的客户端就要给它汇报数据,所以我们需要导入zipkin的依赖,我们的客户端就能汇报数据了,汇报来的数据收集到zipkin的服务器里面来做可视化展示。

Zipkin 默认是将监控数据存储在内存的,如果 Zipkin 挂掉或重启的话,那么监控数据就会丢失。所以如果想要搭建生产可用的 Zipkin,就需要实现监控数据的持久化。
而想要实现数据持久化,自然就是得将数据存储至数据库。zipkin支持将数据存储在

  • 内存(默认)
  • MySQL
  • Elasticsearch(我们用这个)
  • Cassandra
 docker run -d -p 9411:9411 openzipkin/zipkin

# 启动zipkin,将数据保存至es中
docker run --env STORAGE_TYPE=elasticsearch --env ES_HOSTS=192.168.56.10:9200
openzipkin/zipkin-dependencies

# 也是导入到common中 
# zipkin中已经导入了sleuth,所以之前的sleuth依赖可以去掉
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

application.properties

spring.cache.type=redis
spring.cache.redis.time-to-live=3600000
spring.cache.redis.use-key-prefix=true
spring.cache.redis.cache-null-values=true


gulimall.thread.core-size=20
gulimall.thread.keep-alive-time=10
gulimall.thread.max-size=200

spring.session.store-type=redis


# actuator 暴露所有资源
management.endpoints.web.exposure.include=*
# sentinel dashboard 地址
spring.cloud.sentinel.transport.dashboard=localhost:8333
# 限流成功指定返回的内容类型
spring.cloud.sentinel.scg.fallback.content-type=application/json
spring.cloud.sentinel.scg.fallback.response-status=400

# 开启feign的sentinel远程保护
feign.sentinel.enabled=true

# 开启debug日志
logging.level.org.springframework.cloud.openfeign=debug
logging.level.org.springframework.cloud.sleuth=debug

# zipkin服务器地址
spring.zipkin.base-url=http://192.168.56.10:9411/
# 关闭服务发现,否则spring cloud会把zipkin的url当作服务名称
spring.zipkin.discovery-client-enabled=false
# zipkin以web http的方式发送数据
spring.zipkin.sender.type=web
# 采样器,默认为0.1,即百分之十,只采样百分之十的请求数据
spring.sleuth.sampler.probability=1

企业的需求是现实性的,因为我们必须要解决现实问题,但教育不应该集中在现实需求上,要面向未来。

https://baijiahao.baidu.com/s?id=1760664270073856317&wfr=spider&for=pc
擦亮花火、共创未来——任正非在“难题揭榜”花火奖座谈会上的讲话
任正非

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java基础学习(16)多线程

Java基础学习多线程 一、多线程1.1 什么是多线程1.2 多线程的两个概念1.2.1 并发 1.3 多线程的实现方式1.4 多线程的成员方法1.5 线程的生命周期 二、线程安全1.6 同步方法1.7 锁lock1.8 死锁1.8 生产者和消费者 (等待唤醒机制)1.9 等待唤醒机制(阻塞队列方式实现&#xff09;1…

IntelliJ IDEA汉化

IntelliJ IDEA汉化 描述解决办法 描述 在开发过程中&#xff0c;我们想让界面现实为汉语&#xff0c;那么我们就需要对IDEA工具进行汉化&#xff0c;目前版本的IDEA汉化都非常简单&#xff0c;请看下述实现步骤。 解决办法 下述汉化方法&#xff0c;全家桶软件都通用。 打开…

attention机制

油管attention机制解释 油管的attention机制视频。 基础形态 如下图所示&#xff0c;假设现在有4个向量&#xff0c; v 1 v_1 v1​到 v 4 v_4 v4​。我们以 v 3 v_3 v3​为视角&#xff0c;看它是怎么得到 y 3 y_3 y3​的。首先用 v 3 v_3 v3​和全部4个向量做点乘&#xff…

不依赖硬件,可以无限扩展的闹钟组件

在实际的开发项目中&#xff0c;很多时候我们需要定时的做一些事情&#xff0c;举例&#xff1a; ①路上的路灯&#xff0c;每天晚上6:00准时打开&#xff0c;每天早上6:00准时关闭&#xff1b;②定时闹钟&#xff0c;起床上班。这些行为其实都是定时任务–闹钟。 大部分单片机…

【MySql】数据库设计过程

目录 概念数据库设计&#xff1a; 逻辑数据库设计&#xff1a; 物理数据库设计&#xff1a; ->需求分析&#xff08;收集需求和理解需求,“源”&#xff09; ->概念数据库设计&#xff08;建立概念模型:"E-R图/IDEF1X"&#xff09; ->逻辑数据库设计&…

idle_in_transaction_session_timeout idle_session_timeout

这两个参数都是用来控制PostgreSQL数据库中会话的超时时间的。 idle_in_transaction_session_timeout idle_in_transaction_session_timeout参数用于控制在事务中处于空闲状态的会话的超时时间。如果一个会话在事务中处于空闲状态超过了指定的时间&#xff0c;则该会话将被终…

Rocky Linux 9.2 正式版发布 - RHEL 下游免费发行版

Rocky Linux 由 CentOS 项目的创始人 Gregory Kurtzer 领导。 请访问原文链接&#xff1a;https://sysin.org/blog/rocky-linux-9/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 以社区方式驱动的企业 Linux Rocky Linux 是…

Android Studio 基础 之 使用 okhttp 长连接,流式获取数据的方法简单整理了

Android Studio 基础 之 使用 okhttp 长连接&#xff0c;流式获取数据的方法简单整理了 目录 Android Studio 基础 之 使用 okhttp 长连接&#xff0c;流式获取数据的方法简单整理了 一、简单介绍 二、实现原理 三、注意事项 四、效果预览 五、实现关键 六、关键代码 七…

2023年服务器数据保护的详细指南

​  无论您经营的是小型个人博客还是日常流量很高的大型企业电子商务网站&#xff0c;安全性都是每个人都关心的问题。虽然粗略的第三方有时间和资源来利用他们在您的系统中发现的任何弱点&#xff0c;但您也可以采取其他措施来提高服务器的安全性并阻止它们。以下是您可以采…

论文笔记:tri-plane 【持续更新】

文章目录 概述Tri-Plane 表达验证 tri-plane 表达 3D GAN 框架CNN生成器backbone以及渲染超分Dual discriminationModeling pose-correlated attributes 实验数据 参考文献 概述 论文名称&#xff1a; Efficient Geometry-aware 3D Generative Adversarial Networks Project pa…

Class 04 - 日期时间格式

Class 04 - 日期时间格式 R语言中的日期和时间格式tidyverse 和 lubridate 功能包简介tidyverse 简介lubridate 简介 加载 tidyverse 和 lubridate 功能包处理日期和时间日期时间的格式获取当前的日期 today()获取当前的时间 now() 字符串格式转换为日期格式ymd()mdy()dmy()字符…

AlmaLinux 9.2 正式版发布 - RHEL 兼容免费发行版

AlmaLinux 9.2 正式版发布 - RHEL 兼容免费发行版 由社区提供的免费 Linux 操作系统&#xff0c;RHEL 兼容发行版。 请访问原文链接&#xff1a;https://sysin.org/blog/almalinux-9/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sys…

一个胖乎乎的3D卡片(有点像捏扁的圆柱体)

先上效果图&#xff08;图片是随机的&#xff0c;可能你们看到的和这个不一样。但效果是相同的&#xff09;&#xff1a; 再上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Titl…

飞浆AI studio人工智能课程学习(1)-大模型时代优质Prompt

文章目录 大模型时代&优质PromptAl生成技术价值概览开始构建你的优质prompt 近十年深度学习模型主要更迭为什么大模型能够有如此强大的表现力大模型与Prompt例1&#xff1a; 画一幅画&#xff0c;呆萌的小猫躺在大泡泡中例2&#xff1a;请生成一张统计图&#xff0c;内容为…

apk自动签名工具

序言 因为360加固&#xff0c;自动签名需要开通VIP&#xff0c;每次加固完了都得手动签名。所以写了个工具。实现通过配置文件配置&#xff0c;拖拽APK自动签名。 支持&#xff1a;V1 V2 V3 V4 签名。通过分析清单文件&#xff0c;自动选择版本。 效果 使用 1.下载jar包 au…

实验室检验系统源码,集检验业务、质量控制、报告、统计分析、两癌等模块于一体

云 LIS 系统针对区域化 LIS 而设计&#xff0c;依托底层云架构&#xff0c;将传统的 LIS 功能模块进行“云化”。 该系统是集检验业务、科室管理、质量控制、报告、统计分析、两癌等模块于一体的数据检验信息平台。通过计算机联网&#xff0c;实现各类仪器数据结果的实时自动接…

新库上线 | CnOpenData舆情云数据

舆情云数据 一、数据简介 网络舆情监测数据是决策者进行数据分析和决策处置的基础。舆情云数据覆盖81000 网站、5600 论坛、1000 平面媒体、2500万 微信账号、3亿 微博账号、300 网络视频、17000 境外媒体、1400万 自媒体账号、2500 新闻客户端、170 电视台 &#xff0c;数据来…

图神经网络:(大型图的有关处理)在Pumbed数据集上动手实现图神经网络

文章说明&#xff1a; 1)参考资料&#xff1a;PYG官方文档。超链。 2)博主水平不高&#xff0c;如有错误还望批评指正。 3)我在百度网盘上传了这篇文章的jupyter notebook和有关文献。超链。提取码8848。 文章目录 Pumed数据集文献阅读继续实验 Pumed数据集 导库 from torch_…

【day2】单片机

目录 【1】GPIO 1.定义 2.应用 I - Input - 输入采集 O - Output - 输出控制 ​编辑 3.GPIO结构框图 4.功能描述 输入功能 输出功能 5.相关寄存器 【2】点亮一盏LED灯 1.实验步骤 2.编程实现 3.编译下载 4.复位上电 练习&#xff1a;实现LED灯闪烁 练习…

Linux - 第15节 - 网络基础(应用层)

1.再谈 "协议" 1.1.协议的概念 协议&#xff0c;网络协议的简称&#xff0c;网络协议是通信计算机双方必须共同遵从的一组约定&#xff0c;比如怎么建立连接、怎么互相识别等。 为了使数据在网络上能够从源到达目的&#xff0c;网络通信的参与方必须遵循相同的规则&…