本文目录导读:

Java 中实现 Dubbo 案例,核心步骤包括:搭建注册中心(推荐 Zookeeper)、定义接口、提供者实现服务并暴露、消费者引用并调用服务。
下面是一个完整的、可直接运行的 Mini 案例(基于 Dubbo 3.x + Spring Boot 2.x + Zookeeper)。
技术选型与准备
- JDK 8+
- Maven 3.6+
- Zookeeper 3.7+(作为注册中心)—— 启动本地 ZK 服务(默认端口 2181)
- Spring Boot 2.7.x
- Dubbo 3.2.x
整体项目结构
建议使用 Maven 多模块项目:
dubbo-demo
├── dubbo-api // 接口定义(POJO + Service 接口)
├── dubbo-provider // 服务提供者(Spring Boot)
└── dubbo-consumer // 服务消费者(Spring Boot)
第一步:定义接口模块(dubbo-api)
pom.xml:仅需少量依赖(可选 Lombok)。
实体类:
package com.example.api;
import java.io.Serializable;
public class User implements Serializable {
private Long id;
private String name;
private String email;
// getters / setters / toString(省略)
}
服务接口:
package com.example.api;
public interface UserService {
User getUserById(Long id);
String sayHello(String name);
}
安装到本地仓库:mvn clean install
第二步:服务提供者(dubbo-provider)
pom.xml 核心依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.18</version>
</parent>
<dependencies>
<!-- Dubbo Spring Boot Starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>3.2.12</version>
</dependency>
<!-- Zookeeper 客户端(使用 Curator) -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper-curator5</artifactId>
<version>3.2.12</version>
<type>pom</type>
</dependency>
<!-- 接口模块 -->
<dependency>
<groupId>com.example</groupId>
<artifactId>dubbo-api</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
application.yml(或 properties):
dubbo:
application:
name: user-provider
registry:
address: zookeeper://127.0.0.1:2181
protocol:
name: dubbo
port: -1 # 随机端口(推荐)
scan:
base-packages: com.example.provider.service
服务实现类:
package com.example.provider.service;
import com.example.api.User;
import com.example.api.UserService;
import org.apache.dubbo.config.annotation.DubboService;
@DubboService // 声明并暴露服务
public class UserServiceImpl implements UserService {
@Override
public String sayHello(String name) {
return "Hello, " + name + "! (from provider)";
}
@Override
public User getUserById(Long id) {
// 模拟数据库查询
return new User(id, "张三-" + id, "zhangsan@example.com");
}
}
Spring Boot 启动类:
package com.example.provider;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableDubbo // 可选(但建议加上,显式启用 Dubbo 扫描)
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
启动后,服务将注册到 Zookeeper(可在 ZK 客户端查看 /dubbo 节点)。
第三步:服务消费者(dubbo-consumer)
pom.xml:与 provider 类似,依赖 dubbo-spring-boot-starter、Zookeeper 客户端、dubbo-api。
application.yml:
dubbo:
application:
name: user-consumer
registry:
address: zookeeper://127.0.0.1:2181
消费代码(Controller 或 Service):
package com.example.consumer.controller;
import com.example.api.User;
import com.example.api.UserService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/user")
public class UserController {
@DubboReference // 远程引用服务
private UserService userService;
@GetMapping("/hello")
public String hello(@RequestParam String name) {
return userService.sayHello(name);
}
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return userService.getUserById(id);
}
}
启动类:
package com.example.consumer;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableDubbo
@SpringBootApplication
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
验证运行
- 启动 Zookeeper(默认端口 2181)
- 启动 Provider(控制台显示
dubbo service started) - 启动 Consumer(作为 Spring Boot Web 服务,默认端口 8080)
- 浏览器/curl:
http://localhost:8080/user/hello?name=Dubbo→ 返回:Hello, Dubbo! (from provider) - 访问:
http://localhost:8080/user/1→ 返回 JSON:{"id":1,"name":"张三-1","email":"zhangsan@example.com"}
核心要点说明
| 组件 | 说明 |
|---|---|
@DubboService |
标注在 Provider 实现类上,暴露服务 |
@DubboReference |
标注在 Consumer 字段上,注入远程代理 |
dubbo.protocol.port=-1 |
自动分配可用端口(推荐避免冲突) |
| Zookeeper 客户端 | 使用 Curator 5.x(dubbo-dependencies-zookeeper-curator5) |
| 序列化 | 实体类必须实现 Serializable(Dubbo 默认 Hessian2 序列化) |
常见问题
- Zookeeper 连接不上:检查 ZK 是否启动、端口是否正确、防火墙是否关闭。
- 版本不兼容:Dubbo 3.x 与 Spring Boot 2.x 搭配稳定,请勿混用过低版本。
- 服务找不到:确认 provider 已启动且注册成功(ZooInspector 查看 zk 节点)。
- @EnableDubbo 缺失:Dubbo 自动配置可能失效,建议显式添加。
如果需要更高级特性(如负载均衡、超时配置、多注册中心、TLS、Spring Cloud Alibaba 集成等),可以在 application.yml 中进一步配置 dubbo.consumer、dubbo.provider 参数。