dubbo分组/直连提供者+只订阅

本文介绍如何在开发测试环境中绕过Dubbo注册中心直连服务提供者,包括配置方法及注意事项。同时探讨服务分组和版本属性的应用,以实现服务的平稳升级。

一、直连提供者+只订阅

开发测试环境下,需要绕过注册中心,直接测试服务提供者,

1.在消费方配置【可以两个以上,中间用逗号隔开】。

<dubbo:reference interface="com.changhf.service.DeptmentService" id="deptmentService" check="false"  url="dubbo://192.168.1.1:20881"/>

serviceImpl里加个断点,每次访问都会走断点。在管控台本地服务接口最后点击禁用,还是可以正常访问,说明绕过了注册中心。

 

2.在adminstrator账户下建一个dubbo.resolve.properties,默认会读取该文件,

该文件里只需加入以下内容

com.changhf.service.DeptmentService=dubbo\://192.168.1.1\:20881

【注意】如果两种方式都不配置,消费者可能调本地服务也可能是稳定版的服务。

3、有时候你的服务在本地开发测试时需要注册到注册中心,但又没有完全做完的时候,如果就这样注册上去,
其他消费者在调用该服务时,就会偶尔的调用到你本地的服务,这样就报错了。

<dubbo:registry protocol="zookeeper" address="${dubbo.registry.address}" register="false"/>

在<dubbo:registry >最后添加register="false",这样别人就不会调你的本地服务,但你的本地服务所订阅的服务正常运行。

二、服务分组

官网上该应用值用在一个接口有多种实现类时,但可以用来替代上面的直连提供者+只订阅,因为配置xml,有可能会出现误提交,导致服务出现问题。最好不要为了切换环境而调整源码,这样容易导致将调整的代码发布到生产线,所以排除通过Spring的XML来配置。

<dubbo:service interface="com.changhf.service.IDubboGroupService" ref="dubboGroup1Service" group="feedback2"/>
<dubbo:reference interface="com.changhf.service.IDubboGroupService" id="dubboGroup1Service" check="false" group="feedback2"/>

group属性为该服务接口添加一个分组,消费者就只会调用同一分组的服务接口了。

也可以用version属性来替代:

<dubbo:service interface="com.changhf.service.DeptmentService" ref="deptmentService" version="2.0"/>
<dubbo:reference interface="com.changhf.service.DeptmentService" id="deptmentService" check="false" version="2.0"/>

两者结合,可实现服务的稳步升级。。

三、总结

经过试错,以下配置可以用户生产环境(推荐使用)

<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="dubboDemo" />

<!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry protocol="zookeeper" address="${dubbo.registry.address}" file="/home/chf/registry/dubbo_demo.cache"/>
<!-- 用dubbo协议在20881端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />

<!-- 监控中心配置 -->
<!-- 监控中心协议,如果为protocol="registry",表示从注册中心发现监控中心地址,否则直连监控中心 -->
<dubbo:monitor protocol= "registry" />	
<dubbo:provider timeout="600000" group="${dubbo.service.group}" version="${dubbo.service.version}" retries="${dubbo.service.retries}"/>
<dubbo:service interface="com.changhf.service.user.UserInfoManager" ref="userInfoManager" />

<dubbo:provider>为<dubbo:service>和<dubbo:protocol>标签的缺省值设置

同理,<dubbo:consumer>作为<dubbo:reference>标签的缺省值设置。

 

 

