上一篇 《Dubbo 服务拆分与架构设计:子系统划分的四大原则》 讲了服务怎么拆。这一篇聚焦开发调试阶段最常用的四个连接技巧——直连、只订阅、只注册、多注册中心。这些配置在日常联调中每天都会用到,也是面试里高频问到的点。
基础配置结构
先看一个典型的 Dubbo 服务提供者配置(Spring Boot + YAML,当年的写法):

dubbo:
application:
name: wms-provider # 应用名,注册中心的标识
base-package: com.motorsc.wms.service # 要扫描并暴露的服务实现包
registry:
address: 10.129.83.213 # 注册中心地址
port: 2181 # ZooKeeper 默认端口
protocol:
name: dubbo # 使用 dubbo 协议
serialization: hessian2 # 序列化方式
port: 20888 # 暴露服务的端口
provider:
# 服务端全局配置(超时、重试等)
base-package是 Spring Boot 方式的核心:Dubbo 自动扫描该包下的实现类,把带@Service注解的服务暴露出去。
设置直连服务者
正常流程中,Consumer 从注册中心拿服务地址。但开发联调时,只想连本地起的 Provider,不想走注册中心,怎么办?用直连。
在 <dubbo:reference> 中加入 url 参数,或者在 @Reference 注解中加 url:
// 注解方式:@Reference 直接指定 Provider 地址
@Reference(url = "dubbo://localhost:20888")
private UserService userService;
<!-- XML 方式 -->
<dubbo:reference id="userService" interface="com.example.UserService"
url="dubbo://localhost:20888"/>
其中的端口号
20888为生产者方配置的 dubbo 协议端口——就是 Provider 端protocol.port配置的值。直连时地址写错端口是联调最常见的问题。
直连的适用场景
- 本地起了 Provider,不想注册到公共注册中心影响别人。
- 想绕过注册中心,快速验证某个服务节点。
- 注册中心不可用时临时应急。
只订阅(register=“false”)
场景:消费者通过直连连到生产者,而生产者不会注册服务到注册中心;但生产者依赖的其他服务,仍然可以从注册中心正常获取。
典型用途:开发阶段把未完善的接口不发布到注册中心,避免影响其他调用方。

dubbo:
application:
name: wms-provider
base-package: com.motorsc.wms.service.impl
registry:
address: 10.129.83.213
port: 2181
register: false # 只订阅,不注册自己
protocol:
# ...
XML 方式等价写法:
<dubbo:registry address="10.20.153.10:9090" register="false"/>
语义拆解:
| 方向 | 是否开启 | 效果 |
|---|---|---|
| 订阅(subscribe) | 默认开 | 能发现并调用注册中心里其他服务 |
| 注册(register) | false | 自己的服务不上注册中心,别人发现不了你 |
所以
register="false"的含义是:我连得上你们(订阅),但你们发现不了我(不注册)——开发机上跑个不完整的服务,正是这个场景。
只注册(subscribe=“false”)
场景:有多个注册中心的情况下,将服务注册到两个注册中心,但不需要依赖两个注册中心的其他服务。
<dubbo:registry address="10.20.153.10:9090" subscribe="false"/>
语义拆解:
| 方向 | 是否开启 | 效果 |
|---|---|---|
| 注册(register) | 默认开 | 自己的服务注册到注册中心 |
| 订阅(subscribe) | false | 不从注册中心拉取其他服务地址 |
subscribe="false"的含义:你们能发现我(注册),但我不管你们(不订阅)——服务发布到多个注册中心做冗余,又不希望每个注册中心的依赖都拉进来。
多注册中心
同一个服务可以注册到多个注册中心,实现跨机房、跨环境的高可用:
<!-- 注册到多个注册中心 -->
<dubbo:registry id="reg1" address="zookeeper://10.20.153.10:2181"/>
<dubbo:registry id="reg2" address="zookeeper://10.20.153.20:2181"/>
<!-- 服务同时注册到两个注册中心 -->
<dubbo:service interface="com.example.UserService" ref="userServiceImpl" registry="reg1,reg2"/>
多注册中心的用途:
- 容灾:一个注册中心挂掉,服务仍可从另一个发现。
- 环境隔离:开发、测试、生产各用各的注册中心,互不干扰。
- 跨机房:就近调用本机房的服务,降低跨机房延迟。
四种方式对比总结
| 方式 | 注册(register) | 订阅(subscribe) | 典型场景 |
|---|---|---|---|
| 正常模式 | 开 | 开 | 生产环境标准配置 |
| 直连(url) | 绕过注册中心 | 绕过注册中心 | 本地联调,直接指定 Provider |
| 只订阅 | 关 | 开 | 开发中服务不发布,只消费别人 |
| 只注册 | 开 | 关 | 多注册中心发布,不依赖其他服务 |
小结
- 直连:
@Reference(url="dubbo://localhost:20888"),联调利器,端口是 Provider 的 dubbo 协议端口。 - 只订阅:
register="false",不发布未完善的服务,还能消费别人。 - 只注册:
subscribe="false",发布到多注册中心,不依赖它们的其他服务。 - 多注册中心:容灾 + 环境隔离 + 就近调用。
下一篇 《Dubbo 负载均衡:四种策略与源码分析》 讲流量分发——请求到底打到哪台机器。