你會正確配置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
為什么會這樣?
從源碼上能看出,當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
但是經過實踐你會發現,有可能不生效,追一下源碼
可以看到當注冊中心帶了default
是會被優先選中的,但為什么有時候這么配置又不行呢?
這是因為dubbo的版本問題,上圖是2.7.3
版本的代碼,到2.7.5
以后RegistryAwareClusterInvoker
被換成了ZoneAwareClusterInvoker
,看下這個類
default
參數被換成了preferred
,所以我們的配置需要改成
dubbo.registries.zookeeper.preferred=true
如果不放心,可以兩個配置都加上,以防萬一。
關於作者:專注后端的中間件開發,公眾號"捉蟲大師"作者,關注我,給你最純粹的技術干貨