分布式链路追踪之SkyWalking

news2024/11/16 15:45:08

一 链路追踪简介

  在微服务架构中,一次请求往往涉及到多个模块,多个中间件,多台机器的相互协作才能完成。这一系列调用请求中,有些是串行的,有些是并行的,那么如何确定这个请求背后调用了哪些应用,哪些模块,哪些节点及调用的先后顺序?如何定位每个模块的性能问题?本文将为你揭晓答案。
  衡量一个接口的性能好坏,一般我们至少会关注以下三个指标

  • 接口的RT (响应时间) 你怎么知道?
  • 是否有异常响应?
  • 主要慢在哪里?

1.1 传统的单体架构

在初期,公司刚起步的时候,可能多会采用如下单体架构,对于单体架构我们该用什么方式来计算以上三个指标呢?
在这里插入图片描述
最容易想到的显然是用 AOP:
在这里插入图片描述

1.2 微服务架构

在单体架构中由于所有的服务,组件都在一台机器上,所以相对来说这些监控指标比较容易实现,不过随着业务的快速发展,单体架构必然会朝微服务架构发展,如下:
在这里插入图片描述
如果有用户反馈某个页面很慢,我们知道这个页面的请求调用链是 A -----> C -----> B -----> D,此时如何定位可能是哪个模块引起的问题。每个服务 Service A,B,C,D 都有好几台机器。怎么知道某个请求调用了服务的具体哪台机器呢?
在这里插入图片描述
如图所示可发现微服务接口调用存在以下几个问题:

  • 排查问题难度大,周期长
  • 特定场景难复现
  • 系统性能瓶颈分析较难

分布式调用链就是为了解决以上几个问题而生,它主要的作用如下:

  • 自动采取数据
  • 分析数据产生完整调用链:有了请求的完整调用链,问题有很大概率可复现
  • 数据可视化:每个组件的性能可视化,能帮助我们很好地定位系统的瓶颈,及时找出问题所在

通过分布式追踪系统能很好地定位如下请求的每条具体请求链路,从而轻易地实现请求链路追踪,每个模块的性能瓶颈定位与分析。
在这里插入图片描述

1.3 分布式调用链路标准 - openTracing

知道了分布式调用链的作用,那我们来看下如何实现分布式调用链的实现及原理, 首先为了解决不同的分布式追踪系统 API 不兼容的问题,诞生了 OpenTracing 规范,OpenTracing 是一个轻量级的标准化层,它位于应用程序/类库和追踪或日志分析程序之间
在这里插入图片描述
这样 OpenTracing 通过提供平台无关,厂商无关的 API,使得开发人员能够方便地添加追踪系统的实现。
说到这大家是否想过 Java 中类似的实现?还记得 JDBC 吧,通过提供一套标准的接口让各个厂商去实现,程序员即可面对接口编程,不用关心具体的实现。这里的接口其实就是标准,所以制定一套标准非常重要,可以实现组件的可插拔。
在这里插入图片描述
接下来我们来看 OpenTracing 的数据模型,主要有以下三个

  • Trace:一个完整请求链路
  • Span:一次调用过程(需要有开始时间和结束时间)
  • SpanContext:Trace 的全局上下文信息, 如里面有traceId

理解这三个概念非常重要,为了让大家更好地理解这三个概念,我特意画了一张图。
在这里插入图片描述
如图所示,一次下单的完整请求完整就是一个 Trace, 显然对于这个请求来说,必须要有一个全局标识来标识这一个请求,每一次调用就称为一个 Span,每一次调用都要带上全局的 TraceId, 这样才可把全局 TraceId 与每个调用关联起来,这个 TraceId 就是通过 SpanContext 传输的,既然要传输显然都要遵循协议来调用。如图示,我们把传输协议比作车,把 SpanContext 比作货,把 Span 比作路应该会更好理解一些。

