【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 = 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 监控、全局调用统计等,社区也比较活跃。

为什么选择 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 路径和相关配置,如:

bash 复制代码
-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的依赖
xml 复制代码
<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-trace</artifactId>
    <version>8.8.0</version>
</dependency>
  • 自定义功能(如自定义tag)的依赖
xml 复制代码
<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-opentracing</artifactId>
    <version>8.8.0</version>
</dependency>
  • skywalking日志记录logback插件的依赖
xml 复制代码
<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-logback-1.x</artifactId>
    <groupId>8.8.0</groupId>
</dependency>
  1. 在logback.xml添加日志采集
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. 项目仓库(码云):(国内访问速度更快)
相关推荐
阿四啊19 分钟前
【Redis实战篇】分布式锁-Redisson
数据库·redis·分布式
努力的搬砖人.29 分钟前
如何让rabbitmq保存服务断开重连?保证高可用?
java·分布式·rabbitmq
掘金-我是哪吒2 小时前
分布式微服务系统架构第126集:集群,数据库扩展,多节点分布,分库,分表,分片,分表,运维
运维·数据库·分布式·微服务·系统架构
杜清卿3 小时前
Spark处理过程-转换算子和行动算子
大数据·分布式·spark
小白的白是白痴的白5 小时前
Spark基础介绍
大数据·分布式·spark
火山引擎开发者社区5 小时前
推理加速新范式:火山引擎高性能分布式 KVCache (EIC)核心技术解读
分布式·火山引擎·eic
CONTONUE5 小时前
【Spark】使用Spark集群搭建Yarn模式
大数据·分布式·spark
code在飞7 小时前
windows 部署 Kafka3.x KRaft 模式 不依赖 ZooKeeper
windows·分布式·zookeeper·kafka
CONTONUE7 小时前
Spark处理过程-转换算子和行动算子(一)
大数据·分布式·spark