Apache Dubbo 3 + Spring Boot 3 多模块 Maven 项目,演示基于 Zookeeper 注册中心的 RPC 调用

一、安装并启动zookeeper

下载并解压zookeeper,本文以apache-zookeeper-3.8.6-bin为例

1、将conf目录下的zoo_sample.cfg修改为zoo.cfg

2、新建目录D:\Program Files\apache-zookeeper-3.8.6-bin\data

并将zoo.cfg中的dataDir修改为D:\Program Files\apache-zookeeper-3.8.6-bin\data

3、编辑 Zookeeper 的配置文件 conf/zoo.cfg,在末尾添加一行(如果不加可能会显示8080端口被占用)

properties 复制代码
admin.serverPort=8081

4、启动zookeeper

cmd 复制代码
# 路径 apache-zookeeper-3.8.6-bin\bin
zkServer.md

二、编程Dubbo程序

1、说明文档

markdown 复制代码
## 项目概述
Apache Dubbo 3 + Spring Boot 3 多模块 Maven 项目,演示基于 Zookeeper 注册中心的 RPC 调用。

## 技术栈
- Java 17, Spring Boot 3.3.4, Dubbo 3.3.2, Spring Framework 6.1.13
- Zookeeper 注册中心(Curator 5 客户端)

## 模块结构
| 模块 | 职责 |
|------|------|
| `dubbo-demo-api` | 共享 API 接口定义(`DemoService`),无 Spring/Dubbo 依赖 |
| `dubbo-demo-provider` | 服务提供者,`@DubboService` 暴露接口实现 |
| `dubbo-demo-consumer` | 服务消费者,`@DubboReference` 引用远程服务 |

## 项目结构明细
dubbo-demo/
├── pom.xml                              # 父POM,管理依赖版本和模块
├── dubbo-demo-api/                      # 公共API模块
│   ├── pom.xml
│   └── src/main/java/com/atzrb/api/
│       └── DemoService.java             # 服务接口
├── dubbo-demo-provider/                 # 服务提供者
│   ├── pom.xml
│   ├── src/main/java/com/atzrb/
│   │   ├── DubboProviderApplication.java
│   │   └── DemoServiceImpl.java
│   └── src/main/resources/
│       └── application.yml
└── dubbo-demo-consumer/                 # 服务消费者
    ├── pom.xml
    ├── src/main/java/com/atzrb/
    │   ├── DubboConsumerApplication.java
    │   └── DemoConsumerRunner.java
    └── src/main/resources/
        └── application.yml

## 启动与运行
**启动顺序:Zookeeper → Provider → Consumer**

### parent pom.xml 的 Spring 版本覆写

`dubbo-bom` 会引入不兼容的 Spring Framework 版本,父 POM 在 `dependencyManagement` 中显式将 `spring-core`、`spring-context`、`spring-beans`、`spring-aop`、`spring-expression`、`spring-jcl`、`spring-context-support` 锁定到 6.1.13。新增 Spring 依赖时需检查是否需要同样覆写。

2、父POM (pom.xml)

