SkyWalking - 支持的中间件清单:Spring Cloud、Dubbo、RocketMQ、ShardingSphere 等

SkyWalking - 支持的中间件清单:Spring Cloud、Dubbo、RocketMQ、ShardingSphere 等
在这里插入图片描述
👋 大家好,欢迎来到我的技术博客!
📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。
🎯 本文将围绕SkyWalking这个话题展开,希望能为你带来一些启发或实用的参考。
🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获!

文章目录

🌐 SkyWalking —— 全链路监控利器,支持 Spring Cloud、Dubbo、RocketMQ、ShardingSphere 等主流中间件

在微服务架构盛行的今天,系统之间的调用关系变得异常复杂。一次用户请求可能经过多个服务节点、消息队列、数据库分片、缓存中间件等组件,任何一个环节出现问题都可能导致整个链路失败或性能下降。传统的日志分析和单点监控已经无法满足现代分布式系统的可观测性需求。

这时候,Apache SkyWalking 作为一款开源的 APM(Application Performance Management)系统,应运而生,并迅速成为业界最受欢迎的全链路追踪与性能监控解决方案之一。

✅ SkyWalking 支持 Java、.NET、Node.js、Go、Python、PHP、Rust 等多种语言
✅ 支持自动探针(无需修改一行代码)
✅ 支持手动埋点(灵活定制)
✅ 支持 UI 可视化拓扑图、调用链、指标图表
✅ 支持告警、日志集成、指标聚合
✅ 社区活跃、文档完善、插件生态丰富

本文将围绕 SkyWalking 对主流中间件的支持能力 展开,重点介绍其对 Spring Cloud、Dubbo、RocketMQ、ShardingSphere 的深度集成方案,并附上可运行的 Java 示例代码、配置说明、以及可视化效果解读。同时,我们还将通过 mermaid 图表直观展示调用链路结构,帮助你构建完整的可观测性体系。


🚀 为什么选择 SkyWalking?

在众多 APM 工具中(如 Zipkin、Pinpoint、Jaeger),SkyWalking 凭借以下优势脱颖而出:

  • 无侵入式探针:通过 Java Agent 挂载即可自动采集数据,无需修改业务代码。
  • 丰富的插件生态:覆盖几乎所有主流框架和中间件。
  • 强大的 UI 界面:提供服务拓扑、调用链追踪、慢 SQL 分析、JVM 监控等。
  • 支持多语言:不仅仅是 Java,还支持 Go、Node.js、Python 等。
  • 社区驱动 & Apache 顶级项目:稳定、安全、持续演进。

官方地址 👉 https://skywalking.apache.org/


🧩 SkyWalking 架构概览

SkyWalking 采用模块化设计,主要由以下几个核心组件构成:

Tracing Data

Java Application

SkyWalking Agent

OAP Server

Storage: Elasticsearch/H2/MySQL

UI Dashboard

User Browser

  • Agent:部署在应用 JVM 中,负责采集 Trace、Metrics、Log 等数据。
  • OAP Server:接收并处理来自 Agent 的数据,进行聚合、存储、告警计算。
  • Storage:支持 Elasticsearch、MySQL、H2 等多种后端存储。
  • UI:基于 Web 的可视化界面,用于展示拓扑、调用链、指标等。

📦 环境准备

1. 下载 SkyWalking

前往官网下载最新版本(建议使用 9.x 版本):

👉 https://skywalking.apache.org/downloads/

解压后目录结构如下:

apache-skywalking-apm-x.x.x ├── agent/ # 探针目录 ├── config/ # OAP 配置文件 ├── oap-libs/ # OAP 依赖库 ├── webapp/ # UI 应用 ├── bin/ # 启动脚本 └── ... 

2. 启动 OAP 和 UI

进入 bin 目录:

# Linux/Mac ./oapService.sh ./webappService.sh # Windows oapService.bat webappService.bat 

默认 UI 地址:http://localhost:8080


☁️ Spring Cloud 集成示例

Spring Cloud 是目前最流行的微服务框架之一,SkyWalking 对其支持非常完善,包括 Feign、RestTemplate、Gateway、Eureka、Nacos 等组件。

Maven 依赖(非必须,Agent 自动注入)

虽然 SkyWalking 使用 Java Agent 实现无侵入监控,但如果你想手动埋点或自定义 Span,可以引入:

<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><version>8.13.0</version></dependency>

启动参数配置

在你的 Spring Boot 应用启动命令中添加:

-javaagent:/path/to/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=your-service-name -Dskywalking.collector.backend_service=localhost:11800 

