一个 整合 Nacos + Dubbo + SkyWalking 的完整微服务示例

一个 整合 Nacos + Dubbo + SkyWalking 的完整微服务示例,整合了:

  • 🌐 Nacos:作为注册中心 + 配置中心
  • 🚀 Dubbo:服务间 RPC 调用
  • 🔍 SkyWalking:无侵入式链路追踪、性能监控

✅ 目标:
构建两个 Dubbo 微服务(providerconsumer),通过 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

访问:http://localhost:8080


📦 二、创建 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

访问:http://localhost:8080

验证内容:
功能验证方法
✅ 服务注册Dashboard 中看到 dubbo-consumerdubbo-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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值