作者:洛水石

阅读时间:约 13 分钟

关键词:SkyWalking、APM、链路追踪、分布式追踪、性能监控、Java Agent

---

目录

  1. [引言:没有链路追踪的分布式系统就是黑盒](#引言)
  2. [SkyWalking 架构与核心组件](#skywalking-架构与核心组件)
  3. [快速部署:OAP + UI + Agent](#快速部署)
  4. [Java 应用接入实战](#java-应用接入实战)
  5. [链路追踪核心功能](#链路追踪核心功能)
  6. [告警规则配置](#告警规则配置)
  7. [生产环境性能调优](#生产环境性能调优)
  8. [总结](#总结)

---

引言:没有链路追踪的分布式系统就是黑盒

微服务架构下,一个请求可能经过网关 → 用户服务 → 订单服务 → 库存服务 → 支付服务 → 消息队列 → 通知服务。当接口响应变慢时,你不知道时间花在哪一步。

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实战 —

Logo

更多推荐