理解了这三个概念,接下来我看看分布式追踪系统如何采集统一图中的微服务调用链。
在这里插入图片描述
我们可以看到底层有一个 Collector 一直在默默无闻地收集数据,那么每一次调用 Collector 会收集哪些信息呢。

  1. 全局 trace_id:这是显然的,这样才能把每一个子调用与最初的请求关联起来
  2. span_id: 图中的 0,1,1.1,2,这样就能标识是哪一个调用
  3. parent_span_id:比如 b 调用 d 的 span_id 是 1.1,那么它的 parent_span_id 即为 a 调用 b 的 span_id 即 1,这样才能把两个紧邻的调用关联起来。

有了这些信息,Collector 收集的每次调用的信息如下
在这里插入图片描述
于是一个完整的分布式追踪系统就实现了。

以上实现看起来确实简单,但有以下几个问题需要我们仔细思考一下

  • 怎么自动采集 span 数据:自动采集,对业务代码无侵入
  • 如何跨进程传递 context
  • traceId 如何保证全局唯一
  • 请求量这么多采集会不会影响性能

接下我来看看 SkyWalking 是如何解决以上四个问题的

1.4 常见的分布式链路追踪方案实现

目前市场上比较常见的链路追踪方案如下:

  • Zipkin是Twitter开源的调用链分析工具,目前基于springcloud sleuth得到了广泛的使用,特点是轻量,使用部署简单。
  • Pinpoint是韩国人开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能强大,接入端无代码侵入。
  • SkyWalking 是本土开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能较强,接入端无代码侵入。目前已加入Apache孵化器。
  • CAT(Central Application Tracking)是大众点评开源的基于编码和配置的调用链分析,应用监控分析,日志采集,监控报警等一系列的监控平台工具。
  • jaeger 受到Dapper和OpenZipkin的启发,是由Uber Technologies创建 并捐赠给Cloud Native Computing Foundation的分布式追踪平台。
类别ZipkinPinpointskywalkingCATjaeger
实现方式拦截请求,发送(http,mq)数据到zipkin服务java探针,字节码增强java探针,字节码增强代码埋点(拦截器,注解,过滤器)拦截请求
主要支持语言JavaJavaJava/c/c++/python/GO/Node/PHP/.NET/nginxJava/c/c++/python/GO/nodego
接入方式基于linkerd或者sleuth方式,引入配置即可java agent字节码java agent字节码代码侵入拦截侵入
agent到collector的协议http,mqthriftgRPChttp/tcpudp/http
openTracing××
颗粒度接口级别方法级别方法级别代码级别接口级别
全局调用统计××
traceId查询××
报警××
JVM监控×××
健壮度********************
数据存储ES,mysql,Cassandra,内存HbaseES,H2mysql,hdfsES,kafka,cassandra,内存
社区活跃度15.2k12.4k20.2k17.2k16.3k

PinPoint和SkyWalking支持的插件对比

类别PinpointSkywalking
web容器Tomcat6/7/8,Resin,Jetty,JBoss,WebsphereTomcat7/8/9,Resin,Jetty
JDBCOracle,mysqlOracle,mysql,Sharding-JDBC
消息中间件ActiveMQ,RabbitMQRocketMQ 4.x,Kafka
日志log4j, Logbacklog4j,log4j2, Logback
HTTP库Apache HTTP Client,GoogleHttpClient,OkHttpClientApache HTTP Client, OkHttpClient,Feign
Spring体系spring,springbootspring,springboot,eureka,hystrix
RPC框架Dubbo,ThriftDubbo,Motan,gRPC,ServiceComb
NOSQLMemcached, Redis, CASSANDRAMemcached,Redis

二 SkyWalkking的原理和架构设计

节点数据的定时采样,采样后将数据定时上报,将其存储到 ES, MySQL 等持久化层,有了数据自然而然可根据数据做可视化分析。
在这里插入图片描述

2.1 skywalking的工作机制

skywalking的工作机制,需要三块协同。工作原理图大致如下:

  • skywalking server:负责接收、存储并展示,所以server模块包含一个展示web子模块;
  • agent:负责代理微服务并收集需要的信息,转发给server;
  • 微服务本身:需要在启动时指定agent,以便生成代理类。

在这里插入图片描述

2.2 skywalking的核心模块

