写点什么

几个你不知道的 dubbo 注册中心细节

用户头像
小楼
关注
发布于: 2021 年 03 月 16 日

你会正确配置 backup 地址吗?


在配置 dubbo 注册中心时,一般会这样写


dubbo.registry.protocol=zookeeperdubbo.registry.address=127.0.0.1:2181
复制代码


也会简单地写成


dubbo.registry.address=zookeeper://127.0.0.1:2181
复制代码


当 zookeeper 地址不止一个,需要配置 backup 地址时,会这样写


dubbo.registry.protocol=zookeeperdubbo.registry.address=127.0.0.1:2181,127.0.0.1:2182
复制代码


这时候如果你简写成这样


dubbo.registry.address=zookeeper://127.0.0.1:2181,127.0.0.1:2182
复制代码


那就启动报错了~看下报错日志


java.lang.IllegalStateException: Failed to receive INITIALIZED event from zookeeper, pls. check if url zookeeper://127.0.0.1:2181,127.0.0.1:2182/org.apache.dubbo.metadata.report.MetadataReport?client=&dubbo.config-center.root-path=/ is correct
复制代码


为什么会这样?



从源码上能看出,当 address 中包含://时就认为 address 配置的是一个URL,此时如果要配置 backup 地址必须在 URL 参数中指定 backup 参数才行;


dubbo.registry.address=zookeeper://127.0.0.1:2181?backup=127.0.0.1:2182
复制代码


但当 address 中不包含://时,dubbo 认为你配置的第一个地址是主,逗号后的地址都是 backup。


多注册中心有什么猫腻?


多注册中心可以这样配置


dubbo.registries.zk1.address=zookeeper://127.0.0.1:2181dubbo.registries.zk2.address=disf://127.0.0.1:2182
复制代码


这样配置 dubbo 的默认行为是双注册都消费


双注册不用说,就是会将服务注册到这两个注册中心上去,应用启动耗时增加


都消费指的是针对每个 provider,consumer 都会和它建立连接,消费时按注册中心顺序挑选一个可用的 invoker 进行调用,也就是说将两个注册中心中提供的服务 merge 起来进行调用。假设这两个注册中心提供了相同的服务,consumer 会和每个 provider 建立2条长链接


设置默认消费注册中心怎么这么难?


接上条,如果消费了两个注册中心,两个注册中心都提供了相同的服务,我想设置个默认消费的注册中心怎么设置呢?一般是这么设置


dubbo.registries.zk1.default=true
复制代码


但是经过实践你会发现,有可能不生效,追一下源码



可以看到当注册中心带了default是会被优先选中的,但为什么有时候这么配置又不行呢?


这是因为 dubbo 的版本问题,上图是2.7.3版本的代码,到2.7.5以后RegistryAwareClusterInvoker被换成了ZoneAwareClusterInvoker,看下这个类



default参数被换成了preferred,所以我们的配置需要改成


dubbo.registries.zookeeper.preferred=true
复制代码


如果不放心,可以两个配置都加上,以防万一。



欢迎关注我的公众号“捉虫大师


发布于: 2021 年 03 月 16 日阅读数: 17
用户头像

小楼

关注

还未添加个人签名 2018.09.19 加入

欢迎关注我的公众号“捉虫大师”

评论

发布
暂无评论
几个你不知道的dubbo注册中心细节