【PmHub后端篇】Skywalking:性能监控与分布式追踪的利器

news2025/5/13 17:57:11

在微服务架构日益普及的当下,对系统的性能监控和分布式追踪显得尤为重要。本文将详细介绍在 PmHub 项目中,如何使用 Skywalking 实现对系统的性能监控和分布式追踪,以及在这过程中的一些关键技术点和实践经验。

1 分布式链路追踪概述

在微服务系统中,一个请求可能会经过多个服务的调用,形成复杂的调用链路。例如,A 服务调用 B 服务,B 服务又调用 C 服务等。链路中的任何一环出现高延时或错误,都可能导致整个请求的失败。

目前,比较流行的分布式链路追踪技术有 Sleuth、Skywalking 以及 ZipKin 等。其中,Sleuth 的核心已迁移,部分功能有变动。

以下是一些行业内比较成熟的其他分布式链路追踪技术解决方案。

技术说明
Cat由大众点评开源,基于Java开发的实时应用监控平台,包括实时应用监控,业务监控 。集成方案是通过代码埋点的方式来实现监控,比如:拦截器,过滤器等。对代码的侵入性很大,集成成本较高,风险较大。
ZipKin由Twitter公司开源,开放源代码分布式的跟踪系统,用于收集服务的定时数据,以解决微服务架构中的延迟问题,包括:数据的收集、存储、查找和展现。结合spring - cloud - sleuth使用较为简单,集成方便,但是功能较简单。
PinpointPinpoint是一款开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能强大,接入端无代码侵入。
SkywalkingSkyWalking是国人开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,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 = ASpan Id = B 等。

关键时间点

  • CS(Client Sent):客户端发送请求的时间。代表请求从客户端发出的时刻。
  • SR(Server Received):服务端接收到请求的时间。SR - CS 可计算出网络将请求从客户端传输到服务端的时间 。
  • SS(Server Sent):服务端发送响应的时间。SS - SR 反映了服务端处理业务逻辑所花费的时间。
  • CR(Client Received):客户端接收到响应数据的时间。CR - CS 体现了整个远程调用(包括网络传输和服务端处理 )所耗费的时间,CR - SS 则是网络将响应从服务端传输回客户端的时间。

链路流转示例

  1. 请求发起:在 SERVICE 1 处,请求开始,此时可能还未分配 Trace IDSpan ID (图中显示 No Trace IdNo Span Id ) ,后续会生成并携带在请求中。
  2. 服务间传递:请求从 SERVICE 1 流向 SERVICE 2SERVICE 2 接收到请求时记录 SR 时间,处理完业务逻辑后记录 SS 时间并发送响应。同时,SERVICE 2 可能会继续向 SERVICE 3SERVICE 4 发起请求,这些子请求也都带有相同的 Trace ID ,并分配新的 Span ID 来标识自身操作。
  3. 响应返回:各个服务处理完请求后,响应沿着链路反向传递,最终回到客户端,客户端记录 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 包并进行相关配置即可。
在这里插入图片描述

  1. Agent:负责收集日志数据,并传递给 OAP 服务器。
  2. OAP:接收 Agent 发送的 Tracing 和 Metric 数据信息,进行分析后存储到外部存储器,并提供查询功能。
  3. UI:提供 web 控制台,可查看链路、各种指标和性能等信息。
  4. Storage:负责数据的存储,支持多种存储类型。

简言之,Agent负责收集日志传输数据,通过GRPC的方式传递给OAP进行分析并且存储到数据库中,最终通过UI界面将分析的统计报表、服务依赖、拓扑关系图展示出来。

5 服务端搭建

Skywalking 的下载地址为 https://skywalking.apache.org/downloads/ 。

由于 PmHub 使用的是 jdk8,而 SkyWalking 需要 11 以上,为避免版本不兼容问题,建议使用低版本的 SkyWalking,如 8.3.0 。

