Dubbo + Spring Boot + Zookeeper 快速搭建分布式服务
本文将详细介绍如何基于 Dubbo、Spring Boot 和 Zookeeper 快速搭建一个简单的分布式服务调用场景,包含服务提供者(Provider)、服务消费者(Consumer)及公共接口(API)的创建与配置,帮助开发者快速上手分布式服务开发。
1. 环境准备与项目结构设计
1.1 核心组件版本说明
- Spring Boot:2.7.15(稳定版本,兼容性较好)
- Dubbo:3.1.0(支持 Spring Boot 自动配置,简化开发)
- Zookeeper:3.4.6(作为服务注册中心,需提前在本地安装并启动)
1.2 启动本地 Zookeeper
Zookeeper 是 Dubbo 默认的服务注册中心,需先确保本地 Zookeeper 正常运行:
-
下载 Zookeeper 并解压,进入
bin
目录 -
执行
zkServer.cmd
(Windows)启动服务 -
启动成功后,控制台会显示类似如下信息:
1.3 创建父项目与子模块
使用 IDEA 或 Eclipse 创建一个 Spring Boot 父项目,然后在父项目下新建 3 个子模块,分别对应:
- api:存放公共接口(服务契约),供 Provider 和 Consumer 依赖
- provider:服务提供者,实现 api 模块的接口并暴露服务
- consumer:服务消费者,调用 Provider 暴露的服务
项目结构如图所示:
2. 核心依赖配置
2.1 父项目依赖管理
在父项目的 pom.xml
添加依赖,供consumer和provider模块使用
<groupId>com.example</groupId>
<artifactId>dubbo-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>consumer</module>
<module>provider</module>
<module>dubbo-api</module>
</modules>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.15</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-registry-zookeeper -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-zookeeper</artifactId>
<version>3.1.0</version>
</dependency>
</dependencies>
2.2 Provider 与 Consumer 依赖
在 provider
和 consumer
模块的 pom.xml
中添加api模块的依赖
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>dubbo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
3. 服务配置与启动
3.1 Provider 配置(服务提供者)
在 provider/src/main/resources/application.yml
中配置服务端口、Dubbo 应用名及注册中心地址:
server:
port: 8081 # Provider 端口,避免与 Consumer 冲突
dubbo:
application:
name: dubbo-demo-provider # 应用名称,唯一标识
registry:
address: zookeeper://127.0.0.1:2181 # Zookeeper 注册中心地址
3.2 Consumer 配置(服务消费者)
在 consumer/src/main/resources/application.yml
中配置:
server:
port: 8080 # Consumer 端口,与 Provider 区分
dubbo:
application:
name: dubbo-demo-consumer # 应用名称,唯一标识
registry:
address: zookeeper://127.0.0.1:2181 # 同 Provider 的注册中心地址
3.3 启动类配置
-
Provider 启动类:添加
@EnableDubbo
注解,开启 Dubbo 自动配置并扫描服务实现类@SpringBootApplication @EnableDubbo // 关键注解:启用 Dubbo 服务注册与发现 public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } }
-
Consumer 启动类:无需额外注解,直接启动即可
@SpringBootApplication public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } }
分别启动 Provider 和 Consumer 后,控制台显示启动成功:
4. 服务接口定义与实现
4.1 公共 API 接口(api 模块)
在 api
模块中定义服务接口(服务契约),作为 Provider 和 Consumer 的通信标准:
package com.example.api.service;
/**
* 公共服务接口
*/
public interface HelloService {
// 定义一个简单的远程调用方法
String sayHello(String name);
}
4.2 Provider 实现服务接口
在 provider
模块中创建接口实现类,并通过 @DubboService
注解标记为 Dubbo 服务:
package com.example.provider.service.impl;
import com.example.api.service.HelloService;
import org.apache.dubbo.config.annotation.DubboService;
/**
* 服务实现类:需实现 api 模块的接口
*/
@DubboService // 关键注解:声明为 Dubbo 服务提供者
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String name) {
return "Hello:" + name + ",我是 Dubbo 服务提供者!";
}
}
4.3 Consumer 调用远程服务
在 consumer
模块中创建控制器,通过 @DubboReference
注解注入远程服务接口并调用:
package com.example.consumer.controller;
import com.example.api.service.HelloService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 消费者控制器:测试远程服务调用
*/
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
// 关键注解:引用远程 Dubbo 服务
@DubboReference
private HelloService helloService;
// 提供 HTTP 接口,用于测试远程调用
@GetMapping("/testHello")
public String testHello() {
// 调用远程服务方法
return helloService.sayHello("Dubbo 消费者");
}
}
5. 验证服务调用
5.1 检查服务注册状态
通过 Zookeeper 客户端验证服务是否注册成功:
-
进入 Zookeeper 的
bin
目录,双击zkCli.cmd
启动客户端 -
执行命令
ls /services
查看注册的服务,可看到
ls /services/dubbo-demo-provider
已注册:
5.2 测试远程调用
启动 Provider 和 Consumer 后,通过浏览器或 Postman 访问 Consumer 的测试接口:
- 请求地址:
http://localhost:8080/consumer/testHello
- 成功响应结果:
Hello:Dubbo 消费者,我是 Dubbo 服务提供者!
调用成功界面如下:
6. 常见问题与解决方案
- 服务注册失败:
- 检查 Zookeeper 是否启动,地址是否正确(默认端口 2181)
- Provider 启动类是否添加
@EnableDubbo
注解,确保服务被扫描
- 消费者找不到服务:
- 检查 Provider 和 Consumer 的
application.yml
中dubbo.registry.address
是否一致 - 确认 API 接口的包路径在 Provider 和 Consumer 中完全相同(Dubbo 基于接口全类名匹配服务)
- 检查 Provider 和 Consumer 的
- 依赖冲突:
- 统一管理 Dubbo 和 Spring Boot 版本,避免不同模块依赖版本不一致
总结
通过本文的步骤,我们快速搭建了一个基于 Dubbo + Spring Boot + Zookeeper 的分布式服务调用场景,核心流程包括:
- 搭建 Zookeeper 注册中心
- 创建 Provider、Consumer 和 API 模块并配置依赖
- 定义服务接口并实现,通过注解暴露和引用服务
- 验证远程服务调用
Dubbo 作为高性能的 RPC 框架,结合 Spring Boot 的自动配置和 Zookeeper 的服务治理能力,可大幅简化分布式服务的开发与维护,适合中小型分布式系统快速落地。