SkyWalking之APM无侵入可观测原理分析
一、 简介(为什么需要用到可观测能力)
随着微服务的开发模式的兴起,早期的单体架构系统已拆分为很多的子系统,各个子系统封装为微服务,各服务间通过HTTP协议RESET API或者RPC协议进行调用。
在单体服务或者微服务较少的情况下,当我们遇到问题时可以直接简单、快速地通过日志进行分析,并迅速判断是A服务还是B服务存在问题,以此快速恢复服务。
但是,在大型企业中,系统数量已经到达了几十个、甚至上百个,每个系统都有不同的架构和调用协议,那么此时这些系统之间的调用关系会变得错综复杂。当某个API接口的业务逻辑很复杂、且调用链路很长,涉及的系统或微服务较多,一旦其中一环出现问题,想要快速定位问题和解决问题那就太难了,如果还是按照早期一一查看日志的方式进行排查,无疑对运维和开发人员是一场噩梦.....
那么有什么方式能够做到快速定位和分析,并且在应用不改造的情况下实施呢?此时就需要一套APM(应用性能管理(Application Performance Management))系统,将我们业务开发与运维制定的规范嵌入APM系统,在可视化UI面板+告警快速地,通过服务调用链的拓扑图进行问题定位。
APM系统开源的其实有很多产品,例如韩国主导的Pinpoint、大众点评的CAT、推特的ZipKin、CNCF的Jaeger以及本文重点介绍的Apache SkyWalking. 感兴趣的同学都可以一一了解和使用。
APM重点关注三个指标数据: 1、Metrics 2、Logging 3、Tracing
Peter Bourgon在参加完2017 Distributed Tracing Summit后发表的一篇博文,简洁扼要地介绍了指标(Metrics)、链路(Tracing)、日志(Logging)三者的定义和关系。这三种数据在可观察性中都有各自的发挥空间,但每种数据都没办法完全被其他数据代替。
我们从一个典型的服务问题排查过程来看:
- 通过各式各样的预设报警发现异常(通常是Metrics/Logging)
- 打开监控大盘查找异常的曲线,并通过查询找到异常的模块(Metrics)
- 对这个模块以及关联日志进行查询分析,找到核心的报错信息(Logging)
- 通过详细的调用链数据定位到引起问题的代码(Tracing)
二、SkyWalking
SkyWalking 由中国华为和 Apache 开源社区共同开发,目前已成为 Apache 基金会下的顶级项目之一,作者吴晟。
SkyWalking 是基于 Apache 开源生态的分布式应用性能监控系统。它提供了面向云原生架构的 APM(Application Performance Management)解决方案,支持多种语言的应用和多种方式的部署,具有以下特点:
分布式追踪:支持多种语言、多种协议的应用追踪,可获取全链路的请求数据。
应用拓扑图:根据追踪数据自动生成应用程序拓扑,便于系统管理员快速定位故障。
监控告警:具有丰富的监控指标和告警规则,支持第三方告警接口。
插件化体系:可通过插件模块实现对不同类型服务的监控和数据收集。
2.1 无侵入式说明
SkyWalking Agent采集调用链信息的客户端对业务是无感的、非侵入式的。 那也就意味着,你的项目代码无须修改一行代码就能加入SkyWalking的采集、监控、调用链追踪。
原始项目接入SkyWalking很轻松、门槛很低。 底层大概得原理是:JAVA本身就提供JAVAAGENT的机制以及采用动态修改字节码技术的方式,Agent在JVM底层帮我们把调用链采集上报的过程透明化了,开发人员作为业务层写代码是无感的。
注意:无侵入方式实现
- 应用服务器中需要安装SkyWalking-agent.jar
- 应用需要重启,并且在启动参数中添加相关配置,在后面案例中会提供详细的参
接下来我会使用入门案例做个简单初步分析和验证.
三、案例验证(使用JAVA:SpringBoot工程+PHP)
3.1 安装SkyWalking的OAP系统安装包
下载: SkyWalking的OAP压缩包
下载页面: Downloads | Apache SkyWalking
3.2 上传下载好的OAP的tar包
3.3 运行OAP
1、解压 apache-skywalking-apm-9.7.0.tar.gz
tar -zxvf apache-skywalking-apm-9.7.0.tar.gz
2、进入 apache-skywalking-apm-bin
3、在启动OAP之前需要确定机器上是否安装JDK
注意SkyWalking新版安装包需要JDK11以上,否则无法启动
Linux 上安装及卸载JDK(包含yum方式)-CSDN博客
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/skywalking/oap/server/starter/OAPServerStartUp has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
该错误告诉我们,我们的类是在比尝试运行它的版本更高的Java版本下编译的。 更具体地说,在这种情况下,我们使用Java 11编译了我们的类,并尝试使用Java 8运行它。
作为参考,让我们快速看一下Java版本号。 如果我们需要下载适当的Java版本,这将很方便。主版本号和次版本号存储在类字节码中的字节六和七中。让我们看看主要版本号如何映射到Java版本:45 = Java 1.146 = Java 1.247 = Java 1.348 = Java 1.449 = Java 550 = Java 651 = Java 752 = Java 853 = Java 954 = Java 1055 = Java 1156 = Java 1257 = Java 13
4、进入bin目录有启动脚本,我们先启动oapService.sh(服务端)、再启动webappService.sh(UI客户端)
sh oapService.sh
sh webappService.sh
5、启动完毕,执行jps程序查看进程有没有正常拉起来
如果JPS无法使用,则参考linux环境下JPS命令未找到-CSDN博客
6、正常会出现上面两个进程,如果没有拉起来在logs目录可以查看错误信息进行排查,如无问题则继续往下
7、访问SkyWalking 8080 UI界面,默认端口8080
http://$ip:8080
目前刚开始服务列表这些是空的, SkyWalking支持多种数据存储介质例如默认内存、MySQL、ES等等,一般生产环境使用ES集群进行存储,我们测试直接不用改什么配置,默认采用内存的形式。那就意味着如果服务重启,则之前的测试数据会丢失。
3.4 Trace调用链追踪的基本原理介绍
Trace调用链追踪,例如A->B->C->D 存在4个微服务的调用链关系。 假设我们通过HTTP协议进行交互,该怎么把调用链信息拿到呢?
Google的Dapper论文中提到了一种分布式调用链追踪的实现方式, 市面上的APM系统调用链追踪大部分是参考这篇论文实现的。 每个调用链可以使用TraceId进行标识,每个服务被调用称为一个Span会伴随一个SpanId, 每当父服务调用子服务的时候会将TraceId以及父层的SpanId往子服务传递,子服务收到后,记录父层传递的SpanId作为自己Span的父id, 最后2个服务都会把调用信息上报到APM的服务端,例如SkyWalking的某个端口。
最后SkyWalking因为采集到了这些Span的信息,Span信息记录着父子关系、调用时间信息、TraceId等等,经过UI绘制,就能把这一次调用的TraceId的所有Span进行串联,最终形成调用链拓扑图。
接下来我们部署一个SpringBoot项目和一个PHP项目,很简单的链路,SpringBoot调用PHP项目的HTTP接口,我们来看下SkyWalking的UI界面以及分析原理验证。
3.5 运行项目
我本地搭建了一套SpringBoot项目,但是如果只是简单运行,那肯定和我们的SkyWalking还没进行结合。那怎么结合起来呢? 那就是通过运行的时候,设置参数,和SkyWalking Agent进行结合。
我们上面提到过,使用SkyWalking Agent最大的好处就是【无代码侵入】,那也就是意味着我们的源代码无须做任何变更, 只需要在运行java -jar JAR包的时候额外加入一下参数即可:
下载Agent:
下载后进行解压,我将使用两种方式验证;
本地IDEA运行和Linux环境下运行,但注意运行需要同时配置JVM启动参数
# skywalking‐agent.jar的本地磁盘的路径
-javaagent:F:\Apache\skywalking-agent\skywalking-agent.jar
# 在skywalking上显示的服务名
-Dskywalking.agent.service_name=SkyWalking-Test
# skywalking的collector服务的IP及端口
-Dskywalking.collector.backend_service=192.168.20.128:11800
- 本地IDEA运行SpringBoot工程
访问接口,即可在UI界面上展示信息
服务列表信息
查看调用service调用拓扑图
查看调用链详细信息
- Linux上运行
通过官网Tar包,启动一直报错
启动命令:
java -javaagent:/user/local/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=TestDemo-Adaptee -Dskywalking.collector.backend_service=[IP]:11800 -jar /user/local/TestDemo-Adaptee-0.0.1-SNAPSHOT.jar错误:
Error opening zip file or JAR manifest missing : /user/local/skywalking-agent/skywalking-agent.jar
Error occurred during initialization of VM
agent library failed to init: instrument
官网Tar包下载地址:Index of /skywalking/java-agent
下载Agent包:
wget https://dlcdn.apache.org/skywalking/java-agent/9.0.0/apache-skywalking-java-agent-9.0.0.tgz解压:
tar -zxvf apache-skywalking-java-agent-9.0.0.tgz
博主解压完后出现两个文件:tgz.1和skywalking-agent文件夹
需要再次解压tgz.1压缩包
解压:
tar -zxvf apache-skywalking-java-agent-9.0.0.tgz
启动
执行上面启动命令后即可
相关文章:

