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

你会正确配置backup地址吗?

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

dubbo.registry.protocol=zookeeper
dubbo.registry.address=127.0.0.1:2181

也会简单地写成

dubbo.registry.address=zookeeper://127.0.0.1:2181

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

dubbo.registry.protocol=zookeeper
dubbo.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

为什么会这样?

image

从源码上能看出,当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:2181
dubbo.registries.zk2.address=disf://127.0.0.1:2182

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

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

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

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

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

dubbo.registries.zk1.default=true

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

image

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

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

image

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

dubbo.registries.zookeeper.preferred=true

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


关于作者:专注后端的中间件开发,公众号"捉虫大师"作者,关注我,给你最纯粹的技术干货

posted @   捉虫大师  阅读(792)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示