前言

在Spring Clould微服务架构中
1个客户端请求会先经过负载均衡(如Nginx)到达微服务网关。
微服务网关(SpringClould Gateway)从注册/配置中心(Nacos)拉取服务列表,再通过本地负载均衡器(Ribbon)将请求路由到具体服务实例,期间可结合Sentinel进行流量控制和容错降级。
服务之间的远程调用则通过OpenFeign实现。
在分布式场景下,为保证跨服务调用的事务一致性,通常会引入Seata进行分布式事务管理。
此外,微服务架构还需解决分布式Session、消息队列、文件集群等一系列问题。
而对于多服务间调用链路的监控与排查,则可通过引入分布式链路追踪系统(如SkyWalking、Zipkin或Jaeger)来解决,它能为每1个请求生成全局唯一的Trace ID,串联起各服务节点的调用耗时与状态,从而实现全链路可视化观测。
对于1个由几十个甚至几百个微服务构成的微服务架构系统,通常会遇到以下问题:
如何串联整个调用链路,快速定位问题?
如何梳理各个微服之间的依赖/调用关系?
如何进行各个微服务接口的性能分析?
如何跟踪整个业务流程的调用处理顺序?
二、SkyWalking
Apache SkyWalking是国产开源、Apache顶级项目的一体化可观测平台(APM 应用性能监控)。
专门面向微服务、云原生、K8s容器、服务网格场景,一站式搞定链路追踪(Trace)、指标监控(Metrics)、日志(Logs)、性能剖析(Proflies)(One platform for traces, metrics, logs and profiles)。
SkyWalking由以下核心组件组成,各司其职:
| 组件 | 全称 / 角色 | 核心职责 |
|---|---|---|
| Java Agent | 无侵入式探针 | 部署在应用侧,负责采集链路、指标、日志等数据,并上报给 OAP。 |
| OAP Server | Observability Analysis Platform (可观测性分析平台) | 系统的大脑,负责接收、分析、聚合和存储数据,并向 UI 提供查询接口,同时负责下发动态配置和 Profiling 任务。 |
| 存储介质 | 可插拔存储 | 持久化所有监控数据。最常用的是 Elasticsearch,也支持 MySQL、TiDB 等。 |
| UI 层 | 展示 | 集中展示所有可观测性数据。 |
三、接入SkyWalking
Agent方式(推荐)
java -jar:JVM会去寻找JAR包中MANIFEST.MF文件里定义的Main-Class,并执行它的main() 方法。这是应用程序的起点。
java -javaagent:JVM会去加载指定的JAR包,寻找 MANIFEST.MF文件里定义的Premain-Class,并执行它的premain() 方法。这是JVM专门为监控/增强类库预留的入口。
探针接入的特点:零代码侵入,对业务代码无任何改动,覆盖绝大部分监控场景。
java -javaagent:/path/to/skywalking-agent.jar \ -Dskywalking.agent.service_name=order-service \ # 指定服务名 -Dskywalking.collector.backend_service=192.168.1.100:11800 \ # 指定OAP地址 -jar your-app.jar
skyWalking探针记录的异常堆栈深度不足问题排查
#查看容器中主进程Pid ps -ef #根据Pod查看进程启动完整命令行 cat /proc/10/cmdline | tr '\\0' ' ' #根据完整启动命令中/monitor/skywalking/skywalking-agent.jar路径,锁定SkyWalking的配置文件路径 grep -i depth /monitor/skywalking/config/agent.config #查看环境变量 echo $SW_AGENT_CAUSE_EXCEPTION_DEPTH #skyWalking加载配置优先级 1. JVM 启动 `-Dskywalking.xxx`(你这里缺失深度配置) 2. 容器系统环境变量 `SW_AGENT_*`(你这里为空) 3. agent.config 文件 `${变量:默认值}` 兜底(当前生效
SDK代码方式
通过SDK的方式可以扩展自定义Skywalking链路追踪信息,其缺陷是对代码有侵入。
Agent采集到的可观测数据,只能看到1次HTTP请求的URL和方法和消耗时间。

通过apm-toolkit-trace第三方依赖jar包,和代码@Trace主机自定义链路追踪 还可以记录Java代码中方法,参数、返回值实现链路追踪,
四、性能剖析(SkyWalking Profiling)
性能剖析(Profiling)是SkyWalking里一种按需触发的诊断机制。
用户在SkyWalking UI界面新建任务通过OAP Server向目标Agent主动下发任务并周期性抓取线程栈快照。
从而精准定位到方法级或代码行级的性能瓶颈,补全链路追踪(Tracing)无法深入代码内部的盲区。

Skywaling的UI内置服务性能剖析功能,是定位代码级性能瓶颈(如 CPU 飙升、方法慢)的利器。
支持的剖析性能类型
| 剖析类型 | 分析目标 | 适用场景 | 支持版本 |
|---|---|---|---|
| CPU剖析 | 分析 CPU 热点方法 | 定位 CPU 使用率高的代码 | 全版本支持 |
| 内存分配剖析 (ALLOC) | 分析高频内存分配的调用栈 | 定位频繁创建对象的代码,优化 GC 压力 | SkyWalking 10.2.0+ |
对服务内存分配剖析需要升级SkyWalking至10.2.0+
工作流程
-
你发起任务:你在 SkyWalking UI 上选择目标服务和实例,配置好参数(如持续时间、CPU或内存采样等),创建一个新的 Profiling 任务。
-
Agent 接收指令:运行中的 Java Agent 会持续与 OAP Server 保持通信。当新任务创建后,Agent 会从 OAP Server 获取到“开始执行剖析”的指令。
-
Agent 执行采样
-
数据上传与分析:采样完成后,Agent 会将采集到的数据(如JFR格式文件)上传回 OAP Server。OAP Server 解析后,你就能在 UI 上看到可视化的分析结果了。
浙公网安备 33010602011771号