SkyWalking采用组件式开发,易于扩展,主要组件作用如下:

  1. Skywalking Agent:链路数据采集tracing(调用链数据)和metric(指标)信息并上报,上报通过HTTP或者gRPC方式发送数据到Skywalking Collector

  2. Skywalking Collector : 链路数据收集器,对agent传过来的tracing和metric数据进行整合分析通过Analysis Core模块处理并落入相关的数据存储中,同时会通过Query Core模块进行二次统计和监控告警

  3. Storage: Skywalking的存储,支持以ElasticSearch、Mysql、TiDB、H2等主流存储作为存储介质进行数据存储,H2仅作为临时演示单机用。

  4. SkyWalking UI: Web可视化平台,用来展示落地的数据,目前官方采纳了RocketBot作为SkyWalking的主UI

2.3 自动采集span数据

SkyWalking 采用了插件化 + javaagent 的形式来实现了 span 数据的自动采集,这样可以做到对代码的 无侵入性,插件化意味着可插拔,扩展性好。
在这里插入图片描述

2.4 如何跨进程传递 context

我们知道数据一般分为 header 和 body, 就像 http 有 header 和 body, RocketMQ 也有 MessageHeader,Message Body, body 一般放着业务数据,所以不宜在 body 中传递 context,应该在 header 中传递 context,如图示:
在这里插入图片描述

dubbo 中的 attachment 就相当于 header ,所以我们把 context 放在 attachment 中,这样就解决了 context 的传递问题。
在这里插入图片描述

2.5 traceId如何保证全局唯一

要保证全局唯一 ,我们可以采用分布式或者本地生成的 ID,使用分布式话需要有一个发号器,每次请求都要先请求一下发号器,会有一次网络调用的开销,所以 SkyWalking 最终采用了本地生成 ID 的方式,它采用了大名鼎鼎的 snowflow 算法,性能很高。
在这里插入图片描述
不过 snowflake 算法有一个众所周知的问题:时间回拨,这个问题可能会导致生成的 id 重复。那么 SkyWalking 是如何解决时间回拨问题的呢
在这里插入图片描述
每生成一个 id,都会记录一下生成 id 的时间(lastTimestamp),如果发现当前时间比上一次生成 id 的时间(lastTimestamp)还小,那说明发生了时间回拨,此时会生成一个随机数来作为 traceId。

2.6 请求量这么多,全部采集会不会影响性能?

如果对每个请求调用都采集,那毫无疑问数据量会非常大,但反过来想一下,是否真的有必要对每个请求都采集呢,其实没有必要,我们可以设置采样频率,只采样部分数据,SkyWalking 默认设置了 3 秒采样 3 次,其余请求不采样,如图示:
在这里插入图片描述
这样的采样频率其实足够我们分析组件的性能了,按 3 秒采样 3 次这样的频率来采样数据会有啥问题呢。理想情况下,每个服务调用都在同一个时间点(如下图示)这样的话每次都在同一时间点采样确实没问题。
在这里插入图片描述
但在生产上,每次服务调用基本不可能都在同一时间点调用,因为期间有网络调用延时等,实际调用情况很可能是下图这样:
在这里插入图片描述
这样的话就会导致某些调用在服务 A 上被采样了,在服务 B,C 上不被采样,也就没法分析调用链的性能,那么 SkyWalking 是如何解决的呢。

它是这样解决的:如果上游有携带 Context 过来(说明上游采样了),则下游强制采集数据。这样可以保证链路完整。

2.7 skywalking的各模块组件视图

Skywalking已经支持从6个可视化维度剖析分布式系统的运行情况。

  • 总览视图(Global view)是应用和组件的全局视图,其中包括组件和应用数量,应用的告警波动,慢服务列表以及应用吞吐量;
  • 拓扑图(topology view)从应用依赖关系出发,展现整个应用的拓扑关系;
  • 应用视图则是从单个应用的角度,展现应用的上下游关系,TopN的服务和服务器,JVM的相关信息以及对应的主机信息。
  • 服务视图关注单个服务入口的运行情况以及此服务的上下游依赖关系,依赖度,帮助用户针对单个服务的优化和监控;
  • 调用链(trace)展现了调用的单次请求经过的所有埋点以及每个埋点的执行时长;
  • 告警视图(alarm)根据配置阈值针对应用、服务器、服务进行实时告警。

