分布式链路追踪系统 Skywalking
分布式链路追踪系统 Skywalking
Skywalking 介绍
分布式链路追踪
可观测的监控系统
运维行业有句话:“无监控、不运维”,监控俗称“第三只眼”。没了监控,基础运维,业务运维都是“瞎子”。
所以说监控是运维职业的根本。
可观测的监控领域主要有下面三种
- 基于 Metrics(指标)监控
- 基于 Logging(日志) 的监控
- 基于 Tracing(调用链)监控

分布式链路追踪历史
早期 IT 系统非常简单,几乎所有程序都运行在单一的主机节点,互相之间也没有什么依赖。但随着硬件
技术突飞猛进,硬件成本大幅下降,软件复杂度却越来越高。单一系统性能无法满足复杂的数据计算任
务,而软件逻辑的复杂性也导致维护成本大幅上升。另外,单节点的可靠性也难以保障,不可避免的会
偶尔出现宕机等行为,影响软件的可用性。性能、可用性和可伸缩性等因素促使了分布式系统与微服务
的诞生。
随着微服务架构的演进,单体应用按照服务维度进行拆分,组织架构也随之演进以横向、纵向维度拆
分;一个业务请求的执行轨迹,也从单体应用时期一个应用实例内一个接口,变成多个服务实例的多个
接口;对应到组织架构,可能跨越多个BU、多个Owner。虽然微服务架构高内聚低耦合的优势是不言而
喻的,但是低耦合也有明显的副作用,它在现实中给跨部门沟通、协作带来额外的不可控的开销;因此
开发者尤其是终端业务侧的架构师、管理者,特别需要一些可以帮助理解系统拓扑和用于分析性能问题
的工具,便于在架构调整、性能检测和发生故障时,缩减沟通协作方面的精力和时间耗费,快速定位并
解决问题。
随着微服务相关技术, 如: 容器,Kubenetes 等的普及,软件架构会更加趋向分布式云、微服务化,软件开
发、部署成本将大幅下降,但是系统维护和问题诊断的难度却急剧上升。因此,分布式链路追踪以及由
它提供的“确定性关联”价值将愈加重要
分布式链路追踪历史
早期 IT 系统非常简单,几乎所有程序都运行在单一的主机节点,互相之间也没有什么依赖。但随着硬件
技术突飞猛进,硬件成本大幅下降,软件复杂度却越来越高。单一系统性能无法满足复杂的数据计算任
务,而软件逻辑的复杂性也导致维护成本大幅上升。另外,单节点的可靠性也难以保障,不可避免的会
偶尔出现宕机等行为,影响软件的可用性。性能、可用性和可伸缩性等因素促使了分布式系统与微服务
的诞生。
随着微服务架构的演进,单体应用按照服务维度进行拆分,组织架构也随之演进以横向、纵向维度拆
分;一个业务请求的执行轨迹,也从单体应用时期一个应用实例内一个接口,变成多个服务实例的多个
接口;对应到组织架构,可能跨越多个BU、多个Owner。虽然微服务架构高内聚低耦合的优势是不言而
喻的,但是低耦合也有明显的副作用,它在现实中给跨部门沟通、协作带来额外的不可控的开销;因此
开发者尤其是终端业务侧的架构师、管理者,特别需要一些可以帮助理解系统拓扑和用于分析性能问题
的工具,便于在架构调整、性能检测和发生故障时,缩减沟通协作方面的精力和时间耗费,快速定位并
解决问题。
随着微服务相关技术, 如: 容器,Kubenetes 等的普及,软件架构会更加趋向分布式云、微服务化,软件开
发、部署成本将大幅下降,但是系统维护和问题诊断的难度却急剧上升。因此,分布式链路追踪以及由
它提供的“确定性关联”价值将愈加重要

互联网应用深入至每个人的生活, APP上的每一次点击行为在 IT 系统中会流经哪些节点,调用哪些服
务,带来哪些变化?众多的微服务导致整个访问链路无法追踪,一旦失败,定位原因将非常困难.
微服务中常见的问题:
- 众多微服务中快速定位和发现问题之所在
- 判断故障影响范围
- 梳理服务依赖并判断依赖的合理性
- 分析链路性能并实施容量规划
关于APM
APM (Application Performance Management)即应用性能管理系统,是对企业系统进行实时监控,以
实现对应用程序性能管理和故障管理的系统化的解决方案。
APM 应用性能管理,主要指对企业的关键业务应用进行监测、优化,提高企业应用的可靠性和质量,保证用户
得到良好的服务,降低IT总拥有成本,APM系统是可以帮助理解系统行为、用于分析性能问题的工具,以便发生
故障的时候,能够快速定位和解决问题。
和传统的监控系统比如Zabbix不同,Zabbix的监控对象是基础设施。APM的监控对象是运行在基础设施之上的
应用程序本身的性能和行为。
可以把APM想象成应用程序的“仪表盘”和“健康监测系统”。当你的应用程序变得复杂(例如,采用微服务架
构、部署在云端)时,传统的服务器监控(如 CPU、内存使用率)已经不够了。APM 深入到应用程序内部,
告诉你:
哪个具体的功能或服务变慢了?
为什么会变慢?(是数据库查询慢,还是某个第三方 API 调用超时?)
什么时候发生的?影响了多少用户?
哪里出了问题?(代码的哪一行?哪个服务器?)
2010 年 4 月,Benjamin H. Sigelman 等人在 Google Technical Report 上发表了《Dapper, a LargeScale Distributed Systems Tracing Infrastructure》,标志着分布式链路追踪的技术的诞生,后续众多
组织和厂商都是基于此论文研发了各种分布式链路追踪系统
#Dapper翻译版本
https://bigbully.github.io/Dapper-translation/
OpenTracing 是一个针对分布式追踪的厂商中立的规范,它旨在为开发人员提供一个标准的接口来跟踪
分布式应用程序的执行路径。
OpenTracing 不是一个具体的实现,而是定义了一组和平台厂商无关的 API 规范,使得开发人员可以使
用不同的分布式追踪系统,而无需修改其代码。
https://opentracing.io/specification/
github.com/opentracing-contrib/opentracing-specification-zh
常见的分布式链路追踪系统