例如:

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

示例代码:Feign 调用链追踪

假设你有两个服务:user-serviceorder-service,通过 Feign 远程调用。

// OrderServiceClient.java@FeignClient(name ="order-service", url ="http://localhost:8082")publicinterfaceOrderServiceClient{@GetMapping("/orders/{userId}")List<Order>getOrdersByUserId(@PathVariable("userId")Long userId);}// UserController.java@RestController@RequestMapping("/users")publicclassUserController{@AutowiredprivateOrderServiceClient orderServiceClient;@GetMapping("/{id}")publicUsergetUserWithOrders(@PathVariableLong id){User user = userService.findById(id);List<Order> orders = orderServiceClient.getOrdersByUserId(id); user.setOrders(orders);return user;}}

✅ 启动后访问 http://localhost:8081/users/1,你将在 SkyWalking UI 中看到完整的调用链:

order-serviceuser-service用户浏览器order-serviceuser-service用户浏览器GET /users/1Feign → GET /orders/1返回订单列表返回用户+订单信息

你可以在 UI 中查看:

  • 每个 Span 的耗时
  • HTTP 状态码
  • 异常堆栈(如有)
  • 跨服务上下文传递(TraceId 一致)

🔗 Dubbo 集成示例

Dubbo 是阿里巴巴开源的高性能 RPC 框架,在国内企业广泛使用。SkyWalking 提供了对 Dubbo 2.7+ 的完整支持。

启动参数(同 Spring Cloud)

只需确保 -javaagent 参数正确挂载即可,无需额外配置。

示例代码:Provider & Consumer

Provider 端(暴露服务)
// UserServiceImpl.java@Service(version ="1.0.0")publicclassUserServiceImplimplementsUserService{@OverridepublicStringsayHello(String name){return"Hello, "+ name +" from Dubbo Provider!";}}
Consumer 端(调用服务)
// UserController.java@RestControllerpublicclassUserController{@Reference(version ="1.0.0")privateUserService userService;@GetMapping("/hello/{name}")publicStringhello(@PathVariableString name){return userService.sayHello(name);}}

✅ 访问 http://localhost:8083/hello/Alice,SkyWalking 将自动捕获 Dubbo 调用链:

dubbo-providerdubbo-consumer用户浏览器dubbo-providerdubbo-consumer用户浏览器GET /hello/AliceDubbo invoke sayHello("Alice")返回 "Hello, Alice..."返回响应

你可以在 UI 中看到:

  • Dubbo 接口名、方法名、参数类型
  • 调用耗时、成功/失败状态
  • 服务版本号(version)、分组(group)等元数据

🚀 RocketMQ 集成示例

RocketMQ 是阿里开源的分布式消息中间件,SkyWalking 支持对其生产者和消费者的全链路追踪。

添加依赖(可选,Agent 已内置插件)

<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-mq</artifactId><version>8.13.0</version></dependency>

生产者示例

@RestControllerpublicclassMessageController{@AutowiredprivateRocketMQTemplate rocketMQTemplate;@GetMapping("/send/{msg}")publicStringsendMessage(@PathVariableString msg){Message<String> message =MessageBuilder.withPayload(msg).build(); rocketMQTemplate.send("TestTopic", message);return"Message sent: "+ msg;}}

消费者示例