2.8 部署使用

具体参考即可:https://blog.csdn.net/weixin_42906244/article/details/125638730

参考文献:
https://blog.csdn.net/A123638/article/details/123117142
https://blog.csdn.net/weixin_38004638/article/details/115975798
https://blog.csdn.net/weixin_39866487/article/details/111581322
https://blog.csdn.net/weixin_39595621/article/details/111574769

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

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

相关文章

self-attention和cross-attention

为什么Self-Attention要通过线性变换计算Q K V,背后的原理或直观解释是什么? - 知乎回答题主问题题主的问题: 在attention中都经过一个映射,那么建模的相似度是否就没有意义了?个人感觉这…https://www.zhihu.com/question/592626…

是面试官放水,还是公司实在是太缺人?这都没挂,腾讯原来这么容易进···

本人211非科班,之前在字节和腾讯实习过,这次其实没抱着什么特别大的希望投递,没想到腾讯可以再给我一次机会,还是挺开心的。 本来以为有个机会就不错啦!没想到能成功上岸,在这里要特别感谢帮我内推的同学&…

CANFD和CAN的区别

文章目录 概念速率数据长度帧格式 概念 FD全称是 Flexible Data-Rate,顾名思义,表示CAN-FD 的帧报文具有数据场波特率可变的特性,即 仲裁场和数据控制场使用标准的通信波特率,而到数据场就会切换为更高的通信波特率, …

瑞云科技副总经理黄金进受邀出席2023广东超聚变生态伙伴大会并作主题演讲

2月10日,2023广东超聚变生态伙伴大会在广东深圳博林天瑞喜来登酒店成功举办。 本次大会以“聚变焕新数字湾区”为主题,通过合作伙伴分享,携手众多合作伙伴共同探讨行业趋势和热点话题,共建合作共赢生态,焕新数字湾区。…

电脑快捷键大全,提高效率靠它了!

案例:电脑快捷键大全 【谁懂啊!作为一名打工人,效率真的太重要了,如果有快捷键真的可以使效率翻倍,哪位大神可以总结一下电脑常用的快捷键吗?跪谢了!】 在日常使用电脑时,掌握一些…

【网络安全】本地提权漏洞分析

0. 前言 CVE-2023-21752 是 2023 年开年微软第一个有 exploit 的漏洞,原本以为有利用代码会很好分析,但是结果花费了很长时间,难点主要了两个:漏洞点定位和漏洞利用代码分析,欢迎指正。 1. 漏洞简介 根据官方信息&a…

什么是工厂模式?

文章目录 00 | 基础知识01 | 简单工厂模式框架实现应用场景小结 02 | 工厂方法模式框架实现应用场景小结 03 | 抽象工厂模式框架实现应用场景小结 04 | 总结 前面学习了设计模式的基本概念(设计模式是对大家实际工作中写的各种代码进行高层次抽象的总结)…

浅述 国产仪器仪表 6433D,6433F,6433H,6433L光波元件分析仪

6433系列光波元件分析仪包括6433D(10MHz~26.5GHz)、6433F(10MHz~43.5GHz)、6433H(10MHz~50GHz)、6433L(10MHz~67GHz)4个型号。 6433系…

Live800:一个好的企业,要懂得怎样与消费者打交道

一个好的企业,不仅要懂得产品之道,更要懂得怎样与消费者打交道。 这不是危言耸听,随着市场经济的高度发展,市场竞争愈来愈激烈,消费者在市场中的主体地位和对企业的决定性作用越来越突出,企业要想生存和发…

牛客竞赛字符串专题 NC237662 葫芦的考验之定位子串(SAM + 后缀链接树上倍增)

题意&#xff1a; 给出一个字符串S&#xff0c;|S| ≤ 250000&#xff0c;给出 Q < 250000 次询问&#xff0c;每次需要回答 S[l, r] 在 S 中共出现了多少次。 思路&#xff1a; 如果使用 SAM&#xff0c;我们提前求出每个状态的 cnt[u]&#xff0c;询问就是要求我们快速…

