dubbo注册多次踩坑
一个应用有多个注册中心,如果service不指定registry,将使用哪个注册中心?
1)情况一:如下图所示,项目中配置了两个注册中心r1和r2,如果service没有指定注册中心,则该service会在两个注册中心同时注册。(故事背景:r1为消费者的注册中心,r2为生产者的注册中心,address1和address2相同,group1表示线上环境,group2表示预发环境,service本应该注册到预发group上,结果注册到了线上group引起故障)
<!-- 注册中心1 -->
<dubbo:registry id="r1" address="${address1}" group="${group1}"/>
<!-- 注册中心2 -->
<dubbo:registry id="r2" address="${address2}" group="${group2}"/>
<dubbo:service interface="com.ccc.***" ref="someObj" />
2)情况二:如果注册中心r1的default属性设置为false(该属性默认为true),则service将使用r2作为注册中心。
<!-- 注册中心1 -->
<dubbo:registry id="r1" address="${dubbo.zookeeper.address}" group="${dubbo.zookeeper.group}" default="false"/>
<!-- 注册中心2 -->
<dubbo:registry id="r2" address="${dubbo.zookeeper.address}" group="${dubbo.zookeeper.group}"/>
<dubbo:service interface="com.ccc.***" ref="someObj" />
结论:service一定要指明注册中心,避免踩坑,如下:
<!-- 注册中心1 -->
<dubbo:registry id="r1" address="${dubbo.zookeeper.address}" group="${dubbo.zookeeper.group}"/>
<!-- 注册中心2 -->
<dubbo:registry id="r2" address="${dubbo.zookeeper.address}" group="${dubbo.zookeeper.group}"/>
<dubbo:service interface="com.ccc.***" ref="someObj" registry="r2"/>
源码(dubbo-2.6.8):
方法:com.alibaba.dubbo.config.spring.ServiceBean#afterPropertiesSet , 189:204行
if ((getRegistries() == null || getRegistries().isEmpty())
&& (getProvider() == null || getProvider().getRegistries() == null || getProvider().getRegistries().isEmpty())
&& (getApplication() == null || getApplication().getRegistries() == null || getApplication().getRegistries().isEmpty())) {
Map<String, RegistryConfig> registryConfigMap = applicationContext == null ? null : BeanFactoryUtils.beansOfTypeIncludingAncestors(applicationContext, RegistryConfig.class, false, false);
if (registryConfigMap != null && registryConfigMap.size() > 0) {
List<RegistryConfig> registryConfigs = new ArrayList<RegistryConfig>();
for (RegistryConfig config : registryConfigMap.values()) {
if (config.isDefault() == null || config.isDefault().booleanValue()) { //只要default不等于false,就会被注册
registryConfigs.add(config);
}
}
if (registryConfigs != null && !registryConfigs.isEmpty()) {
super.setRegistries(registryConfigs);
}
}
}
版权声明:本文为u011679999原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。