下载完成后,需要对相关配置文件进行修改:

  1. config/application.yml:将注册中心改为 Nacos ,配置相关参数如集群、命名空间等。
    在这里插入图片描述
    在这里插入图片描述

  2. 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 日志监控

  1. 日志模块位置及默认情况:在skywalking的UI端有日志模块,用于收集客户端的日志,默认情况下该模块没有数据。

  2. 编辑agent日志级别:SkyWalking 的日志配置文件通常位于 agent/config/agent.config 中。为防止控制台打印过多 info 日志,需找到该文件并打开,找到配置项“LOGGING.LEVEL”,设置适当的日志级别,如ERROR 或 WARN 来减少日志输出量。
    在这里插入图片描述

  3. 添加依赖:由于每个微服务都要用到相关配置,建议将依赖放在公共模块下,其他微服务引入即可。具体依赖如下:

    • 获取链路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>
  1. 在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>
  1. 配置后的效果:配置好上述内容后,日志就可以在skywalking的UI中查看,还可体验链路追踪、性能剖析等功能,也可配置自定义监控告警,并链接钉钉和邮件 。

7 总结

在微服务架构下,Skywalking可实现性能监控和分布式追踪。介绍了分布式链路追踪原理,Skywalking的架构、搭建(服务端和客户端)、日志监控等内容,还对比了其他技术,利用Skywalking可提升系统性能与可维护性。

8 参考链接

  1. PmHub的性能监控和分布式追踪整合Skywalking
  2. 项目仓库(GitHub)
  3. 项目仓库(码云):(国内访问速度更快)

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

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

相关文章

利用“Flower”实现联邦机器学习的实战指南

一个很尴尬的现状就是我们用于训练 AI 模型的数据快要用完了。所以我们在大量的使用合成数据&#xff01; 据估计&#xff0c;目前公开可用的高质量训练标记大约有 40 万亿到 90 万亿个&#xff0c;其中流行的 FineWeb 数据集包含 15 万亿个标记&#xff0c;仅限于英语。 作为…

【RabbitMQ】应用问题、仲裁队列(Raft算法)和HAProxy负载均衡

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【中间件】企业级中间件剖析 一、幂等性保障 什么是幂等性&#xff1f; 幂等性是指对一个系统进行重复调用&#xff08;相同参数&#xff09;&#xff0c;无论同一操作执行多少次&#xff0c;这些请求…

软件设计师-错题笔记-系统开发与运行

1. 解析&#xff1a; A&#xff1a;模块是结构图的基本成分之一&#xff0c;用矩形表示 B&#xff1a;调用表示模块之间的调用关系&#xff0c;通过箭头等符号在结构图中体现 C&#xff1a;数据用于表示模块之间的传递的信息&#xff0c;在结构图中会涉及数据的流向等表示 …

C#简易Modbus从站仿真器

C#使用NModbus库&#xff0c;编写从站仿真器&#xff0c;支持Modbus TCP访问&#xff0c;支持多个从站地址和动态启用/停用从站&#xff08;模拟离线&#xff09;&#xff0c;支持数据变化&#xff0c;可以很方便实现&#xff0c;最终效果如图所示。 项目采用.net framework 4.…

【深度学习】目标检测算法大全

目录 一、R-CNN 1、R-CNN概述 2、R-CNN 模型总体流程 3、核心模块详解 &#xff08;1&#xff09;候选框生成&#xff08;Selective Search&#xff09; &#xff08;2&#xff09;深度特征提取与微调 2.1 特征提取 2.2 网络微调&#xff08;Fine-tuning&#xff09; …

视觉-语言-动作模型:概念、进展、应用与挑战(下)

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

一键解锁嵌入式UI开发——LVGL的“万能配方”

面对碎片化的嵌入式硬件生态&#xff0c;LVGL堪称开发者手中的万能配方。它通过统一API接口屏蔽底层差异&#xff0c;配合丰富的预置控件&#xff08;如按钮、图表、滑动条&#xff09;与动态渲染引擎&#xff0c;让工程师无需深入图形学原理&#xff0c;效率提升肉眼可见。 L…

智慧城市综合运营管理系统Axure原型

这款Axure原型的设计理念紧紧围绕城市管理者的需求展开。它旨在打破传统城市管理中信息孤岛的局面&#xff0c;通过统一标准接入各类业务系统&#xff0c;实现城市运营管理信息资源的全面整合与共享。以城市管理者为中心&#xff0c;为其提供一个直观、便捷、高效的协同服务平台…

Qwen智能体qwen_agent与Assistant功能初探

