Java中使用Dubbo实现RPC调用需完成定义接口、暴露服务、引用服务、注册发现四步闭环,通常搭配Nacos+Dubbo协议,通过共享API模块、@DubboService暴露、@DubboReference引用及统一配置实现。

在 Java 项目中使用 Dubbo 实现微服务间的 RPC 调用,核心是“定义接口、暴露服务、引用服务、注册发现”四步闭环。Dubbo 本身不绑定注册中心或通信协议,但生产环境通常搭配 ZooKeeper/Nacos + Dubbo 协议(基于 Netty)使用,兼顾性能与可靠性。
1. 引入依赖并统一 API 接口
服务提供方和服务消费方需共享一份接口定义(如 UserQueryService),通常抽成独立的 xxx-api 模块(仅含 interface 和 DTO),避免代码耦合。
Maven 中引入 Dubbo 和注册中心客户端(以 Nacos 为例):
<dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-cloud-starter</artifactId> <version>3.2.14</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2022.0.0.0-RC1</version> </dependency>
注意:Dubbo 3.x 推荐使用 dubbo-spring-cloud-starter(整合 Spring Cloud 生态),若用原生 Dubbo,可选 dubbo-spring-boot-starter。
立即学习“Java免费学习笔记(深入)”;
2. 服务提供方:声明并暴露接口
在提供方模块中,实现共享接口,并用 @DubboService 标记为远程服务(替代旧版 @Service):
示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
@DubboService
public class UserQueryServiceImpl implements UserQueryService {
@Override
public UserDTO getUserById(Long id) {
return new UserDTO(id, "张三", 28);
}
}
同时在 application.yml 中配置服务暴露信息:
dubbo:
application:
name: user-service-provider
registry:
address: nacos://127.0.0.1:8848
protocol:
name: dubbo
port: 20880
- 必须指定
registry.address,否则服务无法注册 -
protocol.port可省略(Dubbo 自动分配),但建议固定便于排查 - 接口方法参数和返回值需可序列化(推荐使用 POJO,避免 JDK 动态代理限制)
3. 服务消费方:声明并注入远程服务
消费方无需实现类,只需通过 @DubboReference 注入接口实例,调用方式与本地调用完全一致:
示例:
@RestController
public class UserController {
@DubboReference
private UserQueryService userQueryService;
@GetMapping("/user/{id}")
public UserDTO getUser(@PathVariable Long id) {
return userQueryService.getUserById(id); // 看似本地调用,实为远程 RPC
}
}
对应配置(同样需连通注册中心):
dubbo:
application:
name: user-service-consumer
registry:
address: nacos://127.0.0.1:8848
-
@DubboReference支持超时、重试、负载均衡策略等属性,如@DubboReference(timeout = 3000, retries = 1) - Dubbo 默认使用
random负载均衡,可通过loadbalance属性切换 - 接口调用失败时抛出
RpcException,建议配合 Sentinel 做熔断降级
4. 验证与可观测性
启动后,登录 Nacos 控制台(http://127.0.0.1:8848/nacos),查看服务列表是否出现 user-service-provider;消费方启动日志中应有 Refer dubbo service 提示。
进阶建议:
- 开启 Dubbo Admin(独立控制台)查看服务拓扑、调用链、QPS/延迟等指标
- 接入 SkyWalking 或 Prometheus + Grafana,监控 RPC 调用耗时与错误率
- 对关键接口启用异步调用(
@DubboReference(async = true))或泛化调用(适合网关场景)
不复杂但容易忽略:确保提供方和消费方的接口全限定名(包名+类名)、方法签名、DTO 字段类型完全一致;版本升级时建议显式加 version 属性做灰度隔离。

