<think>嗯,用户现在要查询Dubbo订阅指定注册中心服务的配置属性。回顾之前的对话历史,用户之前已经问过类似的问题,我也提供了三种配置方案:registry属性绑定、URL参数指定、分组订阅。用户这次特别强调要查的是"配置属性",说明他可能正在编写配置文件或代码,需要具体的参数名称和用法。用户提供的三个站内引用中,引用[1]提到RegistryConfig类,这提示我应该关联Dubbo的API文档;引用[2]讲Redis注册中心的机制,但用户问题不涉及具体注册中心类型,可以忽略;引用[3]标题包含"配置方式详解",但链接已失效,需要谨慎参考。用户特意说明"上述引用仅供参考",所以还是以官方文档为准。考虑到用户可能是开发者,应该给出可直接粘贴的配置示例。需要特别注意两点:1)区分XML/注解/API不同配置方式2)提醒registry与registry-url的区别,避免常见错误。上次回复时用户对分组订阅感兴趣,这次可以补充Dubbo3的group优先级设置。突然想到一个易错点:在微服务架构中,如果同时存在直连和注册中心两种方式,订阅策略会失效。这应该作为高级注意事项补充。另外用户的环境可能是多注册中心,需要强调订阅和注册是独立配置的——比如服务注册到A中心但订阅B中心,这种情况要用registry-id明确区分。准备在回复最后补充监控相关的点,虽然用户没问,但根据经验,配置后验证订阅状态是常见的后续操作。用检查Invoker来源的方法实用性强,比看日志更直接。</think> 在 Dubbo 中精确订阅指定注册中心的服务,核心配置属性如下(**按配置方式分类**): --- ### 一、XML 配置(**最常用**) #### 1. 单注册中心订阅 ```xml <!-- 定义注册中心 --> <dubbo:registry id="reg1" address="zookeeper://192.168.1.10:2181"/> <dubbo:registry id="reg2" address="nacos://192.168.1.20:8848"/> <!-- 关键属性:registry --> <dubbo:reference id="demoService" interface="com.example.DemoService" registry="reg1"/> <!-- 仅订阅reg1 --> ``` - **作用**:该服务仅监听 `reg1` 注册中心的服务提供者变更,忽略 `reg2`[^1][^2] #### 2. 多注册中心订阅(带优先级) ```xml <dubbo:reference interface="com.example.DemoService" registry="reg1,reg2" registry-type="preferred"/> ``` - **`registry-type` 可选值**: - `preferred`:优先使用 `reg1`,不可用时降级到 `reg2` - `zone-aware`:按区域亲和性选择 --- ### 二、注解配置(**Spring Boot 场景**) ```java @DubboReference( registry = {"reg1"}, // 指定注册中心ID registryType = "preferred" // 多注册中心优先级 ) private DemoService demoService; ``` - **属性说明**: - `registry`:注册中心 ID 数组(`String[]` 类型) - `registryType`:多注册中心协作策略[^1] --- ### 三、API 编程配置(**动态服务调用**) ```java ReferenceConfig<DemoService> reference = new ReferenceConfig<>(); reference.setInterface(DemoService.class); reference.setRegistry(new RegistryConfig("zookeeper://192.168.1.10:2181")); // 直接指定注册中心地址 // 或通过注册中心ID reference.setRegistries(Collections.singletonList( new RegistryConfig().setId("reg1") )); ``` - **核心类**:`org.apache.dubbo.config.RegistryConfig`[^1] --- ### 四、高级属性:订阅分组(**Dubbo 3.0+**) ```xml <!-- 注册中心定义组 --> <dubbo:registry group="production" address="zookeeper://192.168.1.10:2181"/> <!-- 服务订阅指定组 --> <dubbo:reference interface="com.example.DemoService" registry-group="production"/> ``` - **效果**:跨多个注册中心时,只订阅 `group="production"` 的注册中心[^3] --- ### 五、属性对比表 | **配置属性** | **作用域 | 配置方式 | 适用版本 | |--------------------|-------------------|-------------------|----------| | `registry` | 服务订阅/注册 | XML/注解/API | 全版本 | | `registry-type` | 多注册中心优先级 | XML/注解 | ≥2.7.0 | | `registry-group` | 注册中心分组订阅 | XML/注解 | ≥3.0.0 | | `registry.url` | 直连指定地址 | URL参数 | 全版本 | --- ### 验证配置有效性(**调试方法**) ```java // 查看服务Invoker来源 List<Invoker<?>> invokers = ((ReferenceConfig<?>) reference).getInvokers(); invokers.forEach(invoker -> System.out.println("注册中心地址:" + invoker.getUrl().getParameter("registry")) ); // 输出示例:zookeeper://192.168.1.10:2181[^2] ``` --- ### 常见问题规避 1. **属性冲突**: - ❌ 同时配置 `registry` 和 `url`:`url` 优先级更高 - ✅ 正确用法:仅用 `registry` 控制订阅源 2. **订阅失效排查**: - 检查注册中心 ID 是否拼写错误 - 确认注册中心配置的 `id` 属性与服务订阅的 `registry` 值一致[^1] --- **相关问题** 1. 如何让 Dubbo 服务同时订阅多个注册中心? 2. Dubbo 3.0 的元数据中心与注册中心有何区别? 3. 订阅指定注册中心后如何监控其健康状态? 4. Zookeeper 和 Nacos 注册中心的订阅机制差异有哪些实际影响? [^1]: Dubbo 注册中心配置参数参见 `org.apache.dubbo.config.RegistryConfig` [^2]: 订阅原理通过监听注册中心特定路径实现,如 Zookeeper 的 `/dubbo/service/providers` [^3]: Dubbo 3.0 的分组订阅通过 `registry-group` 属性实现流量隔离
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值