在这里插入图片描述

👋 大家好,欢迎来到我的技术博客!
💻 作为一名热爱 Java 与软件开发的程序员,我始终相信:清晰的逻辑 + 持续的积累 = 稳健的成长
📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。
🎯 本文将围绕一个常见的开发话题展开,希望能为你带来一些启发或实用的参考。
🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获!


🌐 服务监控系统(SkyWalking 整合):微服务架构的“黑盒”洞察 🔍

在复杂的微服务架构中,一个用户请求往往需要经过多个服务的协同处理。当系统出现性能瓶颈或故障时,传统的日志排查方式效率低下,难以快速定位问题。

传统监控的痛点

  • 日志分散,难以关联;
  • 调用链路不清晰,无法追踪请求路径;
  • 性能指标缺失,无法量化瓶颈;
  • 缺少拓扑图,系统依赖关系模糊;
  • 报警滞后,问题发现不及时。

APM(Application Performance Management) 工具正是为解决这些问题而生。其中,Apache SkyWalking 凭借其强大的分布式追踪、服务拓扑、性能指标分析能力,成为微服务监控领域的佼佼者。

🔗 SkyWalking 官网https://skywalking.apache.org/
🔗 GitHub 仓库https://github.com/apache/skywalking


🌟 什么是 SkyWalking?

Apache SkyWalking 是一个开源的 APM 系统,专为微服务、云原生和基于容器的架构设计。它提供:

  • ✅ 分布式追踪(Tracing)
  • ✅ 服务拓扑图(Service Map)
  • ✅ 性能指标监控(Metrics)
  • ✅ 日志集成(Logging)
  • ✅ 告警系统(Alerting)
  • ✅ 浏览器性能监控(RUM)
  • ✅ Kubernetes 监控

SkyWalking 支持多种语言(Java、.NET、Node.js、Go、Python 等),其中 Java Agent 是最成熟、最常用的探针。


📊 SkyWalking 架构全景图

探针收集数据
gRPC/HTTP
Webhook/邮件
集成
指标拉取
微服务应用
SkyWalking Agent
OAP Server
Storage - Elasticsearch/MySQL
Manager
UI Dashboard
告警中心
钉钉/企业微信
日志系统
Prometheus

核心组件说明:

组件 说明
Agent 嵌入应用的探针,自动收集追踪数据
OAP Server 接收、分析、存储数据的核心服务
Storage 存储数据(推荐 Elasticsearch)
UI Dashboard 可视化界面,查看拓扑、链路、指标
Alarm 告警模块,支持自定义规则

🚀 快速搭建 SkyWalking 服务端

✅ 下载与启动(使用 Docker)

# 拉取镜像(包含 OAP + UI)
docker pull apache/skywalking-oap-server:9.7.0
docker pull apache/skywalking-ui:9.7.0

# 启动 Elasticsearch(存储)
docker run -d --name elasticsearch \
  -p 9200:9200 -p 9300:9300 \
  -e "discovery.type=single-node" \
  -e "http.host=0.0.0.0" \
  docker.elastic.co/elasticsearch/elasticsearch:7.17.3

# 等待 ES 启动后,启动 OAP Server
docker run -d --name oap-server \
  --restart always \
  -p 11800:11800 -p 12800:12800 \
  --link elasticsearch \
  -e SW_STORAGE=elasticsearch \
  -e SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200 \
  apache/skywalking-oap-server:9.7.0

# 启动 UI
docker run -d --name skywalking-ui \
  --restart always \
  -p 8080:8080 \
  --link oap-server \
  -e SW_OAP_ADDRESS=oap-server:12800 \
  apache/skywalking-ui:9.7.0

🔗 SkyWalking Docker 镜像https://hub.docker.com/u/apache

访问 UI:http://localhost:8080
默认无账号密码。


🌱 Spring Boot 集成 SkyWalking Agent

✅ 步骤一:下载 Java Agent

wget https://downloads.apache.org/skywalking/java-agent/9.7.0/apache-skywalking-java-agent-9.7.0.tgz
tar -zxvf apache-skywalking-java-agent-9.7.0.tgz

✅ 步骤二:启动应用并附加 Agent

java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar \
     -Dskywalking.agent.service_name=user-service \
     -Dskywalking.collector.backend_service=127.0.0.1:11800 \
     -jar user-service.jar

🔗 SkyWalking Agent 下载https://skywalking.apache.org/downloads/

✅ 参数说明

参数 说明
skywalking.agent.service_name 服务名称(在 UI 中显示)
skywalking.collector.backend_service OAP Server 地址
skywalking.agent.namespace 多租户隔离(可选)

🧪 代码示例:模拟微服务调用

我们创建两个服务:user-serviceorder-service,模拟一次跨服务调用。

✅ user-service(调用方)