SkyWalking之APM无侵入可观测原理分析
一、 简介(为什么需要用到可观测能力) 随着微服务的开发模式的兴起,早期的单体架构系统已拆分为很多的子系统,各个子系统封装为微服务,各服务间通过HTTP协议RESET API或者RPC协议进行调用。 在单体服务或者微服务较少的…...
Missing artifact org.yaml:snakeyaml:jar:1.29
关于导入本地maven项目pom.xml出现missing artifact org....报错处理 环境变量配置maven,eclipse中配置maven,重启eclipse。...

三opencv源码解压及环境变量配置
1.双击opencv-3.4.6-vc14-vc15.exe 2.选择解压的路径,点击【extract】 3.设计环境变量...
vue实时监控视频播放的进度,并在播放80%位置触发相应操作
video标签:播放时触发canplay事件 <video:src"filePath"controlsv-if"filePrefix mp4 || filePrefix avi"canplay"getVideoDur()"id"myVideo"class"preview"></video>canplay触发的方法ÿ…...
HTML+CSS滚动条样式如何单独给firefox设置 scrollbar-width: none;,而不影响其他浏览器
要在Firefox中单独设置滚动条样式,你可以使用@-moz-document规则。这个规则允许你为特定的浏览器或浏览器引擎应用样式。 下面是一个例子,演示如何在Firefox中隐藏滚动条: @-moz-document url-prefix() {/* 在这里添加只对Firefox生效的样式 */body {scrollbar-wi…...

《Go 简易速速上手小册》第2章:控制结构与函数(2024 最新版)
文章目录 2.1 条件语句:决策的艺术2.1.1 基础知识讲解2.1.2 重点案例:用户角色权限判断实现用户角色权限判断扩展功能实现代码功能扩展:添加或删除用户2.1.3 拓展案例 1:成绩等级判断实现成绩等级判断功能实现代码扩展功能:详细反馈...

基于EasyCVR视频汇聚系统的公安网视频联网共享视频云平台建设思路分析(一)
随着社会的发展和科技的进步,视频监控系统在各个领域的应用越来越广泛,视频云平台建设已经成为了行业数字化转型的重要一环。公安网视频汇聚联网共享云的建设需要充分考虑技术、架构、安全、存储、计算等多方面因素,以确保平台的稳定性和可用…...

HQYJ 2024-2-21 作业
复习课上内容(已完成)结构体字节对齐,64位没做完的做完,32位重新都做一遍,课上指定2字节对齐的做一遍,自己验证(已完成)两种验证大小端对齐的代码写一遍复习指针内容(已完…...

LeetCode每日一题【283. 移动零】
题目: 思路: 双指针,i和j。当i和j所指元素都不为0时,他们同时向后走,当j所指元素为0时,只走j,i固定。这样下来,i就指向最后一个非0元素的下一个位置,j就指向那些0元素之…...
CF1200E Compress Words
题目描述 Amugae has a sentence consisting of n words. He want to compress this sentence into one word. Amugae doesnt like repetitions, so when he merges two words into one word, he removes the longest prefix of the second word that coincides with a suffix…...

ip https证书推荐
公网IP地址是每个连接到互联网的设备所必需的标识。公网IP地址是用于在互联网上唯一标识一个设备的IP地址,它由一组由四个数字组成的字符串组成,每个数字在0到255之间。随着互联网的发展,只有公网IP地址的站点也开始重视传输信息安全…...

大气颗粒物与VOCs PMF源解析技术应用
目前,大气颗粒物和臭氧污染成为我国亟待解决的环境问题。颗粒物和臭氧污染不仅对气候和环境有重要影响,而且对人体健康有严重损害。而臭氧的前体物之一为挥发性有机物(VOCs)。为了高效、精准地治理区域大气颗粒物和臭氧污染&#…...

VSCODE中使用Vue3教程
VUE介绍 Vue.js is a popular JavaScript library for building web application user interfaces and Visual Studio Code has built-in support for the Vue.js building blocks of HTML, CSS, and JavaScript. For a richer Vue.js development environment, you can insta…...

Mac M2芯片配置PHP环境
Mac M2芯片配置PHP环境 1. XAMPP2. PHPBrew(PHP版本管理)安装php7.4.33版本 3. 直接使用homebrew 安装php环境参考 1. XAMPP 官网地址 https://www.apachefriends.org/ 安装 安装完成 web server打开后,在打开localhost 成功! 2. PHPBrew(PHP版本管…...
[嵌入式系统-25]:RT-Thread -12- 内核组件编程接口 - 网络组件 - HTTP编程
目录 一、HTTP编程概述 1.1 概述 1.2 HTTP 服务器和 HTTP 客户端 二、HTTP Client 2.1 如何配置HTTP Client 2.2 HTTP Client代码实例1:socket发送http报文 2.3 HTTP Client代码实例2:httpc_xx接口收发HTTP报文 2.3.1 接口函数描述 2.3.2 代码实…...

一个服务器实现本机服务互联网化
欢迎来到我的博客,代码的世界里,每一行都是一个故事 一个服务器实现本机服务互联网化 前言痛点关于中微子代理实战演练搭建服务端搭建客户端服务端配置代理实现 前言 在数字世界的网络战场上,中微子代理就像是一支潜伏在黑暗中的数字特工队&…...

django配置视图并与模版进行数据交互
目录 安装django 创建一个django项目 项目结构 创建视图层views.py 写入视图函数 创建对应视图的路由 创建模版层 配置项目中的模版路径 创建模版html文件 启动项目 浏览器访问结果 安装django pip install django 创建一个django项目 这里最好用命令行完成…...
Java进阶
乐观锁和悲观锁分布式锁hashmap原理Redis及其分布式DDD领域驱动设计IO、多线程 ??Kafka ??设计模式之??Elasticsearch ??JVM ?? 面试题汇总1...

⭐北邮复试刷题106. 从中序与后序遍历序列构造二叉树__递归分治 (力扣每日一题)
106. 从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7], postor…...
K8S更新部署docker的两种方法举例
前提条件 imagePullPolicy: Always 方法1:删除更新法 test-project为命名空间 --删除所有asp-svc下面的pod,这会导致从新拉取镜像 kubectl delete pods -l appasp-svc -n test-project --删除指定的pod,这会导致从新拉取镜像 kubectl delete pod …...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...

MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...