Qwen智能体qwen_agent与Assistant功能初探 一、Qwen智能体框架概述 Qwen&#xff08;通义千问&#xff09;智能体框架是阿里云推出的新一代AI智能体开发平台&#xff0c;其核心模块qwen_agent.agent提供了一套完整的智能体构建解决方案。该框架通过模块化设计&#xff0c;将L…

可视化图解算法37:序列化二叉树-II

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

C++GO语言微服务和服务发现②

01 创建go-micro项目-查看生成的 proto文件 02 创建go-micro项目-查看生成的main文件和handler ## 创建 micro 服务 命令&#xff1a;micro new --type srv test66 框架默认自带服务发现&#xff1a;mdns。 使用consul服务发现&#xff1a; 1. 初始consul服务发现&…

【Web前端开发】CSS基础

2.CSS 2.1CSS概念 CSS是一组样式设置的规则&#xff0c;称为层叠样式表&#xff0c;用于控制页面的外观样式。 使用CSS能够对网页中元素位置的排版进行像素控制&#xff0c;实现美化页面的效果&#xff0c;也能够做到页面的样式和结构分离。 2.2基本语法 通常都是&#xff…

Git实战经验分享:深入掌握git commit --amend的进阶技巧

一、工具简介 git commit --amend是Git版本控制系统的核心补救命令&#xff0c;主要用于修正最近一次提交的元数据。该命令不会产生新的提交记录&#xff0c;而是通过覆盖原提交实现版本历史的整洁性&#xff0c;特别适合在本地仓库进行提交优化。 二、核心应用场景 提交信息…

PTA:jmu-ds-最短路径

给定一个有向图&#xff0c;规定源点为0&#xff0c;求源点0到其他顶点最短路径。###你要实现的 函数接口定义&#xff1a; void Dijkstra(MGraph g,int v);//源点v到其他顶点最短路径 裁判测试程序样例&#xff1a; #include <stdio.h> #include <iostream> …

WEB UI自动化测试之Pytest框架学习

文章目录 前言Pytest简介Pytest安装Pytest的常用插件Pytest的命名约束Pytest的运行方式Pytest运行方式与unittest对比主函数运行命令行运行执行结果代码说明 pytest.ini配置文件方式运行&#xff08;推荐&#xff09;使用markers标记测试用例 pytest中添加Fixture&#xff08;测…

深入理解 iOS 开发中的 `use_frameworks!`

在使用 CocoaPods 管理 iOS 项目依赖时&#xff0c;开发者经常会在 Podfile 文件中看到一个配置选项&#xff1a;use_frameworks!。本文将详细介绍这个配置选项的含义&#xff0c;以及如何决定是否在项目中使用它。 一、什么是 use_frameworks! 在 CocoaPods 中引入第三方库时…

矩阵置零算法讲解

矩阵置零算法讲解 一、问题描述 给定一个 (m \times n) 的矩阵,如果一个元素为 (0) ,则将其所在行和列的所有元素都设为 (0) 。要求使用原地算法,即在不使用额外矩阵空间的情况下完成操作。 二、解题思路 暴力解法 最直观的想法是遍历矩阵,当遇到 (0) 元素时,直接将其…

二本计算机,毕业=失业?

我嘞个豆&#xff0c;二本计算机&#xff0c;毕业即失业&#xff1f;&#xff01; 今天咱们聊聊普通院校计算机专业的学生未来的发展方向。有些话可能不太中听&#xff0c;但希望大家能理性看待。 首先得承认&#xff0c;对于普通双非和二本的学生来说&#xff0c;就业率加上…

[docker基础二]NameSpace隔离实战

目录 一 实战目的 二 基础知识 1)dd 命令详解 2)mkfs命令详解 3)df命令详解 4)mount 命令详解 5)unshare命令详解 三 实战操作一(PID隔离) 四 实战操作二(MOunt隔离) 1&#xff09;创建 Mount 隔离进程 2&#xff09;在新进程里边&#xff0c;创建空白文件&#…

Day22打卡-复习

复习日 仔细回顾一下之前21天的内容&#xff0c;没跟上进度的同学补一下进度。 作业&#xff1a; 自行学习参考如何使用kaggle平台&#xff0c;写下使用注意点&#xff0c;并对下述比赛提交代码 泰坦尼克号人员生还预测https://www.kaggle.com/competitions/titanic/overview K…