分布式链路追踪 Tracing 主流的系统有:
SkyWalking、OpenTelemetry、OpenTracing、OpenCensus 、CAT(大众点评)、Jaeger(Uber)、Zipkin(Twitter)、Pinpoint(韩国)

分布式链路追踪原理
分布式链路追踪(Distributed Tracing)是一种用于监视和调试分布式系统中请求的传播路径的技术。
在分布式系统中,一个请求通常会跨越多个服务和组件,而分布式链路追踪可以帮助我们跟踪请求在系
统中的传递过程,从而更好地理解系统的性能和行为。
分布式链路追踪的基本原理就是在分布式应用的接口方法上设置一些观察点(类似快递中转站记录
点),然后在入口节点给每个请求分配一个全局唯一的标识 TraceId(类似快递单号),当请求流经这
些观察点时就会记录一行对应的链路日志(包含链路唯一标识,接口名称,时间戳,主机信息等)。最
后通过 TraceId 将一次请求的所有链路日志进行组装,就可以还原出该次请求的链路轨迹
分布式链路追踪的核心原理是追踪和关联
- 追踪:指的是跟踪一个请求在分布式系统中的完整路径。
- 关联:指的是将同一个请求的不同部分关联起来。
分布式链路追踪系统使用一些关键的概念和规范

Trace:
追踪Trace是一系列相关的跟踪数据的集合,代表了一个请求在分布式系统中的完整路径
全局唯一的链路标识 TraceId,是最具代表的一个属性。通过 TraceId 我们才能将同一个请求分散
在不同节点的链路数据准确的关联起来,实现请求粒度的“确定性关联”价值。
Trace 追踪通常由一系列的多个跟踪段 Span 组成的有向无环图 DAG
Span:
仅有 TraceId 还不够的,还需要了解每一个请求在每一跳的接口方法上执行了什么动作,耗时多久,执行状态是成功还是失败?
承载这些信息的基础对象就是 Span,跟踪段(跨度)Span是追踪中的具有开始时间和执行时长的基本
的逻辑运行单元,代表了请求在系统中的一个特定操作或组件上的执行。每个跟踪段表示一个操作
的时间片段,记录了操作的开始和结束时间、操作名称、标签等信息。
Span 之间通过顺序排列或者嵌套建立逻辑前后调用关系
例如,一个HTTP请求、数据库查询等都可以是一个跟踪段。这些跟踪段在分布式系统中串联起
来,形成完整的调用链路。
通常一个完整的 Span 具有如下属性:
- Operation Name:描述了当前接口的行为语义,比如 /api/createOrder 代表执行了一次创建订单的动作。
- SpanId/ParentSpanId:接口调用的层级标识,用于还原 Trace 内部的层次调用关系。
- Start/FinishTime:接口调用的开始和结束时间,二者相减就是该次调用的耗时。
- StatusCode:响应状态,标识当次调用是成功或失败。
- Tags & Events:调用附加信息
Context Propagation :
分布式系统中的请求通常会经过多个不同的服务和组件,为了能够在整个调用链中追踪请求,需要共享上下文信息。
上下文传递确保在请求跨越不同服务时,相关信息如请求ID、时间戳等能够被正确传递,以便在后续的调用中能够识别并追踪这个请求且保持一致性。
Tag(标签):
Tag 是用于在 Span 中添加元数据的机制,表现为多个key/value形式,
Tag主要用于对Span进行注解和补充, 一般可以用来记录操作的相关信息,如请求参数、响应状态等。
Tag 是没有时间戳信息的
分布式链路追踪的实现流程:
1. 客户端发起请求,并生成一个唯一的 Trace ID。
2. Trace ID 会在整个请求过程中传递,并在每个服务中记录下来。
3. 每个服务会记录请求的开始时间、结束时间、调用参数、返回值等信息,并将其与 Trace ID 关联起来。
4. 所有的 Span 信息会被收集到一个集中存储系统中。
5. 用户可以通过查询系统,查看完整的请求链路,并分析系统的性能和排查故障。
SkyWalking 介绍
SkyWalking是一个由Apache基金会孵化的开源项目,最初由华为公司贡献。
SkyWalking是一个功能强大的分布式系统的可观测性分析平台 Observability Analysis Platform (OAP)和应用性能管理系统Application Performance Management(APM),专为微服务、云原生架构和基
于容器(Docker、K8s、Mesos)架构而设计。
SkyWalking为在许多不同场景中观察和监控分布式系统提供了解决方案。首先与传统方法一样,
SkyWalking 为 Java、C#、Node.js、Go、PHP 和 Nginx LUA 等服务提供自动仪器代理。 在持续部署
的多语言环境中,云原生基础架构变得更加强大,但也更加复杂。 SkyWalking 的服务网格接收器允许
SkyWalking 从服务网格框架接收遥测数据 比如 Istio/Envoy 和 Linkerd,让用户了解整个分布式系统。
SkyWalking 基于OpenTracing规范。SkyWalking提供分布式跟踪、服务网格遥测分析、度量聚合和可
视化一体化解决方案,支持对业务代码无侵入的Java等各种开发语言的应用。
SkyWalking的核心功能包括分布式追踪、应用性能监控、告警和警报,以及可视化分析。通过分布式追
踪,SkyWalking能够准确地获取到系统中每个服务之间的调用关系,帮助开发者更清晰地了解系统的工
作流程。应用性能监控功能则帮助用户发现潜在的性能问题,提高系统的稳定性和性能。告警和警报功
能允许用户设置规则,当系统性能低于预设阈值时触发警报。而可视化分析功能则提供了丰富的图表和
可视化工具,帮助用户分析和展示监控数据。
SkyWalking的工作流程主要有代理注册、跟踪数据收集、数据传输和存储等步骤。代理服务部署在应用
程序或云原生容器中,负责收集和发送跟踪数据到SkyWalking收集器。收集器接收、处理和存储这些数
据,提供洞察信息,如请求的链路图、调用的耗时、各个组件的性能指标等,从而有助于快速定位和解
决潜在的性能问题。
官网:
https://skywalking.apache.org/
#在线demo网站,用户名密码都是skywalking
http://demo.skywalking.apache.org/
SkyWalking 功能和特点
SkyWalking 功能
- 多种监控手段。可以通过语言探针和 service mesh 获得监控是数据
- 多个语言自动探针。包括 Java,.NET Core 和 Node.JS
- 轻量高效。无需大数据平台,和大量的服务器资源
- 模块化。UI、存储、集群管理都有多种机制可选
- 支持告警
- 优秀的可视化解决方案
SkyWalking 优势
- 基于 java 主流生态,功能丰富,支持各种语言
- 插件丰富,探针无侵入
- 探针性能优秀,相对其它如 Pinpoint 性能表现更加优秀
- 社区活跃,迭代迅速
- 采用先进的流式拓扑分析设计
SkyWalking 组成
https://skywalking.apache.org/zh/2020-04-19-skywalking-quick-start/
https://skyapm.github.io/document-cn-translation-of-skywalking/zh/8.0.0/


