一个 整合 Nacos + Dubbo + SkyWalking 的完整微服务示例,整合了:
- 🌐 Nacos:作为注册中心 + 配置中心
- 🚀 Dubbo:服务间 RPC 调用
- 🔍 SkyWalking:无侵入式链路追踪、性能监控
✅ 目标:
构建两个 Dubbo 微服务(provider和consumer),通过 Nacos 注册发现,使用 SkyWalking 实现 端到端的分布式链路追踪,在 UI 中清晰看到:
Consumer → Dubbo Call → Provider的完整调用链。
🧩 完整架构图
+----------------+ +---------------------+
| | | |
| Consumer |<--->| Nacos Server |
| (Dubbo) | | (Service Registry) |
| | | |
+-------+--------+ +----------+----------+
| |
| |
| +--------------------v--------------------+
+--->| |
| SkyWalking OAP + UI |
| (Collect & Visualize) |
| |
+---------------------+---------------------+
|
| (gRPC)
v
+----------------------+
| Provider (Dubbo) |
+----------------------+
🛠️ 一、前置环境准备
1. 启动 Nacos Server(单机模式)
# 下载 Nacos 2.2.3
wget https://github.com/alibaba/nacos/releases/download/2.2.3/nacos-server-2.2.3.tar.gz
tar -xzf nacos-server-2.2.3.tar.gz
# 启动单机模式
cd nacos/bin
sh startup.sh -m standalone
访问:http://localhost:8848/nacos
账号密码:nacos/nacos
2. 启动 SkyWalking(OAP + UI + ES)
git clone https://github.com/apache/skywalking-docker.git
cd skywalking-docker/compose/9.7.0/elasticsearch
docker-compose up -d
📦 二、创建 Maven 多模块项目
dubbo-skywalking-demo/
├── pom.xml
├── api/ # 公共接口模块
│ └── src/main/java/com/example/DemoService.java
├── provider/ # Dubbo 提供者
│ ├── src/main/java/com/example/ProviderApplication.java
│ └── src/main/resources/application.yml
├── consumer/ # Dubbo 消费者
│ ├── src/main/java/com/example/ConsumerApplication.java
│ └── src/main/resources/application.yml
└── pom.xml
📄 三、公共接口模块(api)
api/pom.xml(可选,如果独立模块)
<groupId>com.example</groupId>
<artifactId>dubbo-skywalking-api</artifactId>
<version>1.0.0</version>
api/src/main/java/com/example/DemoService.java
package com.example;
public interface DemoService {
String sayHello(String name);
}
🟢 四、Dubbo 提供者(Provider)
1. provider/pom.xml
<dependencies>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- Dubbo Spring Boot Starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>3.2.9</version>
</dependency>
<!-- Nacos Discovery -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>3.2.9</version>
</dependency>
<!-- SkyWalking Agent 会自动增强 Dubbo -->
<!-- 无需引入 SDK -->
</dependencies>
2. 实现服务
provider/src/main/java/com/example/ProviderApplication.java
package com.example;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
@DubboService
public class DemoServiceImpl implements DemoService {
@Override
public String sayHello(String name) {
try {
Thread.sleep(50); // 模拟处理
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
return "Hello, " + name + " from Provider!";
}
}
}
3. 配置文件
provider/src/main/resources/application.yml
server:
port: 20881
spring:
application:
name: dubbo-provider
dubbo:
protocol:
name: dubbo
port: 20880
registry:
address: nacos://127.0.0.1:8848
application:
name: dubbo-provider
config-center:
address: nacos://127.0.0.1:8848
🔵 五、Dubbo 消费者(Consumer)
1. consumer/pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>3.2.9</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>3.2.9</version>
</dependency>
<!-- 引入 API 模块 -->
<dependency>
<groupId>com.example</groupId>
<artifactId>dubbo-skywalking-api</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
2. 消费服务
consumer/src/main/java/com/example/ConsumerApplication.java
package com.example;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class ConsumerApplication {
@DubboReference
private DemoService demoService;
@GetMapping("/call/{name}")
public String call(@PathVariable String name) {
return demoService.sayHello(name);
}
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
3. 配置文件
consumer/src/main/resources/application.yml
server:
port: 8080
spring:
application:
name: dubbo-consumer
dubbo:
registry:
address: nacos://127.0.0.1:8848
application:
name: dubbo-consumer
config-center:
address: nacos://127.0.0.1:8848
🚀 六、启动并接入 SkyWalking Agent
1. 下载 SkyWalking Agent
wget https://downloads.apache.org/skywalking/9.7.0/apache-skywalking-apm-9.7.0.tar.gz
tar -xzf apache-skywalking-apm-9.7.0.tar.gz
路径示例:/your/path/to/skywalking/agent
2. 启动 Provider(带 Agent)
java \
-javaagent:/your/path/to/skywalking/agent/skywalking-agent.jar \
-DSW_AGENT_NAME=dubbo-provider \
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=localhost:11800 \
-jar provider/target/provider.jar
3. 启动 Consumer(带 Agent)
java \
-javaagent:/your/path/to/skywalking/agent/skywalking-agent.jar \
-DSW_AGENT_NAME=dubbo-consumer \
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=localhost:11800 \
-jar consumer/target/consumer.jar
🔍 七、验证链路追踪
1. 发起请求
curl http://localhost:8080/call/SkyWalking
2. 查看 SkyWalking UI
验证内容:
| 功能 | 验证方法 |
|---|---|
| ✅ 服务注册 | Dashboard 中看到 dubbo-consumer 和 dubbo-provider |
| ✅ 拓扑图 | Topology 中出现两个服务,有调用箭头 |
| ✅ 调用链 | Trace 页面 → 查找 /call/* → 看到两个 Span:• Spring MVC(入口)• Dubbo(远程调用) |
| ✅ 耗时分析 | 查看 Dubbo 调用耗时是否包含网络 + Provider 处理时间 |
🎉 成功标志:调用链中能看到 从 Consumer 到 Provider 的完整 Dubbo 调用,Trace ID 一致。
🧩 八、高级特性(可选)
1. 自定义 Span 标签(Tag)
在 Consumer 中添加:
import org.apache.skywalking.apm.toolkit.trace.TraceContext;
@GetMapping("/call/{name}")
public String call(@PathVariable String name) {
// 添加业务标签
TraceContext.traceId();
// 可用于日志关联
return demoService.sayHello(name);
}
2. 日志关联 Trace ID
# application.yml
logging:
pattern:
console: "%d{HH:mm:ss} [%thread] %level %logger{36} - traceId=%X{trace_id} %msg%n"
📦 项目打包与 Docker 化(生产推荐)
可为每个服务编写 Dockerfile,将 Agent 打包进去,实现零配置部署。
✅ 总结:Nacos + Dubbo + SkyWalking 接入要点
| 组件 | 关键点 |
|---|---|
| Nacos | 提供服务注册与发现,Dubbo 自动集成 |
| Dubbo | 使用 @DubboService / @DubboReference |
| SkyWalking | 仅需 Agent,无需改代码,自动增强 Dubbo 协议 |
| Agent | 每个 JVM 实例都要挂载,服务名唯一 |
🎁 完整代码示例仓库(可克隆):
👉 https://github.com/apache/skywalking/tree/v9.7.0/examples/dubbo
1542

被折叠的 条评论
为什么被折叠?



