跳至正文
来两杯美式
返回

Dubbo 注册中心与直连调试:只订阅、只注册、多注册中心

By 来两杯美式
发布于

上一篇 《Dubbo 服务拆分与架构设计:子系统划分的四大原则》 讲了服务怎么拆。这一篇聚焦开发调试阶段最常用的四个连接技巧——直连、只订阅、只注册、多注册中心。这些配置在日常联调中每天都会用到,也是面试里高频问到的点。

基础配置结构

先看一个典型的 Dubbo 服务提供者配置(Spring Boot + YAML,当年的写法):

Dubbo 服务提供者配置:应用名、注册中心、dubbo 协议

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 配置的值。直连时地址写错端口是联调最常见的问题。

直连的适用场景

只订阅(register=“false”)

场景:消费者通过直连连到生产者,而生产者不会注册服务到注册中心;但生产者依赖的其他服务,仍然可以从注册中心正常获取。

典型用途:开发阶段把未完善的接口不发布到注册中心,避免影响其他调用方

只订阅配置: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
只订阅开发中服务不发布,只消费别人
只注册多注册中心发布,不依赖其他服务

小结

下一篇 《Dubbo 负载均衡:四种策略与源码分析》 讲流量分发——请求到底打到哪台机器。


分享这篇文章:
通过邮件分享这篇文章✓ 链接已复制
所属专题
Dubbo
第 2 / 5 篇
查看系列全部文章
  1. 01.Dubbo 入门:什么是 RPC 与服务治理?
  2. 02.Dubbo 注册中心与直连调试:只订阅、只注册、多注册中心
  3. 03.Dubbo 负载均衡:四种策略与源码分析
  4. 04.Dubbo 集群容错:架构、五种模式与服务暴露
  5. 05.Dubbo 服务拆分与架构设计:子系统划分的四大原则

上一篇
Dubbo 负载均衡:四种策略与源码分析
下一篇
Dubbo 入门:什么是 RPC 与服务治理?