xml 复制代码
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.atzrb</groupId>
    <artifactId>dubbo-demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <packaging>pom</packaging>
    <modules>
        <module>dubbo-demo-api</module>
        <module>dubbo-demo-provider</module>
        <module>dubbo-demo-consumer</module>
    </modules>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.4</version>
        <relativePath/>
    </parent>

    <properties>
        <java.version>17</java.version>
        <dubbo.version>3.3.2</dubbo.version>
        <spring-framework.version>6.1.13</spring-framework.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-bom</artifactId>
                <version>${dubbo.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- Override Spring Framework version polluted by dubbo-bom -->
            <!-- Spring Boot 3.3.4 requires Spring Framework 6.1.x -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>${spring-framework.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
                <version>${spring-framework.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aop</artifactId>
                <version>${spring-framework.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-expression</artifactId>
                <version>${spring-framework.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jcl</artifactId>
                <version>${spring-framework.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context-support</artifactId>
                <version>${spring-framework.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

3、API模块 (dubbo-demo-api)

3.1 pom文件
xml 复制代码
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.atzrb</groupId>
        <artifactId>dubbo-demo</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>dubbo-demo-api</artifactId>
    <packaging>jar</packaging>
    
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
</project>
3.2 DemoService.java
java 复制代码
package com.atzrb.api;

public interface DemoService {
    String sayHello(String name);
}

4、服务提供者 (dubbo-demo-provider)

4.1 pom.xml
xml 复制代码
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.atzrb</groupId>
        <artifactId>dubbo-demo</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>dubbo-demo-provider</artifactId>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!-- Spring Boot Starter -->
        <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>
        </dependency>

        <!-- Zookeeper Curator5 Starter(Zookeeper Server 3.5.x 及以上版本使用) -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-zookeeper-curator5-spring-boot-starter</artifactId>
        </dependency>

        <!-- API 模块 -->
        <dependency>
            <groupId>com.atzrb</groupId>
            <artifactId>dubbo-demo-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>
4.2 application.yml
yml 复制代码
dubbo:
  application:
    name: dubbo-demo-provider
  registry:
    address: zookeeper://127.0.0.1:2181
  protocol:
    name: dubbo
    port: 20880
  scan:
    base-packages: com.atzrb
4.3 DubboProviderApplication.java
java 复制代码
@SpringBootApplication
@EnableDubbo
public class DubboProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(DubboProviderApplication.class, args);
        System.out.println("Dubbo Provider started successfully!");
    }
}
4.4 DemoServiceImpl.java
java 复制代码
@DubboService
public class DemoServiceImpl implements DemoService {
    @Override
    public String sayHello(String name) {
        return "Hello, " + name + "! (from Dubbo Provider)";
    }
}

5、服务消费者 (dubbo-demo-consumer)

5.1 pom.xml
xml 复制代码
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.atzrb</groupId>
        <artifactId>dubbo-demo</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>dubbo-demo-consumer</artifactId>
    <packaging>jar</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!-- Spring Boot Starter -->
        <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>
        </dependency>
        <!-- Zookeeper Curator5 Starter -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-zookeeper-curator5-spring-boot-starter</artifactId>
        </dependency>
        <!-- API 模块 -->
        <dependency>
            <groupId>com.atzrb</groupId>
            <artifactId>dubbo-demo-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

</project>
6.2 application.yml
yaml 复制代码
dubbo:
  application:
    name: dubbo-demo-consumer
  registry:
    address: zookeeper://127.0.0.1:2181
6.3 DubboConsumerApplication.java
java 复制代码
@SpringBootApplication
@EnableDubbo
public class DubboConsumerApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext context =
                SpringApplication.run(DubboConsumerApplication.class, args);
        DemoConsumerRunner runner = context.getBean(DemoConsumerRunner.class);
        runner.run();
    }
}
6.4 DemoConsumerRunner.java
java 复制代码
@Component
public class DemoConsumerRunner {
    @DubboReference
    private DemoService demoService;

    public void run() {
        String result = demoService.sayHello("Dubbo Learner");
        System.out.println("=== Consumer received: " + result + " ===");
    }
}
相关推荐
阿pin2 小时前
Java随笔-ConcurrentHashMap
java·开发语言·哈希算法
C+-C资深大佬2 小时前
Java 变量:从入门到精通
java·开发语言·python
Flittly3 小时前
【日常小问】Docker 部署 Nacos 2.4.3,Dubbo 3.3 连接 Config Service 失败排查
java·spring boot·dubbo
kuonyuma3 小时前
java之动态代理
java·开发语言
衔烛之龙13 小时前
Windows x64 构建 liboqs-java教程
java·windows·python
一路向北North3 小时前
Spring Security OAuth2.0(20):完善环境配置
java·后端·spring
Java面试题总结3 小时前
IntelliJ IDEA 从卡顿到起飞,只用改这些。。。
java·ide·intellij-idea
兰令水3 小时前
hot100【acm版】【2026.7.11/12打卡-java版本】
java·开发语言·数据结构·算法·职场和发展
Misnearch4 小时前
nacos配置管理改造
java·spring cloud·nacos