SkyWalking 分成四个组成部分:
SkyWalking OAP :即 Observation Application Platform, 是SkyWalking 的核心组件,负责接收Agent 发送的 Tracing 数据信息,然后进行分析Analysis Core ,存储到外部存储器 Storage,最终
提供查询Query功能
Storage :Tracing 数据存储。目前支持 ES、MySQL、Sharding Sphere、TiDB、H2 多种存储器。SkyWalking 默认用H2内存存储,但无法持久化,Skywalking 开发团队自己的生产环境采用
ES 为主,生产建议采用的是 ES
SkyWalking UI :负责提供控制台的UI,可以查看链路等
Agent :负责从应用中,收集链路信息,发送给 SkyWalking OAP 服务器。目前支持SkyWalking、Zikpin、Jaeger 等提供的 Tracing 数据信息。
SkyWalking 生产架构

- 应用的Agent上报数据给OAP端,有grpc通道和kafka通道,数据量如果很大,grpc通道可能撑不住,可以选择kafka通道来削峰;kafka通道是在8.x里加入的。
- 千亿级的数据用ES来做存储肯定是可以的。
- 图中L1聚合:SkyWalking OAP服务端接收数据后,构建metric并完成metric 的Level-1聚合,这里简称L1聚合。
- 图中L2聚合:服务端基于metric的Level-1聚合结果,再做一次聚合,即Level-2聚合,这里简称L2聚合。把纯Mixed角色的集群拆成了两个集群。

Skywalking 相关概念
Service 服务: 即一个应用,6.0后改名为服务Service
Endpoint 端点: 即一个API接口,表示传入请求的服务中的路径,例如 HTTP URI 路径或 gRPC 服务类+ 方法签名。比如: /Order/queryAll
Instance 实例: 即一个进程或者一个Pod 容器,通常表现为一个应用对应的 IP:Port
Segment:是SkyWalking中提出的概念,表示一次请求在某个服务内的执行链路的多个片段的合集,一
个请求在多个服务中先后产生的多个Segment串起来构成一个完整的Trace,相当于多个Span的集合,
如下图所示:

Skywalking 服务器部署
SkyWalking 服务器包括可观测性分析平台 (OAP) 服务器和本机 UI 服务器两个组件
基于二进制安装
二进制安装说明
https://skywalking.apache.org/docs/main/latest/en/setup/backend/backend-setup/
安装要求: JDK11 或 JDK 17
注意:如果安装ES,建议内存不能低于8G
下载链接
https://archive.apache.org/dist/skywalking/
案例: 二进制安装 Skywalking 服务器
安装 JAVA
注意: 当前版本只支持JDK11和JDK17
# 安装 JDK(包含编译工具 javac 等)
dnf install -y java-17-openjdk-devel
# 如果只装 JRE(运行时)
dnf install -y java-17-openjdk
java -version
安装 Skywalking 服务器
#国内镜像下载
VERSION=9.7.0
wget https://mirrors.tuna.tsinghua.edu.cn/apache/skywalking/${VERSION}/apache-skywalking-apm-${VERSION}tar.gz
tar xf apache-skywalking-apm-${VERSION}.tar.gz -C /usr/local/
ls /usr/local/apache-skywalking-apm-bin
mv /usr/local/apache-skywalking-apm-bin /usr/local/skywalking
cat /usr/local/skywalking/webapp/application.yml
[root@master1 ~]# ls /usr/local/skywalking/bin/ oapService.bat oapServiceInit.sh oapServiceNoInit.sh startup.bat webappService.bat oapServiceInit.bat oapServiceNoInit.bat oapService.sh startup.sh webappService.sh
#启动脚本有bug,需要修改
cat /usr/local/apache-skywalking-apm-bin/bin/startup.sh
# Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. #!/usr/bin/env sh PRG="$0" PRGDIR=`dirname "$PRG"` OAP_EXE=oapService.sh WEBAPP_EXE=webappService.sh "$PRGDIR"/"$OAP_EXE" & #添加后台执行 "$PRGDIR"/"$WEBAPP_EXE" & #添加后台执行
[root@master1 ~]# cat /usr/local/skywalking/bin/startup.sh # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. #!/usr/bin/env sh PRG="$0" PRGDIR=`dirname "$PRG"` OAP_EXE=oapService.sh WEBAPP_EXE=webappService.sh "$PRGDIR"/"$OAP_EXE" & "$PRGDIR"/"$WEBAPP_EXE" &
/usr/local/skywalking/bin/startup.sh
ss -ntlp|grep java)
[root@master1 ~]# ss -ntlp|grep java LISTEN 0 4096 *:8080 *:* users:(("java",pid=2050,fd=27)) LISTEN 0 4096 *:11800 *:* users:(("java",pid=2049,fd=2687)) LISTEN 0 4096 *:3100 *:* users:(("java",pid=2049,fd=2696)) LISTEN 0 4096 *:9090 *:* users:(("java",pid=2049,fd=2701)) LISTEN 0 4096 *:12801 *:* users:(("java",pid=2049,fd=2705)) LISTEN 0 4096 *:12800 *:* users:(("java",pid=2049,fd=2691))
tail -f /usr/local/skywalking/logs/*
访问 Skywalking UI
#浏览器访问,默认没有服务注册,则无法看到服务信息
http://skywalking.ming.org:8080
http://192.168.3.60:8080
使用 Elasticsearch 存储
默认使用h2内存存储,如果使用ES存储需要先安装ES
注意:apache-skywalking-apm-9.6.0 不支持ES-9.3,支持ES-8.14.3
bash install_elasticsearch_single_node.sh
#确认安装ES成功
curl http://127.0.0.1:9200
[root@master1 ~]# curl http://127.0.0.1:9200 { "name" : "master1.org", "cluster_name" : "elasticsearch", "cluster_uuid" : "zx55BKRaRwia_4CuNAEmMQ", "version" : { "number" : "8.14.3", "build_flavor" : "default", "build_type" : "rpm", "build_hash" : "d55f984299e0e88dee72ebd8255f7ff130859ad0", "build_date" : "2024-07-07T22:04:49.882652950Z", "build_snapshot" : false, "lucene_version" : "9.10.0", "minimum_wire_compatibility_version" : "7.17.0", "minimum_index_compatibility_version" : "7.0.0" }, "tagline" : "You Know, for Search" }
认使用h2内存存储,如果使用ES存储需要修改配置文件
vim /usr/local/skywalking/config/application.yml
storage: #selector: ${SW_STORAGE:h2} selector: ${SW_STORAGE:elasticsearch} #修改此行,默认h2 elasticsearch: namespace: ${SW_NAMESPACE:""} clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200} protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}
#关闭Skywalking
pstree -p -T |grep java
]#pstree -p -T |grep java |-java(4992) |-java(4993) |-java(5380)---java(5438)---controller(5458)
kill 4992 4993
#确定服务关闭
ss -ntlp|grep java
#重新启动
/usr/local/skywalking/bin/startup.sh
ss -ntlp|grep java
查看ES中生成的索引
SkyWalking Agent
https://skywalking.apache.org/docs/#Agents
SkyWalking 支持多种开发语言和应用,不同的语言集成 Skywalking Agent的方法不同
部署 Java agent
192.168.3.64 部署agent
JAVA Agent 说明
Skywalking Agent 针对Java 应用,是基于Java Agent 实现的
Java Agent 通常以jar文件的形式存在,并通过JVM参数-javaagent:agent.jar加载。
Java Agent技术广泛应用于诊断和优化Java应用程序的性能问题,例如使用Java Agent来收集性能数据、
追踪调用堆栈、诊断内存
泄漏等。
Java Agent 提供两个API
Instrumentation API
提供了在程序运行期间更改字节码的能力,可以用来动态地修改类的行为。
通过Instrumentation API,Java Agent可以在类被加载前,对其进行字节码的动态修改,可以插入自
己的代码,用于收集统计数据、记录日志、跟踪调用堆栈等。
Java Virtual Machine Tool Interface (JVMTI):
提供了在程序运行期间监视和控制JVM的能力。
JVMTI可以用于监视内存使用情况、线程执行情况、调用堆栈信息、垃圾回收等信息,并可以通过
JVMTI接口修改线程堆栈、执行跟踪等操作。
Skywalking 基于Java Agent实现的应用性能分析
Skywalking JAVA Agent 集成
https://skywalking.apache.org/docs/skywalking-java/next/en/setup/serviceagent/java-agent/readme/
方法1: 通过配置文件实现
1. Agent is available for JDK 8 - 21.
2. Find agent folder in SkyWalking release package
3. Set agent.service_name in config/agent.config . Could be any String in English.
4. Set collector.backend_service in config/agent.config . Default point to 127.0.0.1:11800 , only works for local backend.
5. Add -javaagent:/path/to/skywalking-package/agent/skywalking-agent.jar to JVM
argument. And make sure to add it before the -jar argument.
方法2: 通过JAVA选项实现
JAVA应用使用Agent的格式如下:
java -javaagent:/usr/local/skywalking-agent/skywalking-agent.jar \
-Dskywalking.agent.service_name=MyService \
-Dskywalking.logging.file_name=MySservice-api.log \
-DSW_AGENT_NAMESPACE=myproject \
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=skywalking.wang.org:11800 \
-jar MyService.jar
方法3: 通过环境变量实现
export SW_AGENT_NAME=myapp
export SW_AGENT_NAMESPACE=myproject
export SW_AGENT_COLLECTOR_BACKEND_SERVICES=skywalking.wang.org:11800
java -jar MyService.jar
SkyWalking 实战案例
实现 JAVA 应用 RuoYI
安装 RuoYI
https://gitee.com/lbtooth/RuoYi.git
范例:
dnf install git -y
git clone https://gitee.com/lbtooth/RuoYi.git
dnf install -y mysql-server java-1.8.0-openjdk-devel
systemctl start mysqld
dnf install -y maven
create database ry;
create user ry@'localhost' identified by '123456';
grant all on ry.* to ry@'localhost';
use ry
source RuoYi/sql/ry_20240112.sql
source RuoYi/sql/quartz.sql
检测数据库配置
vi RuoYi/ruoyi-admin/src/main/resources/application-druid.yml
# 数据源配置 spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver druid: # 主库数据源 master: url: jdbc:mysql://localhost:3306/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezo ne=GMT%2B8 username: ry password: 123456 # 从库数据源 slave: # 从数据源开关/默认关闭 enabled: false url: username: password: # 初始连接数 initialSize: 5 # 最小连接池数量 minIdle: 10 # 最大连接池数量 maxActive: 20 # 配置获取连接等待超时的时间 maxWait: 60000 # 配置连接超时时间
cd RuoYi/
编译jar包
mvn clean package -Dmaven.test.skip=true
Downloaded from public: https://maven.aliyun.com/repository/public/com/google/guava/guava/28.2-android/guava-28.2-android.jar (2.6 MB at 1.0 MB/s) Downloaded from public: https://maven.aliyun.com/repository/public/com/google/j2objc/j2objc-annotations/1.3/j2objc-annotations-1.3.jar (8.8 kB at 3.3 kB/s) Downloaded from public: https://maven.aliyun.com/repository/public/org/apache/commons/commons-lang3/3.7/commons-lang3-3.7.jar (500 kB at 186 kB/s) [INFO] Replacing main artifact with repackaged archive [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary for ruoyi 4.7.8: [INFO] [INFO] ruoyi .............................................. SUCCESS [ 3.439 s] [INFO] ruoyi-common ....................................... SUCCESS [01:18 min] [INFO] ruoyi-system ....................................... SUCCESS [ 1.087 s] [INFO] ruoyi-framework .................................... SUCCESS [ 15.084 s] [INFO] ruoyi-quartz ....................................... SUCCESS [ 1.546 s] [INFO] ruoyi-generator .................................... SUCCESS [ 1.464 s] [INFO] ruoyi-admin ........................................ SUCCESS [ 48.283 s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 02:39 min [INFO] Finished at: 2026-08-13T03:41:20+08:00 [INFO] ------------------------------------------------------------------------
ls -l ruoyi-admin/target/
[root@node2 RuoYi]# ls -l ruoyi-admin/target/ total 78944 drwxr-xr-x 7 root root 167 Aug 13 03:40 classes drwxr-xr-x 3 root root 25 Aug 13 03:40 generated-sources drwxr-xr-x 2 root root 28 Aug 13 03:40 maven-archiver drwxr-xr-x 3 root root 35 Aug 13 03:40 maven-status -rw-r--r-- 1 root root 77439267 Aug 13 03:41 -rw-r--r-- 1 root root 3392994 Aug 13 03:40 ruoyi-admin.jar.original
java -jar ruoyi-admin.jar
3:43:55.488 [main] INFO o.q.i.StdSchedulerFactory - [instantiate,1378] - Quartz scheduler version: 2.3.2 03:43:55.489 [main] INFO o.q.c.QuartzScheduler - [setJobFactory,2293] - JobFactory set to: org.springframework.scheduling.quartz.SpringBeanJobFactory@444f44c5 03:43:55.547 [main] DEBUG c.r.q.m.S.selectJobAll - [debug,135] - ==> Preparing: select job_id, job_name, job_group, invoke_target, cron_expression, misfire_policy, concurrent, status, create_by, create_time, remark from sys_job 03:43:55.549 [main] DEBUG c.r.q.m.S.selectJobAll - [debug,135] - ==> Parameters: 03:43:55.558 [main] DEBUG c.r.q.m.S.selectJobAll - [debug,135] - <== Total: 3 03:43:57.986 [main] INFO o.a.c.h.Http11NioProtocol - [log,173] - Starting ProtocolHandler ["http-nio-80"] 03:43:58.792 [main] INFO o.q.c.QuartzScheduler - [start,547] - Scheduler quartzScheduler_$_NON_CLUSTERED started. 03:43:58.821 [main] INFO c.r.RuoYiApplication - [logStarted,61] - Started RuoYiApplication in 13.796 seconds (JVM running for 14.835) (♥◠‿◠)ノ゙ 若依启动成功 ლ(´ڡ`ლ)゙ .-------. ____ __ | _ _ \ \ \ / / | ( ' ) | \ _. / ' |(_ o _) / _( )_ .' | (_,_).' __ ___(_ o _)' | |\ \ | || |(_,_)' | | \ `' /| `-' / | | \ / \ / ''-' `'-' `-..-'
[root@node2 ~]# ss -tnpl|grep java LISTEN 0 1000 *:80 *:* users:(("java",pid=9461,fd=21))
http://192.168.3.64:80
出现后台没有问题
cp -a /root/RuoYi/ruoyi-admin/target/ruoyi-admin.jar /mnt/
关联到skywalking
在应用客户端安装 skywalking_java_agent
wget https://mirrors.tuna.tsinghua.edu.cn/apache/skywalking/java-agent/9.6.0/apache-skywalking-java-agent-9.6.0.tgz
tar -xf apache-skywalking-java-agent-9.6.0.tgz -C /usr/local/
echo "192.168.3.60 skywalking.ming.org" >> /etc/hosts
请按如下形式调用:
启动 java agent 和royi程序
启动JAVA应用
java -javaagent:/usr/local/skywalking-agent/skywalking-agent.jar -DSW_AGENT_NAME=ruoyi -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=skywalking.ming.org:11800 -jar /mnt/ruoyi-admin.jar
访问应用
http://192.168.3.64

#默认用户名/密码
admin/admin123
查看Skywalking
http://192.168.3.60:8080/




实现 JAVA 应用A,B,C 三个服务链路追踪
192.168.3.60 skywalking
nacos 192.168.3.64
service 192.168.3.65

192.168.3.60 skywalking
/usr/local/skywalking/bin/startup.sh
192.168.3.64
systemctl stop mysqld
systemctl disable mysqld
#安装Nacos
docker run --name nacos -e MODE=standalone -p 8848:8848 -p 9848:9848 -d --restart always registry.cn-beijing.aliyuncs.com/wangxiaochun/nacos-server:v2.2.3-slim
192.168.3.65
scp apache-skywalking-java-agent-9.6.0.tgz 192.168.3.65:/root/
tar xf apache-skywalking-java-agent-9.6.0.tgz -C /usr/local/
ls /usr/local/skywalking-agent
#在192.168.3.65分别启动A,B,C三个服务
dnf install -y java-21-openjdk-devel
[root@node3 ~]# cat /etc/hosts 127.0.0.1 localhost kubeapi.org kubeapi ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 #192.168.3.60 kubeapi.org kubeapi 192.168.3.60 master1.org master1 192.168.3.61 master2.org master2 192.168.3.62 master3.org master3 192.168.3.63 node1.org node1 192.168.3.64 node2.org node2 192.168.3.65 node3.org node3 192.168.3.66 ha1.org ha1 192.168.3.67 ha2.org ha2 192.168.3.60 skywalking.ming.org 192.168.3.64 nacos.ming.org
java \
-javaagent:/usr/local/skywalking-agent/skywalking-agent.jar \
-DSW_AGENT_NAME=CService \
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=skywalking.ming.org:11800 \
-Dspring.cloud.nacos.config.server-addr=nacos.ming.org:8848 \
-Dspring.cloud.nacos.discovery.server-addr=nacos.ming.org:8848 \
-jar CService-1.0-SNAPSHOT.jar
java \
-javaagent:/usr/local/skywalking-agent/skywalking-agent.jar \
-DSW_AGENT_NAME=BService \
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=skywalking.ming.org:11800 \
-Dspring.cloud.nacos.config.server-addr=nacos.ming.org:8848 \
-Dspring.cloud.nacos.discovery.server-addr=nacos.ming.org:8848 \
-jar BService-1.0-SNAPSHOT.jar
java \
-javaagent:/usr/local/skywalking-agent/skywalking-agent.jar \
-DSW_AGENT_NAME=AService \
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=skywalking.ming.org:11800 \
-Dspring.cloud.nacos.config.server-addr=nacos.ming.org:8848 \
-Dspring.cloud.nacos.discovery.server-addr=nacos.ming.org:8848 \
-jar AService-1.0-SNAPSHOT.jar



#访问应用A
curl http://192.168.3.65:8001/echo/wangxiaochun
#观察Nacos和Skywalking的dashboard


SkyWalking 告警
https://github.com/apache/skywalking/blob/master/docs/en/setup/backend/backendalarm.md
https://github.com/apache/skywalking/blob/master/docs/en/setup/backend/backendalarm.md#list-of-all-potential-metrics-name
告警机制
告警功能概述
SkyWalking 告警功能是 6.x 版本新增的核心能力,由规则驱动实现,所有告警规则定义在
config/alarm-settings.yml 配置文件中,整体分为两大部分:
- 1. 告警规则:定义触发度量告警的条件、阈值与校验逻辑。
- 2. Webhook(网络钩子):定义告警触发后的通知渠道(如钉钉、企业微信、自定义服务接口)。
Skywalking 提供了告警机制相关文件
#指标文件
/skywalking/config/oal/core.oal
#告警规则文件
/skywalking/config/alarm-settings.yml
默认预定义告警规则
SkyWalking 发行版默认提供 config/alarm-settings.yml ,内置了 7 条常用告警规则,开箱即用:
1. 过去 3 分钟内服务平均响应时间超过 1 秒。
2. 过去 2 分钟服务成功率低于 80%。
3. 过去 3 分钟内服务响应时间超过 1s 的占比过高。
4. 服务实例在过去 2 分钟内平均响应时间超过 1s,且实例名称匹配指定正则表达式。
5. 过去 2 分钟内端点平均响应时间超过 1 秒。
6. 过去 2 分钟内数据库访问平均响应时间超过 1 秒。
7. 过去 2 分钟内端点关系平均响应时间超过 1 秒。
告警规则配置项详解
Skywalking-9.6 以后版本的告警规配置配置,注意:9.5以前版本格式不同
配置项 正确
说明 备注
rule name
告警
规则
名称
必须以 _rule 结尾
expression
MQE
告警
表达
式
新版唯一核心字段, 示例: sum(指标>1000) >= 次数
period
统计
时间
窗口
(分
钟)
多久检查一次告警条件,是告警的 “检查频率 / 时间窗口”,决定了系统
多久看一次指标是否异常。每隔 Period 分钟,系统会拉取一次指标,
判断是否满足告警条件
silenceperiod
告警
静默
周期
(分
钟)
在 当前触发时间 + Silence period 内,即使指标仍异常,也不会再
发新通知,避免同一故障反复触发告警通知,应该设置 Silence
period >= Period ,如果配置 Silence period < Period 这种配置
没有实际意义
message
告警
消息
内容
支持 {name} 变量自动替换服务名
示例
# 告警规则总配置入口 rules: # 告警规则名称:服务响应时间告警(必须以 _rule 结尾) service_resp_time_rule: # 告警触发表达式:10分钟内,服务响应时间>1000ms 的次数 >=3 次则触发告警 expression: sum(service_resp_time > 1000) >= 3 # 统计时间窗口:每10分钟评估一次告警条件 period: 10 # 告警静默周期:触发告警后,5分钟内不再重复发送同类型告警(防告警风暴) silence-period: 5 # 告警通知消息,{name} 会自动替换为实际触发告警的服务名称 message: 服务{name}响应时间超过1000ms
关于 Period 和 Silence period 说明示例
service_resp_time_rule: metrics-name: service_resp_time op: ">" threshold: 1000 period: 3 count: 1 silence-period: 10
- Period=3 分钟:系统每 3 分钟会拉取一次该服务的平均响应时间,检查是否超过 1000ms。
- Silence period=10 分钟:如果第一次在 10:00 触发了告警,那么在 10:00-10:10 之间,即使每3 分钟的检查都显示响应时间仍超过 1000ms,也不会再发告警通知。
- 直到 10:10 之后,系统才会恢复正常检查,如果此时指标仍异常,才会再次触发告警。
告警指标
SkyWalking 中的所有 Metrics 按来源主要分为两大类:
Trace Aggregation Metrics(旧体系 / 自动生成)
这些指标来源于 Tracing 数据的聚合,无需用户定义。
SkyWalking 内置的 Metrics(指标)体系非常丰富,但核心可以分成几类:
服务级(Service)、服务实例级(Service Instance)、端点级(Endpoint),以及 JVM / 系统指标。
SkyWalking 内置核心 Metrics 全列表(常用)
Service(服务级)指标
这些指标可以在 OAP 中通过 MAL(Metrics Aggregation Language)访问。
Metric 名称 含义
service_resp_time 服务平均响应时间(毫秒)
service_cpm 服务每分钟调用量(calls per minute)
service_sla 服务成功率(Success Rate)
service_outgoing_traffic 服务的上游流量
service_apdex_score 服务 APDEX 满意度指数
Service Instance(服务实例级)指标
Metric 名称 含义
instance_resp_time 实例平均响应时间
instance_cpm 实例调用量
instance_sla 实例成功率
instance_cpu 实例 CPU 使用率
instance_jvm_memory 实例 JVM 内存使用
instance_jvm_gc_time 实例 GC 时间
Endpoint(端点级)指标
Metric 名称 含义
endpoint_resp_time 单个接口 / 方法响应时间
endpoint_cpm 单个端点调用量
endpoint_sla 端点成功率
JVM Metrics(内置 Java Agent)
Metric 名称 含义
jvm_memory_heap_used 堆内存使用
jvm_memory_nonheap_used 非堆内存使用
jvm_gc_v1/v2 Young / Old GC 次数与时间
jvm_thread_live_count 活动线程数量
jvm_class_loaded_count 加载类数量
Network / CPU / System Metrics(基于 agent)
Metric 名称 含义
cpu_usage CPU 使用率
disk_read/write 磁盘 IO
os_load 系统负载
network_in/out 网络流量
Mesh / 其他插件指标(如 Envoy)
如果启用了 Mesh Telemetry:
Metric 含义
service_mesh_latency Mesh 请求延迟
service_mesh_cpm Mesh 调用量
service_mesh_sla Mesh 成功率
示例: service_resp_time 的本质
SkyWalking 中:service_resp_time = 某服务所有 Trace Segment 的平均响应时间
Meter System(现代体系)
这是 SkyWalking 8.0 之后重点构建的指标系统,支持:
- Prometheus 拉取
- Micrometer 自动收集
- OpenTelemetry Metrics
- 手动上报(Meter API)
1. 常见的指标名称格式
SkyWalking 中的指标名称通常遵循一定的命名规则,格式如下:
<entity-type>.<metric-name>.<statistic>
- <entity-type> :表示所监控的实体类型(如:服务、实例、端点等)。
- <metric-name> :表示具体的性能指标名称(如:请求数、响应时间等)。
- <statistic> :表示该指标的统计方式(如:平均值、最大值、最小值等)。
2. 实体类型
SkyWalking 中常见的实体类型包括:
- service :表示服务层级的指标。
- instance :表示实例层级的指标。
- endpoint :表示端点(比如 HTTP 接口)的指标。
- service_instance :表示服务和实例的组合指标。
- component :表示应用中的某个组件,如数据库、消息队列等。
3. 常见的指标名称
SkyWalking 提供了多种指标来监控系统的健康状态和性能,以下是一些常见的指标名称:
- service.request.count :服务的请求数。
- service.response.time :服务的响应时间(单位:毫秒)。
- instance.cpu.usage :实例的 CPU 使用率。
- instance.memory.usage :实例的内存使用率。
- service.error.count :服务的错误请求数。
- service.response.time.p95 :服务响应时间的 95 百分位数。
- service.response.time.avg :服务的平均响应时间。
- service.request.count.avg :服务请求数的平均值。
4. 统计方式
SkyWalking 提供了不同的统计方式来分析和展示指标数据,常见的统计方式包括:
- avg :平均值。
- max :最大值。
- min :最小值。
- count :计数。
- sum :总和。
- p50 , p95 , p99 :表示响应时间的不同百分位数。
5. 时间维度
SkyWalking 支持按时间维度聚合指标数据,可以通过配置查询不同时间范围的数据:
- minute :按分钟聚合的指标。
- hour :按小时聚合的指标。
- day :按天聚合的指标。
6. 示例
例如,你想查看某个服务的请求数、错误数和平均响应时间,指标名称可能如下:
- service.request.count :服务请求总数。
- service.error.count :服务错误请求数。
- service.response.time.avg :服务平均响应时间。
如果你要查看某个实例的 CPU 使用率,可以使用:
- instance.cpu.usage :实例的 CPU 使用率。
告警媒介配置
#钉钉
https://github.com/apache/skywalking/blob/master/docs/en/setup/backend/backendalarm.md#dingtalk
#微信
https://github.com/apache/skywalking/blob/master/docs/en/setup/backend/backendalarm.md#wechat
#飞书
https://github.com/apache/skywalking/blob/master/docs/en/setup/backend/backendalarm.md#feishu
wechat: default: is-default: true text-template: |- { "msgtype": "text", "text": { "content": "Apache SkyWalking Alarm: \n %s." } } recovery-text-template: |- { "msgtype": "text", "text": { "content": "Apache SkyWalking Alarm Recovered: \n %s." } } webhooks: - https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=dummy_key
DingTalk
dingtalk: default: is-default: true text-template: |- { "msgtype": "text", "text": { "content": "Apache SkyWalking Alarm: \n %s." } } recovery-text-template: |- { "msgtype": "text", "text": { "content": "Apache SkyWalking Alarm Recovered: \n %s." } } webhooks: - url: https://oapi.dingtalk.com/robot/send?access_token=dummy_token secret: dummysecret
Feishu
feishu: default: is-default: true text-template: |- { "msg_type": "text", "content": { "text": "Apache SkyWalking Alarm: \n %s." }, "ats":"feishu_user_id_1,feishu_user_id_2" } recovery-text-template: |- { "msg_type": "text", "content": { "text": "Apache SkyWalking Alarm Recovered: \n %s." }, "ats":"feishu_user_id_1,feishu_user_id_2" } webhooks: - url: https://open.feishu.cn/open-apis/bot/v2/hook/dummy_token secret: dummysecret
示例
# 顶层配置:所有告警通知渠道(钉钉、微信、邮件、webhook)都写在这里 hooks: # 配置 钉钉 告警渠道(固定关键字 dingtalk) dingtalk: # 定义一个名为 default 的告警通道(可自定义,如 critical、warning) default: # 是否为默认告警通道 # true = 规则没指定 hooks 时,默认发这里 # false = 必须手动绑定才发送 is-default: true # 告警消息模板(发送告警时用这个格式) # |- 代表 YAML 多行文本,保留格式但去掉最后换行 text-template: |- { "msgtype": "text", # 钉钉消息类型:纯文本 "text": { # 文本消息体固定结构 "content": "Apache SkyWalking Alarm: \n %s." # %s = 自动填充告警内容 } } # 告警恢复通知模板(故障恢复后发送的通知) recovery-text-template: |- { "msgtype": "text", "text": { "content": "Apache SkyWalking Alarm Recovered: \n %s." } } # 钉钉机器人 WebHook 地址 + 签名密钥(加签安全校验) webhooks: - url: https://oapi.dingtalk.com/robot/send?access_token=xxx secret: SECxxx
范例:
rules: # ===================== 规则1:响应时间告警 → 只发钉钉 ===================== service_resp_time_rule: expression: sum(service_resp_time > 1000) >= 1 period: 1 silence-period: 2 message: 服务{name}响应时间超过1000ms hooks: [dingtalk_channel] # 绑定钉钉渠道 # ===================== 规则2:服务SLA告警 → 只发企业微信 ===================== service_sla_rule: expression: sum(service_sla < 8000) >= 1 period: 1 silence-period: 2 message: 服务{name}成功率低于80% hooks: [wechat_channel] # 绑定企业微信渠道 # ===================== 多渠道独立配置 ===================== hooks: # 钉钉渠道 dingtalk: dingtalk_channel: # 与规则里的 hooks 名称对应 is-default: false text-template: |- { "msgtype": "text", "text": { "content": "【钉钉告警】\n%s" } } webhooks: - url: https://oapi.dingtalk.com/robot/send?access_token=xxx secret: SECxxx # 企业微信渠道 wechat: wechat_channel: # 与规则里的 hooks 名称对应 is-default: false text-template: |- { "msgtype": "text", "text": { "content": "【企业微信告警】\n%s" } } webhooks: - url: https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx
实现过程说明
1. 配置修改:直接编辑 config/alarm-settings.yml ,修改规则或新增 Webhook 配置。
2. 配置生效:修改后无需重启 SkyWalking OAP 服务,配置会自动加载。
3. 告警测试:可通过压测工具触发慢请求、低成功率场景,验证告警规则与 Webhook 通知是否正常。
案例
范例: 9.7.0版本
#安装工具
# 3. 添加 Docker 官方仓库
sudo dnf config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 4. 安装 Docker Engine
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
dnf install -y docker-compose
systemctl restart docker
systemctl enable docker
docker version
#准备skywalking
192.168.3.60
application.yml
maxHttpUrisNumberPerService: ${SW_CORE_MAX_HTTP_URIS_NUMBER_PER_SVR:3000}
storage:
#selector: ${SW_STORAGE:h2}
selector: ${SW_STORAGE:elasticsearch}
elasticsearch:
namespace: ${SW_NAMESPACE:""}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:192.168.3.60:9200}
protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}
connectTimeout: ${SW_STORAGE_ES_CONNECT_TIMEOUT:3000}
socketTimeout: ${SW_STORAGE_ES_SOCKET_TIMEOUT:30000}
responseTimeout: ${SW_STORAGE_ES_RESPONSE_TIMEOUT:15000}
numHttpClientThread: ${SW_STORAGE_ES_NUM_HTTP_CLIENT_THREAD:0}
user: ${SW_ES_USER:""}
password: ${SW_ES_PASSWORD:""}
trustStorePath: ${SW_STORAGE_ES_SSL_JKS_PATH:""}
[root@master1 docker]# cat alarm-settings.yml rules: # 告警规则名称:服务响应时间告警(必须以 _rule 结尾) service_resp_time_rule: # 告警触发表达式:1分钟内,服务响应时间>1000ms 的次数 >=1 次则触发告警 expression: sum(service_resp_time > 1000) >= 1 # 统计时间窗口:每1分钟评估一次告警条件 period: 1 # 告警静默周期:触发告警后,2分钟内不再重复发送同类型告警(防告警风暴) silence-period: 2 # 告警通知消息,{name} 会自动替换为实际触发告警的服务名称 message: 服务{name}响应时间超过1000ms # 告警通知钩子(必须以 hooks 开头) hooks: # 钉钉告警通知 dingtalk: default: is-default: true # 告警发送模板 text-template: |- { "msgtype": "text", "text": { "content": "Apache SkyWalking Alarm: \n %s." } } # 告警恢复模板 recovery-text-template: |- { "msgtype": "text", "text": { "content": "Apache SkyWalking Alarm Recovered: \n %s." } } # 钉钉机器人地址 + 加签密钥 webhooks: - url: https://oapi.dingtalk.com/robot/send?access_token=3fdd8bfb1ae10cf8e6ac0020a90ac6883f8a25077ceddfb45b70c109aa812309 secret: SECf3e3e3d93c915cd26938799542d84074f7b9736efd192f91a4be6b1b74374d3e
[root@master1 docker]# cat docker-compose.yaml version: '3' services: oap: #image: apache/skywalking-oap-server:9.4.0 image: apache/skywalking-oap-server:9.7.0 container_name: oap restart: always ports: - "11800:11800" - "12800:12800" volumes: - ./alarm-settings.yml:/skywalking/config/alarm-settings.yml - ./application.yml:/skywalking/config/application.yml environment: TZ: Asia/Shanghai oap-ui: #image: apache/skywalking-ui:9.4.0 image: apache/skywalking-ui:9.7.0 container_name: oap-ui restart: always environment: SW_OAP_ADDRESS: http://192.168.3.60:12800 TZ: Asia/Shanghai ports: - "8080:8080" depends_on: - oap
docker-compose up -d
docker ps

192.168.3.64
systemctl stop mysqld
systemctl disable mysqld
#安装Nacos
docker run --name nacos -e MODE=standalone -p 8848:8848 -p 9848:9848 -d --restart always registry.cn-beijing.aliyuncs.com/wangxiaochun/nacos-server:v2.2.3-slim
192.168.3.65
scp apache-skywalking-java-agent-9.6.0.tgz 192.168.3.65:/root/
tar xf apache-skywalking-java-agent-9.6.0.tgz -C /usr/local/
ls /usr/local/skywalking-agent
#在192.168.3.65分别启动A,B,C三个服务
dnf install -y java-21-openjdk-devel
[root@node3 ~]# cat /etc/hosts 127.0.0.1 localhost kubeapi.org kubeapi ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 #192.168.3.60 kubeapi.org kubeapi 192.168.3.60 master1.org master1 192.168.3.61 master2.org master2 192.168.3.62 master3.org master3 192.168.3.63 node1.org node1 192.168.3.64 node2.org node2 192.168.3.65 node3.org node3 192.168.3.66 ha1.org ha1 192.168.3.67 ha2.org ha2 192.168.3.60 skywalking.ming.org 192.168.3.64 nacos.ming.org
java \
-javaagent:/usr/local/skywalking-agent/skywalking-agent.jar \
-DSW_AGENT_NAME=CService \
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=skywalking.ming.org:11800 \
-Dspring.cloud.nacos.config.server-addr=nacos.ming.org:8848 \
-Dspring.cloud.nacos.discovery.server-addr=nacos.ming.org:8848 \
-jar CService-1.0-SNAPSHOT.jar
java \
-javaagent:/usr/local/skywalking-agent/skywalking-agent.jar \
-DSW_AGENT_NAME=BService \
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=skywalking.ming.org:11800 \
-Dspring.cloud.nacos.config.server-addr=nacos.ming.org:8848 \
-Dspring.cloud.nacos.discovery.server-addr=nacos.ming.org:8848 \
-jar BService-1.0-SNAPSHOT.jar
java \
-javaagent:/usr/local/skywalking-agent/skywalking-agent.jar \
-DSW_AGENT_NAME=AService \
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=skywalking.ming.org:11800 \
-Dspring.cloud.nacos.config.server-addr=nacos.ming.org:8848 \
-Dspring.cloud.nacos.discovery.server-addr=nacos.ming.org:8848 \
-jar AService-1.0-SNAPSHOT.jar
while true ;do curl http://192.168.3.65:8001/echo/wangxiaochun;done



浙公网安备 33010602011771号