背景
公司原來的配置中心是一個閉源的系統,該系統有幾個痛點問題:無權限控制、敏感配置不能加密、應用和配置的依賴關系混亂。
在這個背景下,運維同學基于k8s的configMap寫了一個配置中心,并推動應用配置從閉源的配置中心遷移到自有的configMap。
獲取dubbo.registry.address配置項
因為我負責這次遷移,所以遷移過程中開發同學碰到的問題都會來問我,其中有一個比較有意思的問題是dubbo 獲取不到dubbo.registry.address配置項
。比如明明在application.properties配置文件中配置了該配置項 dubbo.registry.address=zk-0:2181
,但應用啟動時就是獲取不到;
源碼
此類問題排查思路也比較直接:直接看源碼!
通過debug,很快定位到dubbo.registry.address
是在AbstractInterfaceConfig.java 第188行獲取配置的。
突然發現有點不太對勁,怎么獲取配置的這個方式是靜態方案?!難道沒有和spring的PropertySource打通?
點進去該方法果然發現,這里的配置并不是從spring的PropertySource中獲取的,而是嘗試從系統環境變量中獲取,獲取不到再從配置的文件中獲取。參考com.alibaba.dubbo.common.utils.ConfigUtils#getProperty(java.lang.String, java.lang.String)
這時候真相大白了,人家壓根就沒有去application.properties中獲取,那肯定就拿不到了。
后面想看看dubbo對這個問題進行處理,于是乎打開了2.7.6版本的源碼瞅了瞅。在這個版本中,dubbo變成了從spring中獲取配置的方式。感興趣的小伙伴可以看看相關的源碼,這里就不展開了。
解法
- 手動配置一個
RegistryConfig
Spring Bean; - 將dubbo相關配置設置到系統環境變量中;
- 升級到2.7.6。