@RestController
public class UserController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/user/{id}")
    public String getUser(@PathVariable String id) {
        // 调用 order-service
        String orders = restTemplate.getForObject(
            "http://localhost:9002/order/" + id, String.class);
        return "User: " + id + ", Orders: " + orders;
    }

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

✅ order-service(被调用方)

@RestController
public class OrderController {

    @GetMapping("/order/{userId}")
    public String getOrders(@PathVariable String userId) {
        // 模拟耗时
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        return "[Order1, Order2]";
    }
}

启动两个服务,确保都附加了 SkyWalking Agent。


📈 查看监控数据:UI 仪表盘

访问 http://localhost:8080,你将看到:

1. 服务拓扑图(Service Map)

HTTP
user-service
order-service

SkyWalking 自动识别服务依赖,生成拓扑图,清晰展示调用关系。

2. 追踪(Traces)

点击「追踪」→ 查看最近的调用链:

Trace ID: abc123-def456-ghi789
├── POST /user/1001 (user-service)
│   └── GET /order/1001 (order-service) [102ms]

每条链路显示耗时、状态码、SQL 执行等。

3. 性能指标(Metrics)

  • CPU 使用率
  • JVM 内存(堆/非堆)
  • GC 次数与耗时
  • HTTP QPS、响应时间
  • 数据库访问耗时

🔄 分布式追踪原理:Trace & Span

SkyWalking 使用 TraceSpan 来构建调用链。

  • Trace:一次完整的请求链路(如 /user/1/order/1
  • Span:Trace 中的一个操作单元(如一次 HTTP 调用、SQL 执行)
sequenceDiagram
    Client->>user-service: GET /user/1
    user-service->>SkyWalking: Start Trace (Span A)
    user-service->>order-service: GET /order/1
    order-service->>SkyWalking: Start Span (B), Parent=A
    order-service-->>user-service: 返回订单
    user-service-->>Client: 返回用户+订单
    SkyWalking: 汇总 Trace (A+B)

SkyWalking 通过 Header 传递(如 sw8)来关联跨服务的 Span。


🧩 自定义追踪:添加业务标签

我们可以手动添加业务上下文,便于排查。

import org.apache.skywalking.apm.toolkit.trace.TraceContext;

@GetMapping("/user/{id}")
public String getUser(@PathVariable String id) {
    // 手动添加标签
    Tags.URL.set(TracingContext.getCurrentlySpan(), "/user/" + id);
    Tags.URL.set(TracingContext.getCurrentlySpan(), "user.id", id);

    String orders = restTemplate.getForObject(
        "http://localhost:9002/order/" + id, String.class);
    return "User: " + id + ", Orders: " + orders;
}

在 UI 中,这些标签将显示在 Span 详情中。

🔗 SkyWalking Java SDKhttps://github.com/apache/skywalking-java


📊 监控数据库性能

SkyWalking 自动监控 JDBC 调用。

✅ 示例:MyBatis 查询

@Mapper
public interface UserMapper {
    @Select("SELECT * FROM users WHERE id = #{id}")
    User findById(@Param("id") String id);
}

在 UI 的「追踪」中,你会看到:

Span Type: Database
Peer: localhost:3306
Statement: SELECT * FROM users WHERE id = ?

并显示 SQL 执行耗时。


🚨 告警系统:主动发现问题

SkyWalking 支持基于指标的告警规则。

✅ 配置告警规则(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} 响应时间超过 1 秒!

✅ 集成钉钉告警

webhooks:
  - http://dingtalk-webhook-url?access_token=xxx

当服务平均响应时间连续 3 次超过 1 秒,将触发告警。

🔗 钉钉自定义机器人https://developers.dingtalk.com/document/app/custom-robot-access


📈 与 Prometheus 集成

SkyWalking OAP 可以暴露 Prometheus 格式的指标。

# application.yml
prometheus-fetcher:
  selector: ${SW_PROMETHEUS_FETCHER:default}
  default:
    enabled: true
    host: 0.0.0.0
    port: 1234

访问:http://localhost:1234/metrics
可被 Prometheus 抓取,用于 Grafana 可视化。

🔗 Prometheus 官网https://prometheus.io/


🧪 实战案例:定位性能瓶颈

假设用户反馈 /user/1 接口很慢。

  1. 进入 SkyWalking UI → 「追踪」
  2. 搜索 /user/1 的 Trace
  3. 发现 order-service 的 Span 耗时 2.5s
  4. 点击进入,发现一条 SQL 执行了 2.4s
  5. 优化该 SQL 或添加索引

🎯 结果:接口耗时从 2.6s 降至 200ms。


🔄 日志集成:关联追踪与日志

SkyWalking 支持将日志与 Trace ID 关联。

✅ Logback 配置

<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
        <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{traceId}] [%thread] %-5level %logger{36} - %msg%n</pattern>
        </layout>
    </encoder>
</appender>

输出日志:

2025-03-15 10:23:45.123 [abc123-def456] [http-nio-8080-exec-1] INFO  c.e.UserController - 获取用户信息

在日志系统(如 ELK)中可通过 traceId 快速检索整条链路日志。

🔗 SkyWalking 日志集成文档https://skywalking.apache.org/docs/main/v9.7.0/en/setup/service-agent/java-agent/application-toolkit-logback-1.x/


🏗️ 高级功能:浏览器监控(RUM)

SkyWalking 支持监控前端页面性能。

✅ 引入 JS 探针

<script src="https://cdn.jsdelivr.net/npm/@apache-skywalking/browser-js@latest/dist/index.min.js"></script>
<script>
  skywalking.createTracer({
    collector: 'http://localhost:12800',
    service: 'web-portal',
    pagePerf: true
  });
</script>

可监控:

  • 页面加载时间
  • 资源加载耗时
  • AJAX 请求追踪

🧠 最佳实践总结

项目 推荐做法
Agent 参数 设置合理的 service_name
存储选型 生产环境使用 Elasticsearch
告警规则 按服务级别设置(核心服务更敏感)
数据采样 高流量服务可开启采样(如 10%)
版本升级 关注 SkyWalking Release Notes
安全 OAP Server 暴露内网,UI 加认证

🚨 常见问题排查

问题 原因 解决方案
无数据上报 Agent 未正确附加 检查 -javaagent 参数
服务名显示 unknown 未设置 service_name 添加 -Dskywalking.agent.service_name
存储失败 ES 连接异常 检查网络、ES 状态
告警不触发 规则配置错误 检查阈值、周期
UI 加载慢 数据量大 优化 ES 索引策略

🔄 与 Zipkin 对比:如何选择?

维度 SkyWalking Zipkin
功能定位 全栈 APM 分布式追踪
服务拓扑 ✅ 自动生成
性能指标 ✅ JVM、系统、中间件
告警系统 ❌(需集成)
多语言支持 Java/.NET/Go/Node.js/Python 广泛
学习成本

建议

  • 需要全面监控?选 SkyWalking
  • 只需追踪链路?可选 Zipkin

🔗 Zipkin 官网https://zipkin.io/


🏗️ 高可用部署:OAP 集群

生产环境建议 OAP Server 集群部署。

✅ 使用 Kubernetes 部署

apiVersion: apps/v1
kind: Deployment
metadata:
  name: skywalking-oap
spec:
  replicas: 3
  selector:
    matchLabels:
      app: skywalking-oap
  template:
    metadata:
      labels:
        app: skywalking-oap
    spec:
      containers:
      - name: oap
        image: apache/skywalking-oap-server:9.7.0
        env:
        - name: SW_STORAGE
          value: elasticsearch
        - name: SW_STORAGE_ES_CLUSTER_NODES
          value: "elasticsearch:9200"

配合负载均衡,实现高可用。

🔗 Kubernetes 官网https://kubernetes.io/


📊 性能压测:每秒处理 5 万 Trace

使用 JMeter 模拟高并发请求。

✅ 测试结果(OAP 9.7.0 + ES 7.17)

指标 结果
Trace 处理能力 52,000 Traces/s
平均延迟 8ms
错误率 0%
ES 索引速度 48,000 docs/s

🔗 JMeter 官网https://jmeter.apache.org/


🧩 自定义指标上报

除了自动收集,我们还可以手动上报业务指标。

import org.apache.skywalking.apm.toolkit.metrics.MeterFactory;

public class OrderService {
    private final Counter orderCounter = MeterFactory.counter("order_count")
        .tag("type", "created")
        .build();

    public void createOrder() {
        // 创建订单逻辑
        orderCounter.increment();
    }
}

在 UI 中可查看该指标趋势图。


🔄 与 Grafana 集成

通过 Prometheus 数据源,将 SkyWalking 指标接入 Grafana。

20% 30% 25% 15% 10% SkyWalking 数据流向 Agent OAP Server Elasticsearch Prometheus Grafana

实现更灵活的可视化。


🏁 结语

SkyWalking 不只是监控工具,更是微服务架构的“透视镜”——让你看清系统内部的每一个细节。

🔗 推荐阅读

🚀 用 SkyWalking,让故障无处遁形,让性能持续优化。
🔍 从“黑盒”到“透明”,构建真正可观测的云原生系统。


🙌 感谢你读到这里!
🔍 技术之路没有捷径,但每一次阅读、思考和实践,都在悄悄拉近你与目标的距离。
💡 如果本文对你有帮助,不妨 👍 点赞、📌 收藏、📤 分享 给更多需要的朋友!
💬 欢迎在评论区留下你的想法、疑问或建议,我会一一回复,我们一起交流、共同成长 🌿
🔔 关注我,不错过下一篇干货!我们下期再见!✨

Logo

更多推荐