@Component@RocketMQMessageListener(topic ="TestTopic", consumerGroup ="test-group")publicclassTestConsumerimplementsRocketMQListener<String>{@OverridepublicvoidonMessage(String message){System.out.println("Received message: "+ message);// 模拟业务处理耗时try{Thread.sleep(500);}catch(InterruptedException e){}}}

✅ 调用 http://localhost:8084/send/HelloRocketMQ,SkyWalking 将追踪完整的消息流转过程:

consumer-appRocketMQ Brokerproducer-app用户浏览器consumer-appRocketMQ Brokerproducer-app用户浏览器GET /send/HelloRocketMQ发送消息到 TestTopic推送消息处理消息(sleep 500ms)ACK返回 "Message sent"

你可以在 UI 中看到:

  • 消息 Topic、Tag、Key
  • 生产者/消费者服务名
  • 消息处理耗时
  • 是否发生重试或异常

🧱 ShardingSphere 集成示例

ShardingSphere 是一套开源的分布式数据库中间件,提供分库分表、读写分离、数据加密等功能。SkyWalking 支持对其 SQL 执行的监控与追踪。

配置数据源(ShardingSphere-JDBC)

# application.ymlspring:shardingsphere:datasource:names: ds0,ds1 ds0:type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/db0?useSSL=false&serverTimezone=UTCusername: root password: root ds1:type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/db1?useSSL=false&serverTimezone=UTCusername: root password: root rules:sharding:tables:t_order:actual-data-nodes: ds$->{0..1}.t_order_$->{0..1}table-strategy:standard:sharding-column: order_id sharding-algorithm-name: table-inline key-generate-strategy:column: order_id key-generator-name: snowflake sharding-algorithms:table-inline:type: INLINE props:algorithm-expression: t_order_$->{order_id % 2}key-generators:snowflake:type: SNOWFLAKE 

示例 Controller

@RestController@RequestMapping("/orders")publicclassOrderController{@AutowiredprivateOrderRepository orderRepository;@PostMappingpublicOrdercreateOrder(@RequestBodyOrder order){return orderRepository.save(order);}@GetMapping("/{id}")publicOrdergetOrder(@PathVariableLong id){return orderRepository.findById(id).orElse(null);}}

✅ 调用创建订单接口,SkyWalking 将自动记录:

  • SQL 语句内容
  • 执行耗时
  • 影响行数
  • 所属数据源(ds0/ds1)
  • 分表名称(t_order_0 / t_order_1)

你可以在 UI 的 “Database” 标签页中看到所有 SQL 执行情况,包括慢查询分析。

45%30%25%SQL 执行分布SELECT * FROM t_order_0 WHERE order_id = ?INSERT INTO t_order_1 (...) VALUES (...)UPDATE t_order_0 SET status = ? WHERE id = ?


🛠️ 自定义埋点与 Trace 上下文传递

虽然 SkyWalking Agent 能自动采集大部分数据,但在某些场景下(如异步线程、自定义任务、第三方 SDK),你可能需要手动埋点。

手动创建 Span

importorg.apache.skywalking.apm.toolkit.trace.TraceContext;importorg.apache.skywalking.apm.toolkit.trace.Trace;importorg.apache.skywalking.apm.toolkit.trace.Tag;@RestControllerpublicclassCustomTraceController{@GetMapping("/custom")@Trace@Tag(key ="custom.tag", value ="custom.value")publicStringcustomTrace(){// 获取当前 TraceIdString traceId =TraceContext.traceId();System.out.println("Current TraceId: "+ traceId);// 模拟业务逻辑doHeavyWork();return"Custom trace completed with TraceId: "+ traceId;}privatevoiddoHeavyWork(){try{Thread.sleep(1000);}catch(InterruptedException e){Thread.currentThread().interrupt();}}}

在异步线程中传递上下文

@GetMapping("/async")publicStringasyncTrace()throwsInterruptedException,ExecutionException{String traceId =TraceContext.traceId();System.out.println("Main thread TraceId: "+ traceId);CompletableFuture<String> future =CompletableFuture.supplyAsync(()->{// 手动激活 Trace 上下文TraceContext.putCorrelation("async.context","true");try{Thread.sleep(500);}catch(InterruptedException e){Thread.currentThread().interrupt();}return"Async task done in TraceId: "+TraceContext.traceId();});return future.get();}

✅ 上述代码中,异步线程中的操作仍会关联到原始 TraceId,确保调用链完整。


📊 SkyWalking UI 功能详解

登录 http://localhost:8080 后,你将看到以下核心功能模块:

1. 仪表盘(Dashboard)

展示全局性能指标:TPS、响应时间、成功率、JVM 内存/CPU 使用率等。

2. 拓扑图(Topology Map)

自动生成服务间调用关系图,支持点击钻取:

user-service

order-service

message-producer

RocketMQ

message-consumer

sharding-ds0

sharding-ds1

3. 追踪(Traces)

查看具体某次请求的完整调用链,支持按服务、端点、状态码、耗时筛选。

4. 性能剖析(Profile)

对慢请求进行 CPU 方法级采样,定位性能瓶颈。

5. 日志(Logs)

集成 Logback/Log4j2,支持按 TraceId 关联日志。

6. 告警(Alarms)

配置规则,如“5分钟内错误率 > 5%”触发邮件/Webhook 告警。


⚙️ 高级配置技巧

1. 自定义采样率

编辑 agent/config/agent.config

# 默认采样率 100%,可调整为 10% 降低开销 agent.sample_n_per_3_secs=10 

2. 忽略特定端点

# 不追踪健康检查接口 agent.ignore_suffix=.jpg,.jpeg,.js,.css,.png,.gif,/health,/actuator/** 

3. 自定义服务实例名

-Dskywalking.agent.instance_name=${HOSTNAME}

4. 集成日志框架(Logback)

logback-spring.xml 中添加:

<encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} - %msg%n</pattern></encoder>

其中 %X{tid} 会输出 SkyWalking TraceId,便于日志关联。


🌍 多语言 & 多协议支持

除了 Java,SkyWalking 还支持:

  • Go:通过 go2sky SDK
  • Node.js:通过 skywalking-backend-js
  • Python:通过 skywalking-python
  • .NET:通过 SkyAPM-dotnet
  • PHP:通过 skywalking-php-sdk
  • Rust:实验性支持

跨语言调用也能保持 TraceId 传递,实现全栈可观测性。

官方多语言 SDK 文档 👉 https://skywalking.apache.org/docs/


🧪 性能压测与调优建议

SkyWalking Agent 默认性能损耗 < 10%,但在高并发场景下仍需优化:

1. 调整缓冲区大小

# agent.config buffer.channel_size=5 buffer.buffer_size=1000 

2. 关闭不必要的插件

# 禁用 Redis 插件(如未使用) plugin.redis.trace_redis_parameters=false 

3. 使用 gRPC 压缩

collector.grpc_compression=true 

4. 存储层优化(Elasticsearch)

  • 使用 SSD 磁盘
  • 调整分片数与副本数
  • 定期清理过期索引

🧭 与其他监控系统对比

特性SkyWalkingZipkinPinpointJaeger
无侵入探针❌(需手动埋点)
UI 功能丰富度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
多语言支持❌(仅 Java)
拓扑图
日志集成
社区活跃度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

结论:如果你追求开箱即用、功能全面、UI 友好、生态活跃,SkyWalking 是首选。


🧩 插件开发入门(简要)

SkyWalking 支持自定义插件扩展,适用于私有协议或未支持的框架。

基本步骤:

  1. 继承 ClassEnhancePluginDefine
  2. 定义拦截点(构造函数、方法入口/出口)
  3. 实现 InstanceMethodsAroundInterceptor
  4. 打包为 JAR 放入 agent/plugins/

官方插件开发指南 👉 https://skywalking.apache.org/docs/skywalking-java/latest/en/setup/service-agent/java-agent/readme/


💡 最佳实践总结

  1. 生产环境开启采样:避免全量采集造成性能压力。
  2. 统一命名规范:服务名、实例名要有意义,便于排查。
  3. 结合日志系统:通过 TraceId 快速定位问题日志。
  4. 设置告警规则:及时发现异常流量或错误突增。
  5. 定期归档数据:避免存储无限增长。
  6. 培训团队使用 UI:提升整体排障效率。

🎁 结语

Apache SkyWalking 不仅仅是一个“链路追踪工具”,它是一个完整的可观测性平台,涵盖 Metrics、Tracing、Logging、Profiling、Alerting 五大支柱。

无论你是使用 Spring Cloud 构建微服务,还是 Dubbo 实现高性能 RPC,或是 RocketMQ 处理异步消息、ShardingSphere 管理海量数据,SkyWalking 都能为你提供透明、精准、实时的性能洞察。

不要再让“黑盒”困扰你的系统,从今天开始,给你的应用装上“天眼” 👁️ —— Apache SkyWalking!


📌 本文所有示例代码均可在本地搭建环境运行,建议配合官方文档进行深入学习。
📘 官方文档:https://skywalking.apache.org/docs/
🧑‍💻 社区论坛:https://github.com/apache/skywalking/discussions (注:此处仅为示意,实际请访问官网社区入口)
🐦 Twitter 更新:@ASFSkyWalking

希望这篇长文能帮你全面掌握 SkyWalking 在主流中间件中的实战应用!🎉 如果你觉得有用,欢迎分享给团队或同事,一起构建更稳定、更高效的分布式系统!🚀


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

Read more

微服务学习笔记(1)——SpringCloud概述

微服务学习笔记(1)——SpringCloud概述

🔥我的主页:九转苍翎⭐️个人专栏:《Java SE 》《Java集合框架系统精讲》《MySQL高手之路:从基础到高阶 》《计算机网络 》《Java工程师核心能力体系构建》《RabbitMQ理论与实践》天行健,君子以自强不息。 1.系统架构的迭代 1.1 单体架构 定义:整个应用程序的所有功能模块(如用户管理、订单管理、支付管理等)都打包在一个单一的进程中,使用同一个数据库 优点: * 技术栈统一:开发、测试、部署简单。 * 易于开发:初期功能集中,模块间直接调用,沟通成本低 * 性能高:本地方法调用,没有网络开销 * 部署单一:只需维护一个应用 缺点: * 代码复杂度高:随着功能增加,代码库变得庞大、耦合严重,难以理解和维护 * 技术栈固化:难以引入新的框架或语言 * 可扩展性差:无法针对特定模块进行独立伸缩,必须整体伸缩,

By Ne0inhk
PostgreSQL动态分区裁剪技术:查询性能优化解析(2026年版)

PostgreSQL动态分区裁剪技术:查询性能优化解析(2026年版)

PostgreSQL动态分区裁剪技术:从原理到实战的查询性能优化 一、引言 1.1 研究背景与意义 随着企业数据量从TB级向PB级演进,数据库管理系统面临着严峻的挑战。PostgreSQL作为一款功能强大的开源关系型数据库,凭借其高度的可扩展性和标准兼容性,在金融、电商、物联网等领域得到了广泛应用。然而,在处理海量数据时,如何通过分区裁剪技术精准定位目标数据,避免无关分区的无效扫描,已成为查询性能优化的关键突破口。 在实际应用中,许多场景对查询性能有着极高要求。以电商行业为例,订单数据量庞大,每天可能产生数百万甚至数千万条订单记录。在进行订单查询、统计分析等操作时,如果不能有效利用分区裁剪技术,查询可能会耗费大量时间,严重影响用户体验。又如在金融领域,交易数据的实时查询对于风险控制至关重要,动态分区裁剪技术能够帮助金融机构快速获取所需数据。 1.2 研究目标与范围 本文旨在深入研究PostgreSQL声明式分区表的动态裁剪机制,通过结合源码分析与实际案例,系统地阐述其实现原理、优化策略及性能影响因素。研究目标包括: * 从源码层面深入剖析动态分区裁剪的实现原理 *

By Ne0inhk
Flutter 组件 http_retry 的适配 鸿蒙Harmony 深度进阶 - 驾驭分布式负载感知重试、实现鸿蒙端高可靠通讯与协议幂等性审计方案

Flutter 组件 http_retry 的适配 鸿蒙Harmony 深度进阶 - 驾驭分布式负载感知重试、实现鸿蒙端高可靠通讯与协议幂等性审计方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 http_retry 的适配 鸿蒙Harmony 深度进阶 - 驾驭分布式负载感知重试、实现鸿蒙端高可靠通讯与协议幂等性审计方案 前言 在前文中,我们探讨了 http_retry 在鸿蒙(OpenHarmony)生态中解决单一移动终端弱网重试的基础实战。但在真正的“分布式工业物联网集成”、“跨设备协同办公资产同步”以及“需要对接具备动态压力管控的超大规模云原生后端”场景中。简单的指数退避往往难以应对复杂的网络分位震荡。面对一个需要在鸿蒙手机、智能穿戴设备与边缘网关之间,根据当前全网的平均负载压力(Load Pressure)动态调节重试节奏,并且要求在执行涉及核心资产变更(如:支付订单、库存锁定)的重试时执行绝对严密的协议幂等性(Idempotency)校验的高阶需求。如果缺乏一套具备分布式感知的重试调度模型。不仅会导致后端服务在故障恢复瞬间遭遇“重试波峰”引发再次崩溃,更会因为对非幂等操作的盲目重试。引发严重的业务资产错乱。 我们需要

By Ne0inhk
【MySQL数据库基础】(三)MySQL 库的核心操作全解析:创建、修改、备份一条龙搞定

【MySQL数据库基础】(三)MySQL 库的核心操作全解析:创建、修改、备份一条龙搞定

前言         在 MySQL 的学习和实战中,数据库(库)的操作是最基础也是最核心的环节,无论是项目开发、数据管理还是运维维护,都绕不开库的创建、配置、修改、备份等一系列操作。很多刚接触 MySQL 的小伙伴容易在字符集、校验规则、备份恢复这些细节上踩坑,今天这篇文章就结合实战案例,把 MySQL 库的全套操作讲透,从基础语法到高级技巧,从避坑指南到实战演示,让你一文掌握 MySQL 库操作的精髓! 一、创建数据库:基础语法与个性化配置         创建数据库是操作 MySQL 的第一步,看似简单的一句命令,背后却藏着字符集、校验规则的关键配置,选对配置能让后续的开发和数据管理少走很多弯路。 1. 核心创建语法         MySQL 中创建数据库的官方语法如下,其中大写部分为关键字,中括号[]内的为可选项,也是实际开发中需要重点关注的部分: CREATE DATABASE [IF NOT EXISTS]

By Ne0inhk