分布式链路追踪 SkyWalking 实战:从接入到性能调优
*SkyWalking = -javaagent 一行接入,Trace 视图一眼定位瓶颈,拓扑图一张看清依赖,告警规则一套守护生产。message: "服务 {name} 响应时间超过 1000ms,当前值: {value}ms"message: "服务 {name} 成功率低于 80%,当前值: {value}"关键词:SkyWalking、APM、链路追踪、分布式追踪、性能监控、Java Ag
作者:洛水石
阅读时间:约 13 分钟
关键词:SkyWalking、APM、链路追踪、分布式追踪、性能监控、Java Agent
---
目录
- [引言:没有链路追踪的分布式系统就是黑盒](#引言)
- [SkyWalking 架构与核心组件](#skywalking-架构与核心组件)
- [快速部署:OAP + UI + Agent](#快速部署)
- [Java 应用接入实战](#java-应用接入实战)
- [链路追踪核心功能](#链路追踪核心功能)
- [告警规则配置](#告警规则配置)
- [生产环境性能调优](#生产环境性能调优)
- [总结](#总结)
---
引言:没有链路追踪的分布式系统就是黑盒
微服务架构下,一个请求可能经过网关 → 用户服务 → 订单服务 → 库存服务 → 支付服务 → 消息队列 → 通知服务。当接口响应变慢时,你不知道时间花在哪一步。
SkyWalking 是 Apache 开源的 APM(应用性能监控)系统,核心能力:
- **分布式链路追踪**:追踪请求在微服务间的完整路径
- **服务拓扑图**:可视化服务依赖关系
- **性能指标**:响应时间、吞吐量、错误率
- **告警**:慢查询、高错误率、服务宕机
SkyWalking 支持 Java、Go、Node.js、Python 等语言,Java 接入仅需添加 `-javaagent` 参数。
---
SkyWalking 架构与核心组件
架构图
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Agent │ │ Agent │ │ Agent │
│ (Java App) │ │ (Java App) │ │ (Gateway) │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ gRPC/HTTP │ │
└───────────────────┼───────────────────┘
│
┌──────▼──────┐
│ OAP Server │
│ (Receiver) │
└──────┬──────┘
│
┌──────▼──────┐
│ Storage │
│ (ES/H2/MySQL)│
└─────────────┘
│
┌──────▼──────┐
│ SkyWalking │
│ UI │
└─────────────┘
核心组件
|
组件 |
作用 |
部署方式 |
|
OAP Server |
接收、聚合、分析追踪数据 |
独立部署 |
|
UI |
Web 可视化界面 |
随 OAP 一起 |
|
Agent |
探针,自动采集应用数据 |
随应用启动 |
|
Storage |
数据存储 |
Elasticsearch / H2 / MySQL |
|
OAP Server |
接收、聚合、分析追踪数据 |
独立部署 |
|
UI |
Web 可视化界面 |
随 OAP 一起 |
|
Agent |
探针,自动采集应用数据 |
随应用启动 |
|
Storage |
数据存储 |
Elasticsearch / H2 / MySQL |
|
UI |
Web 可视化界面 |
随 OAP 一起 |
|
Agent |
探针,自动采集应用数据 |
随应用启动 |
|
Storage |
数据存储 |
Elasticsearch / H2 / MySQL |
|
Agent |
探针,自动采集应用数据 |
随应用启动 |
|
Storage |
数据存储 |
Elasticsearch / H2 / MySQL |
---
快速部署
1. Docker Compose 一键部署
version: '3'
services:
oap:
image: apache/skywalking-oap-server:9.7.0
container_name: skywalking-oap
ports:
- "11800:11800" # gRPC
- "12800:12800" # REST
environment:
SW_STORAGE: elasticsearch
SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
depends_on:
- elasticsearch
ui:
image: apache/skywalking-ui:9.7.0
container_name: skywalking-ui
ports:
- "8080:8080"
environment:
SW_OAP_ADDRESS: http://oap:12800
depends_on:
- oap
elasticsearch:
image: elasticsearch:7.17.0
container_name: elasticsearch
ports:
- "9200:9200"
environment:
- discovery.type=single-node
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
2. 启动
docker-compose up -d
验证
open http://localhost:8080 # SkyWalking UI
curl http://localhost:12800/healthCheck
---
Java 应用接入实战
1. 下载 Agent
wget https://archive.apache.org/dist/skywalking/java-agent/9.1.0/apache-skywalking-java-agent-9.1.0.tgz
tar -xzf apache-skywalking-java-agent-9.1.0.tgz
2. 启动参数配置
java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar \
-DSW_AGENT_NAME=order-service \
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800 \
-jar order-service.jar
3. Spring Boot 配置文件方式
添加 JVM 参数
skywalking.agent.service_name=order-service
skywalking.collector.backend_service=127.0.0.1:11800
skywalking.plugin.toolkit.log.transmit_formatted=true
4. 自定义追踪(可选)
import org.apache.skywalking.apm.toolkit.trace.Trace;
import org.apache.skywalking.apm.toolkit.trace.TraceContext;
import org.apache.skywalking.apm.toolkit.trace.Tag;
@Service
public class OrderService {
@Trace(operationName = "createOrder")
@Tag(key = "orderId", value = "arg[0]")
@Tag(key = "result", value = "returnedObj")
public Order createOrder(String orderId, OrderRequest request) {
// 获取当前 Trace ID
String traceId = TraceContext.traceId();
log.info("Processing order, traceId={}", traceId);
// 业务逻辑
validateOrder(request);
saveOrder(orderId, request);
sendNotification(orderId);
return new Order(orderId);
}
@Trace
private void validateOrder(OrderRequest request) {
// 校验逻辑
}
}
5. 日志中输出 Trace ID
<!-- logback-spring.xml -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%tid] [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
`%tid` 会输出 SkyWalking 的 Trace ID,方便日志关联。
---
链路追踪核心功能
1. Trace 视图
在 SkyWalking UI 中可以看到完整的调用链:
OrderService#createOrder [350ms]
├── validateOrder [5ms]
├── UserService#getUserInfo [45ms]
│ └── SELECT * FROM user [30ms]
├── InventoryService#deduct [120ms]
│ └── UPDATE inventory [80ms]
├── PaymentService#pay [150ms]
│ ├── 第三方支付接口 [100ms] ← 瓶颈!
│ └── 更新订单状态 [30ms]
└── NotificationService#send [30ms]
└── MQ 发送 [15ms]
一目了然:第三方支付接口耗时 100ms,是性能瓶颈。
2. 服务拓扑图
SkyWalking 自动绘制服务依赖关系:
- 圆形节点 = 服务
- 箭头 = 调用方向
- 颜色 = 健康状态(绿/黄/红)
- 粗细 = 调用量
3. 服务指标面板
|
指标 |
说明 |
|
CPM (Calls Per Minute) |
每分钟调用次数 |
|
Avg Response Time |
平均响应时间 |
|
P99 Response Time |
99% 请求响应时间 |
|
SLA (Success Rate) |
成功率 |
|
Apdex |
用户满意度指数 |
|
CPM (Calls Per Minute) |
每分钟调用次数 |
|
Avg Response Time |
平均响应时间 |
|
P99 Response Time |
99% 请求响应时间 |
|
SLA (Success Rate) |
成功率 |
|
Apdex |
用户满意度指数 |
|
Avg Response Time |
平均响应时间 |
|
P99 Response Time |
99% 请求响应时间 |
|
SLA (Success Rate) |
成功率 |
|
Apdex |
用户满意度指数 |
|
P99 Response Time |
99% 请求响应时间 |
|
SLA (Success Rate) |
成功率 |
|
Apdex |
用户满意度指数 |
|
SLA (Success Rate) |
成功率 |
|
Apdex |
用户满意度指数 |
---
告警规则配置
1. 告警规则文件
config/alarm-settings.yml
rules:
# 服务响应时间告警
service_resp_time_rule:
metrics-name: service_resp_time
op: ">"
threshold: 1000
period: 10
count: 3
silence-period: 5
message: "服务 {name} 响应时间超过 1000ms,当前值: {value}ms"
# 服务错误率告警
service_error_rate_rule:
metrics-name: service_sla
op: "<"
threshold: 8000
period: 10
count: 2
message: "服务 {name} 成功率低于 80%,当前值: {value}"
# 数据库慢查询
database_slow_sql_rule:
metrics-name: database_access_resp_time
op: ">"
threshold: 500
period: 10
count: 5
message: "数据库慢查询,响应时间: {value}ms"
Webhook 通知
groups:
default:
webhook:
- url: http://localhost:8080/alert/webhook
2. 企业微信告警接入
@RestController
@RequestMapping("/alert")
public class AlertWebhookController {
@PostMapping("/webhook")
public void receiveAlert(@RequestBody List<AlarmMessage> messages) {
for (AlarmMessage msg : messages) {
String content = String.format(
"## SkyWalking 告警\n" +
"> 规则: %s\n" +
"> 服务: %s\n" +
"> 消息: %s\n" +
"> 时间: %s",
msg.getRuleName(),
msg.getName(),
msg.getAlarmMessage(),
msg.getStartTime()
);
sendWeChatMessage(content);
}
}
private void sendWeChatMessage(String content) {
// 调用企微 Webhook
}
}
---
生产环境性能调优
1. Agent 采样率调整
全量采集(开发环境)
skywalking.agent.sample_n_per_3_secs=-1
生产环境:每 3 秒采集前 10 条
skywalking.agent.sample_n_per_3_secs=10
或者按百分比采样
skywalking.trace.sample_rate=500 # 50%
2. OAP Server 调优
application.yml
core:
default:
# 记录数据保存天数
recordDataTTL: 3
# 分钟级指标保存天数
minuteMetricsDataTTL: 7
# 小时级指标保存天数
hourMetricsDataTTL: 15
# 天级指标保存天数
dayMetricsDataTTL: 30
receiver-trace:
default:
# 批量处理大小
bufferSize: 20000
# 线程数
bufferChannelSize: 5
3. Elasticsearch 存储优化
storage:
elasticsearch:
# 分片数
indexShardsNumber: 3
# 副本数
indexReplicasNumber: 1
# 批量写入大小
bulkActions: 4000
bulkSize: 40
flushInterval: 30
4. 生产 checklist
|
优化项 |
建议 |
|
Agent 采样 |
生产环境开启采样,避免全量 |
|
数据保留 |
Trace 3天,指标 7-30 天 |
|
OAP 集群 |
3 节点以上,负载均衡 |
|
ES 存储 |
独立 ES 集群,SSD 磁盘 |
|
网络 |
Agent 到 OAP 走内网,低延迟 |
|
Agent 采样 |
生产环境开启采样,避免全量 |
|
数据保留 |
Trace 3天,指标 7-30 天 |
|
OAP 集群 |
3 节点以上,负载均衡 |
|
ES 存储 |
独立 ES 集群,SSD 磁盘 |
|
网络 |
Agent 到 OAP 走内网,低延迟 |
|
数据保留 |
Trace 3天,指标 7-30 天 |
|
OAP 集群 |
3 节点以上,负载均衡 |
|
ES 存储 |
独立 ES 集群,SSD 磁盘 |
|
网络 |
Agent 到 OAP 走内网,低延迟 |
|
OAP 集群 |
3 节点以上,负载均衡 |
|
ES 存储 |
独立 ES 集群,SSD 磁盘 |
|
网络 |
Agent 到 OAP 走内网,低延迟 |
|
ES 存储 |
独立 ES 集群,SSD 磁盘 |
|
网络 |
Agent 到 OAP 走内网,低延迟 |
---
总结
SkyWalking 使用 checklist
接入阶段:
- [ ] 下载对应版本的 Java Agent
- [ ] 配置 `-javaagent` 和 `SW_AGENT_NAME`
- [ ] 日志配置添加 `%tid` 输出 Trace ID
- [ ] 验证 UI 能看到服务列表和拓扑图
使用阶段:
- [ ] 通过 Trace 视图定位性能瓶颈
- [ ] 通过拓扑图发现循环依赖
- [ ] 关注 P99 响应时间和错误率
- [ ] 配置告警规则(响应时间/错误率/慢SQL)
运维阶段:
- [ ] 生产环境开启采样,控制存储成本
- [ ] OAP 集群化部署,避免单点
- [ ] 定期清理过期数据
- [ ] 监控 OAP 和 ES 的资源使用
一句话总结
**SkyWalking = -javaagent 一行接入,Trace 视图一眼定位瓶颈,拓扑图一张看清依赖,告警规则一套守护生产。**
---
更多硬核技术文章每周更新。
配图1:SkyWalking 架构与数据流

配图2:SkyWalking 服务拓扑与核心指标

— 作者:洛水石 | APM | SkyWalking实战 —
更多推荐

所有评论(0)