GPT-5暂时来不了 OpenAI悄然布局移动端

OpenAI彻底用GPT-4带火自然语言大模型后&#xff0c;互联网科技行业的大头、小头都在推出自家的大模型或产品。一时间&#xff0c;生成式AI竞速赛上演&#xff0c;“吃瓜群众”也等着看谁能跑赢OpenAI。 坊间预测&#xff0c;干掉GPT-4的还得是GPT-5。结果&#xff0c;OpenAI的…

总结827

学习目标&#xff1a; 4月&#xff08;复习完高数18讲内容&#xff0c;背诵21篇短文&#xff0c;熟词僻义300词基础词&#xff09; 学习内容&#xff1a; 高等数学&#xff1a;刷1800&#xff0c;做了26道计算题&#xff0c;记录两道错题&#xff0c;搞懂了&#xff0c;但并不…

node.js 安装及配置环境变量只看此文

文章目录 1. node.js 安装2. Node.js环境变量配置3. 国内镜像网站配置 1. node.js 安装 node.js 安装完成后会带相应的npm 包管理工具。 node js 官网下载 选择合适的版本进行下载。 这里选择稳定版本。一步一步执行安装&#xff0c;期间安装盘默认C 盘&#xff0c;建议更换到…

10个Java开发人员最常犯的错误

这个列表总结了10个Java开发人员最常犯的错误&#xff0c;是我基于大量的github上的开源项目&#xff0c;Stack overflow上的问题&#xff0c;还有一些流行的google搜索的分析&#xff0c;没有明显示的评估证明它们是前10&#xff0c;但它们绝对是很常见的。 1.Array转ArrayLi…

计算机网络-IP地址计算专题(非常重要)

文章目录 IP地址快速计算法则IP计算例题1(给出了子网掩码)IP计算例题2(给出了建网比特数)求划分子网的个数求划分N个子网之后的子网掩码子网的划分超网聚合变形&#xff0c;求子网地址的规律假如让你设计网络 IP地址快速计算法则 软考中的地址计算题都只需要计算出某个IP地址所…

港联证券|万亿级AIGC赛道或迎有序监管

近段时间&#xff0c;连续有国内外科技巨子涌入万亿级AIGC&#xff08;生成式AI&#xff09;赛道&#xff0c;A股商场上AIGC、ChatGPT等人工智能相关概念也是继续火热。但与此同时&#xff0c;安全隐患也如冰山一角逐渐露出。多国政府正在考虑加强对其监管&#xff0c;AIGC在全…

时刻警惕!企业如何全面应对攻击战术演进

Fortinet FortiGuard Labs &#xff08;Fortinet全球威胁研究与响应实验室&#xff09;发布的 《全球威胁态势研究报告-2022年下半年》显示&#xff0c;不法分子正将更多资源投入至MITRE ATT&CK “前期侦察”和“武器构建”两大战术阶段&#xff0c;组织必须时刻提高警惕&a…

“QT 快速上手指南“ 之 计算器(三)信号与槽,connect 函数,QString

文章目录 前言一、什么是信号与槽&#xff1f;二、QObject::connect 函数三、QT 中的字符串类 QString1. 创建和初始化字符串&#xff1a;2. 字符串的拼接和添加3. 字符串的查找和替换4. 字符串的分割和处理 总结 前言 QT 中 信号 与 槽机制&#xff08;Signal and Slot&#…

Project1:Boolean Logic

目录 Part1:Lecture && bookunit 1.1 Boolean Logicunit 1.2 boolean function synthesisunit 1.3 logic gatesunit 1.4 Hardware Description languageunit 1.5 Hardware simulationunit 1.6 Multi-bit Buses part2:Project Part1:Lecture && book unit 1.1 …

Invalid bound statement (not found):报错解决方法

报错信息&#xff1a; Invalid bound statement (not found): com.atguigu.auth.mapper.SysMenuMapper.findMenuListByUserId 因为&#xff1a;maven加载机制 maven默认情况下&#xff0c;只会加载编译ser-main-java目录里面java类型文件&#xff0c;其他类型文件不会进行加…