【PmHub后端篇】Skywalking:性能监控与分布式追踪的利器
在微服务架构日益普及的当下,对系统的性能监控和分布式追踪显得尤为重要。本文将详细介绍在 PmHub 项目中,如何使用 Skywalking 实现对系统的性能监控和分布式追踪,以及在这过程中的一些关键技术点和实践经验。
1 分布式链路追踪概述
在微服务系统中,一个请求可能会经过多个服务的调用,形成复杂的调用链路。例如,A 服务调用 B 服务,B 服务又调用 C 服务等。链路中的任何一环出现高延时或错误,都可能导致整个请求的失败。
目前,比较流行的分布式链路追踪技术有 Sleuth、Skywalking 以及 ZipKin 等。其中,Sleuth 的核心已迁移,部分功能有变动。
以下是一些行业内比较成熟的其他分布式链路追踪技术解决方案。
技术 | 说明 |
---|---|
Cat | 由大众点评开源,基于Java开发的实时应用监控平台,包括实时应用监控,业务监控 。集成方案是通过代码埋点的方式来实现监控,比如:拦截器,过滤器等。对代码的侵入性很大,集成成本较高,风险较大。 |
ZipKin | 由Twitter公司开源,开放源代码分布式的跟踪系统,用于收集服务的定时数据,以解决微服务架构中的延迟问题,包括:数据的收集、存储、查找和展现。结合spring - cloud - sleuth使用较为简单,集成方便,但是功能较简单。 |
Pinpoint | Pinpoint是一款开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能强大,接入端无代码侵入。 |
Skywalking | SkyWalking是国人开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能较强,接入端无代码侵入。 |
2 分布式链路追踪原理
以三个微服务调用链路为例,假设 Service 1 调用 Service 2,Service 2 调用 Service 3 和 Service 4 。
在链路追踪中,每个服务调用时会加上 Trace ID 和 Span ID 。链路通过 TraceId 唯一标识,Span 标识发起的请求信息,各 span 通过 parent id 关联起来。
链路追踪是在分布式系统中,用于跟踪请求在各个服务之间流转过程的技术,以下结合图中信息说明其原理:
基本标识
- Trace ID:用于唯一标识一条完整的请求链路,贯穿整个请求过程。图中多个服务的请求和响应中都带有相同的
Trace Id = X
,表明它们属于同一条链路。 - Span ID:标识链路中每一个独立的操作单元,不同的
Span Id
对应不同服务或同一服务内不同步骤的操作 。例如Span Id = A
、Span Id = B
等。
关键时间点
- CS(Client Sent):客户端发送请求的时间。代表请求从客户端发出的时刻。
- SR(Server Received):服务端接收到请求的时间。
SR - CS
可计算出网络将请求从客户端传输到服务端的时间 。 - SS(Server Sent):服务端发送响应的时间。
SS - SR
反映了服务端处理业务逻辑所花费的时间。 - CR(Client Received):客户端接收到响应数据的时间。
CR - CS
体现了整个远程调用(包括网络传输和服务端处理 )所耗费的时间,CR - SS
则是网络将响应从服务端传输回客户端的时间。
链路流转示例
- 请求发起:在
SERVICE 1
处,请求开始,此时可能还未分配Trace ID
和Span ID
(图中显示No Trace Id
、No Span Id
) ,后续会生成并携带在请求中。 - 服务间传递:请求从
SERVICE 1
流向SERVICE 2
,SERVICE 2
接收到请求时记录SR
时间,处理完业务逻辑后记录SS
时间并发送响应。同时,SERVICE 2
可能会继续向SERVICE 3
、SERVICE 4
发起请求,这些子请求也都带有相同的Trace ID
,并分配新的Span ID
来标识自身操作。 - 响应返回:各个服务处理完请求后,响应沿着链路反向传递,最终回到客户端,客户端记录
CR
时间,完成一次完整的链路追踪。
通过记录这些时间点和标识,链路追踪能够清晰展现请求在分布式系统中各个服务间的流转路径、每个服务的处理耗时以及网络传输耗时等信息,方便开发人员定位性能瓶颈和排查问题。
3 Skywalking 介绍
Skywalking 是一款优秀的国产开源框架,由个人吴晟(华为开发者)于 2015 年开源,并在 2017 年加入 Apache 孵化器。它支持 dubbo、SpringCloud、SpringBoot 集成,代码无侵入,通信方式采用 GRPC,性能较好。其功能丰富,包括告警、JVM 监控、全局调用统计等,社区也比较活跃。
- 官网地址:https://skywalking.apache.org/
- 开源地址:https://github.com/apache/skywalking
为什么选择 Skywalking?
Skywalking 相比于 zipkin 等工具,具有字节码增强技术实现的代码无侵入优势,功能更加丰富,报表统计和 UI 界面更加人性化。
4 Skywalking 架构
Skywalking 的架构主要分为服务端和客户端。服务端独立运行,客户端即微服务,引入 jar 包并进行相关配置即可。
- Agent:负责收集日志数据,并传递给 OAP 服务器。
- OAP:接收 Agent 发送的 Tracing 和 Metric 数据信息,进行分析后存储到外部存储器,并提供查询功能。
- UI:提供 web 控制台,可查看链路、各种指标和性能等信息。
- Storage:负责数据的存储,支持多种存储类型。
简言之,Agent负责收集日志传输数据,通过GRPC的方式传递给OAP进行分析并且存储到数据库中,最终通过UI界面将分析的统计报表、服务依赖、拓扑关系图展示出来。
5 服务端搭建
Skywalking 的下载地址为 https://skywalking.apache.org/downloads/ 。
由于 PmHub 使用的是 jdk8,而 SkyWalking 需要 11 以上,为避免版本不兼容问题,建议使用低版本的 SkyWalking,如 8.3.0 。
下载完成后,需要对相关配置文件进行修改:
-
config/application.yml:将注册中心改为 Nacos ,配置相关参数如集群、命名空间等。
-
webapp/webapp.yml(或 application.yml):修改 UI 服务的端口,将默认的 8080 改为 8888 ,避免端口冲突。
- 启动:双击
startup.bat
脚本,运行服务端。
启动服务端后,可通过浏览器访问 http://localhost:8888/ 。
注意:启动服务端前,要先启动nacos,否则无法访问首页。
6 项目实战
6.1 客户端搭建
Skywalking 采用字节码增强技术,对微服务无代码侵入。在微服务的启动参数中指定 skywalking 提供的 agent 路径和相关配置,如:
-javaagent:/Users/canghe/tools/skywalking/apache-skywalking-apm-bin/agent/skywalking-agent.jar
-Dskywalking.agent.service_name=pmhub-gateway
-Dskywalking.collector.backend_service=127.0.0.1:11800
-javaagent
指定 agent 中 skywalking-agent.jar 的路径;-Dskywalking.agent.service_name
指定服务名称;-Dskywalking.collector.backend_service
指定 oap 服务绑定的地址。如果是本地,由于oap服务默认的端口是11800,因此只需要配置为127.0.0.1:11800
。
2024版IDEA添加VM步骤如下:
需注意,agent 的 jar 包路径不能包含中文和空格,否则运行不成功。
6.2 日志监控
-
日志模块位置及默认情况:在skywalking的UI端有日志模块,用于收集客户端的日志,默认情况下该模块没有数据。
-
编辑agent日志级别:SkyWalking 的日志配置文件通常位于 agent/config/agent.config 中。为防止控制台打印过多 info 日志,需找到该文件并打开,找到配置项“LOGGING.LEVEL”,设置适当的日志级别,如ERROR 或 WARN 来减少日志输出量。
-
添加依赖:由于每个微服务都要用到相关配置,建议将依赖放在公共模块下,其他微服务引入即可。具体依赖如下:
- 获取链路TraceId的依赖:
<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><version>8.8.0</version>
</dependency>
- 自定义功能(如自定义tag)的依赖:
<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-opentracing</artifactId><version>8.8.0</version>
</dependency>
- skywalking日志记录logback插件的依赖:
<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-logback-1.x</artifactId><groupId>8.8.0</groupId>
</dependency>
- 在logback.xml添加日志采集:
<?xml version = "1.0" encoding = "UTF-8"?>
<configuration scan = "true" scanPeriod = " 5 seconds"><!-- skywalking日志上报 --><appender name = "grpc-log" class = "org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender"><encoder class = "ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class = "org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout"><Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} - %msg %n</Pattern></layout></encoder></appender><root level = "INFO"><appender-ref ref= "grpc-log" /></root>
</configuration>
- 配置后的效果:配置好上述内容后,日志就可以在skywalking的UI中查看,还可体验链路追踪、性能剖析等功能,也可配置自定义监控告警,并链接钉钉和邮件 。
7 总结
在微服务架构下,Skywalking可实现性能监控和分布式追踪。介绍了分布式链路追踪原理,Skywalking的架构、搭建(服务端和客户端)、日志监控等内容,还对比了其他技术,利用Skywalking可提升系统性能与可维护性。
8 参考链接
- PmHub的性能监控和分布式追踪整合Skywalking
- 项目仓库(GitHub)
- 项目仓库(码云):(国内访问速度更快)
相关文章:

【PmHub后端篇】Skywalking:性能监控与分布式追踪的利器
在微服务架构日益普及的当下,对系统的性能监控和分布式追踪显得尤为重要。本文将详细介绍在 PmHub 项目中,如何使用 Skywalking 实现对系统的性能监控和分布式追踪,以及在这过程中的一些关键技术点和实践经验。 1 分布式链路追踪概述 在微服…...
Grafana v12.0 引入了多项新功能和改进
Grafana v12.0 引入了多项新功能和改进,旨在提升可观测性、仪表板管理和用户体验。以下是主要更新内容的总结: 🚀 主要新功能与改进 1. Git 同步仪表板(Git Sync) Grafana v12.0 支持将仪表板直接同步到 GitHub 仓库…...

利用“Flower”实现联邦机器学习的实战指南
一个很尴尬的现状就是我们用于训练 AI 模型的数据快要用完了。所以我们在大量的使用合成数据! 据估计,目前公开可用的高质量训练标记大约有 40 万亿到 90 万亿个,其中流行的 FineWeb 数据集包含 15 万亿个标记,仅限于英语。 作为…...
MongoDB使用x.509证书认证
文章目录 自定义证书生成CA证书生成服务器之间的证书生成集群证书生成用户证书 MongoDB配置java使用x.509证书连接MongoDBMongoShell使用证书连接 8.0版本的mongodb开启复制集,配置证书认证 自定义证书 生成CA证书 生成ca私钥: openssl genrsa -out ca…...
创始人 IP 的破局之道:从技术突围到生态重构的时代启示|创客匠人评述
在 2025 年的商业版图上,创始人 IP 正以前所未有的深度介入产业变革。当奥雅股份联合创始人李方悦在 “中国上市公司品牌价值榜” 发布会上,将 IP 赋能与城市更新大模型结合时,当马斯克在特斯拉财报电话会议上宣称 “未来属于自动驾驶和人形机…...
Gin 框架入门
Gin 框架入门 一、响应数据 JSON 响应 在 Web 开发中,JSON 是一种常用的数据交换格式。Gin 提供了简便的方法来响应 JSON 数据。 package mainimport ("github.com/gin-gonic/gin" )func main() {r : gin.Default()r.GET("/json", func(c *…...

【RabbitMQ】应用问题、仲裁队列(Raft算法)和HAProxy负载均衡
🔥个人主页: 中草药 🔥专栏:【中间件】企业级中间件剖析 一、幂等性保障 什么是幂等性? 幂等性是指对一个系统进行重复调用(相同参数),无论同一操作执行多少次,这些请求…...

软件设计师-错题笔记-系统开发与运行
1. 解析: A:模块是结构图的基本成分之一,用矩形表示 B:调用表示模块之间的调用关系,通过箭头等符号在结构图中体现 C:数据用于表示模块之间的传递的信息,在结构图中会涉及数据的流向等表示 …...
硬件设备基础
一、ARM9 内核中有多少个通用寄存器?其中 sp、lr、pc、cpsr、spsr 的作用是什么? 在 ARM9 内核中,寄存器组织包含 37 个 通用寄存器,其中,有 13 个通用目的寄存器(R0 - R12)。 S3C2440 是 ARM 架…...
[编程基础] PHP · 学习手册
🔥 《PHP 工程师修炼之路:从零构建系统化知识体系》 🔥 🛠️ 专栏简介: 这是一个以工业级开发标准打造的 PHP 全栈技术专栏,涵盖语法精粹、异步编程、Zend引擎原理、框架源码、高并发架构等全维度知识体系…...

C#简易Modbus从站仿真器
C#使用NModbus库,编写从站仿真器,支持Modbus TCP访问,支持多个从站地址和动态启用/停用从站(模拟离线),支持数据变化,可以很方便实现,最终效果如图所示。 项目采用.net framework 4.…...
Error parsing column 10 (YingShou=-99.5 - Double) dapper sqlite
在使用sqlite 调取 dapper的时候出现这个问题提示: 原因是 在 sqlite表中设定的字段类型是 decimel而在C#的字段属性也是decimel,结果解析F负数 小数的时候出现这个错误提示: 解决办法:使用默认的sqlite的字段类型来填入 REAL描述…...
Spring AI系列——使用大模型对文本进行内容总结归纳分析
一、技术原理与架构设计 1. 技术原理 本项目基于 Spring AI Alibaba 框架,结合 DashScope 大模型服务 实现文本内容的自动摘要和结构化输出。核心原理如下: 文档解析: 使用 TikaDocumentReader 解析上传的文件(如 PDF、Word 等&…...
【深度学习】目标检测算法大全
目录 一、R-CNN 1、R-CNN概述 2、R-CNN 模型总体流程 3、核心模块详解 (1)候选框生成(Selective Search) (2)深度特征提取与微调 2.1 特征提取 2.2 网络微调(Fine-tuning) …...
5.1.1 WPF中Command使用介绍
WPF 的命令系统是一种强大的输入处理机制,它比传统的事件处理更加灵活和可重用,特别适合 MVVM (Model, View, ViewModel)模式开发。 一、命令系统核心概念 1.命令系统基本元素: 命令(Command): 即ICommand类,使用最多的是RoutedCommand,也可以自己继承ICommand使用自定…...
excel大表导入数据库
前文介绍了数据量较小的excel表导入数据库的方法,在数据量较大的情况下就不太适合了,一个是因为mysql命令的执行串长度有限制,二是node-xlsx这个模块加载excel文件是整个文件全部加载到内存,在excel文件较大和可用内存受限的场景就…...
《让歌声跨越山海:Flutter借助Agora SDK实现高质量连麦合唱》
对于Flutter开发者而言,借助Agora SDK实现这一功能,不仅能为用户带来前所未有的社交体验,更是在激烈的市场竞争中脱颖而出的关键。 Agora SDK作为实时通信领域的佼佼者,拥有一系列令人瞩目的特性,使其成为实现高质量连…...
A* (AStar) 寻路
//调用工具类获取路线 let route AStarSearch.getRoute(start_point, end_point, this.mapFloor.map_point); map_point 是所有可走点的集合 import { _decorator, Component, Node, Prefab, instantiate, v3, Vec2 } from cc; import { oops } from "../../../../../e…...
单词短语0512
当然可以,下面是“opportunity”在考研英语中的常用意思和高频短语,采用大字体展示,便于记忆: ✅ opportunity 的考研常用意思: 👉 机会,良机 表示有利的时机或条件,尤指成功的可能…...

视觉-语言-动作模型:概念、进展、应用与挑战(下)
25年5月来自 Cornell 大学、香港科大和希腊 U Peloponnese 的论文“Vision-Language-Action Models: Concepts, Progress, Applications and Challenges”。 视觉-语言-动作 (VLA) 模型标志着人工智能的变革性进步,旨在将感知、自然语言理解和具体动作统一在一个计…...

一键解锁嵌入式UI开发——LVGL的“万能配方”
面对碎片化的嵌入式硬件生态,LVGL堪称开发者手中的万能配方。它通过统一API接口屏蔽底层差异,配合丰富的预置控件(如按钮、图表、滑动条)与动态渲染引擎,让工程师无需深入图形学原理,效率提升肉眼可见。 L…...
C# NX二次开发:宏录制实战讲解(第一讲)
今天要讲的是关于NX软件录制宏操作的一些案例。 下面讲如何在NX软件中复制Part体的录制宏。 NXOpen.Session theSession NXOpen.Session.GetSession(); NXOpen.Part workPart theSession.Parts.Work; NXOpen.Part displayPart theSession.Parts.Display; NXOpe…...
记录裁员后的半年前端求职经历
普通的人生终起波澜 去年下半年应该算是我毕业以来发生人生变故最多的一段时间。 先是 7 月份的时候发作了一次急性痛风,一个人在厦门,坐在床上路都走不了,那时候真的好想旁边能有个人能扶我去医院,真的是感受到 10 级的孤独。尝…...
Linux 文件查看|查找|压缩|解压 常用命令
cat 连接文件并打印到标准输出设备上 指令备注cat aaa.txt连接文件aaa并打印到标准输出设备上 more 以全屏幕的方式按页显示文本文件的内容 按Space键:显示文本的下一屏内容 按Enier键:只显示文本的下一行内容 指令备注more aaa.txt查看文件aaa le…...
什么是:Word2Vec + 余弦相似度
什么是:Word2Vec + 余弦相似度 目录 什么是:Word2Vec + 余弦相似度示例文本基于Word2Vec的文本向量化计算余弦相似度Word2Vec不是基于Transformer架构的Word2Vec是一种将单词转化为向量表示的模型,而Word2Vec + 余弦相似度则是一种利用Word2Vec得到的向量来计算文本相似性的…...

智慧城市综合运营管理系统Axure原型
这款Axure原型的设计理念紧紧围绕城市管理者的需求展开。它旨在打破传统城市管理中信息孤岛的局面,通过统一标准接入各类业务系统,实现城市运营管理信息资源的全面整合与共享。以城市管理者为中心,为其提供一个直观、便捷、高效的协同服务平台…...
[学习]RTKLib详解:convkml.c、convrnx.c与geoid.c
RTKLib详解: datum.c、download.c 与 lambda.c 本文是 RTKLlib详解 系列文章的一篇,目前该系列文章还在持续总结写作中,以发表的如下,有兴趣的可以翻阅。 [学习] RTKlib详解:功能、工具与源码结构解析 [学习]RTKLib详解ÿ…...

Qwen智能体qwen_agent与Assistant功能初探
Qwen智能体qwen_agent与Assistant功能初探 一、Qwen智能体框架概述 Qwen(通义千问)智能体框架是阿里云推出的新一代AI智能体开发平台,其核心模块qwen_agent.agent提供了一套完整的智能体构建解决方案。该框架通过模块化设计,将L…...
LayerNorm vs RMSNorm 技术对比
1. 核心概念 LayerNorm (层归一化) 思想:对单个样本的所有特征维度进行归一化目标:使每个样本的特征分布 μ 0 \mu0 μ0, σ 1 \sigma1 σ1特点:同时调整均值和方差 RMSNorm (均方根归一化) 思想:基于均方根的简…...

可视化图解算法37:序列化二叉树-II
1. 题目 描述 请实现两个函数,分别用来序列化和反序列化二叉树,不对序列化之后的字符串进行约束,但要求能够根据序列化之后的字符串重新构造出一棵与原二叉树相同的树。 二叉树的序列化(Serialize)是指:把一棵二叉树按照某种遍…...