一、安装并启动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 + " ===");
}
}