在微服务架构日益普及的当下,对系统的性能监控和分布式追踪显得尤为重要。本文将详细介绍在 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 监控、全局调用统计等,社区也比较活跃。
为什么选择 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 路径和相关配置,如:
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 日志监控
-
日志模块位置及默认情况:在skywalking的UI端有日志模块,用于收集客户端的日志,默认情况下该模块没有数据。
-
编辑agent日志级别 :SkyWalking 的日志配置文件通常位于 agent/config/agent.config 中。为防止控制台打印过多 info 日志,需找到该文件并打开,找到配置项"LOGGING.LEVEL",设置适当的日志级别,如ERROR 或 WARN 来减少日志输出量。
-
添加依赖:由于每个微服务都要用到相关配置,建议将依赖放在公共模块下,其他微服务引入即可。具体依赖如下:
- 获取链路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>
- 在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>
- 配置后的效果:配置好上述内容后,日志就可以在skywalking的UI中查看,还可体验链路追踪、性能剖析等功能,也可配置自定义监控告警,并链接钉钉和邮件 。
7 总结
在微服务架构下,Skywalking可实现性能监控和分布式追踪。介绍了分布式链路追踪原理,Skywalking的架构、搭建(服务端和客户端)、日志监控等内容,还对比了其他技术,利用Skywalking可提升系统性能与可维护性。
8 参考链接
- PmHub的性能监控和分布式追踪整合Skywalking
- 项目仓库(GitHub)
- 项目仓库(码云):(国内访问速度更快)