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 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>