建設購物網(wǎng)站廣告收益平臺
背景
最近引入了 Nacos Config 配置管理能力,說起來用法很簡單,還是踩了三個坑。
- Nacos Config 的 nacos 的帳號密碼加密配置后,怎么解密而且在
NacosConfigBootstrapConfiguration
真正注入 Nacos Config 注入之前,而且不能觸發(fā)NacosDiscoveryProperties
的isNacosDiscoveryInfoChanged
變動事件。因為NacosDiscoveryProperties
接受NacosContextRefresher
事件時,還是從 yml 配置中獲取屬性,不會從Environment
對象中加載。 @RefreshScope
要想生效,該注意什么?非 shared-config 的配置變動時,要想實時生效,必須在當前應用的 bootstrap.yml 中配置spring.application.name
屬性,注冊該應用在配置中心需要監(jiān)聽的配置。@RefreshScope + @LoadBalanced
同時使用導致 Ribbon 負載均衡失效問題。
問題一比較復雜,此處不做討論,本文記錄問題三的解決方法及個人思考。
問題
有個模塊使用了 @LoadBalanced
負載均衡,通過配置控制超時時間。
引入 Nacos Config 配置后,按照常規(guī)用法,在對象上添加了 @RefreshScope
屬性,希望配置變動時,能實時生效。
注入代碼如下:
@Value("${rest.template.connect-timeout:10000}")
private Integer connectTimeout;@Value("${rest.template.read-timeout:10000}")
private Integer readTimeout;@Bean
@RefreshScope
@LoadBalanced
public RestTemplate restTemplate(RestTemplateBuilder builder){
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();requestFactory.setConnectTimeout(connectTimeout); //連接超時設置requestFactory.setReadTimeout(readTimeout); //讀寫超時設置RestTemplate restTemplate = new RestTemplate(requestFactory);logger.info("初始化負載均衡的 RestTemplate 對象 {} {}", connectTimeout, readTimeout);return restTemplate;}
修改配置中心的配置后,可以監(jiān)控到 RestTemplate
會在配置變化后重新初始化了,也打印了最新的配置。
但真正使用這個類,調用某個服務時,出現(xiàn)了服務無法解析的異常:
分析
首先,檢查調用的目標服務是否注冊成功,目標服務是正常啟動的。
其次,對比其他同樣引用了 @LoadBalanced
的 RestTemplate
的模塊,它調用是正常的。
最后,對比異常調用和正常調用的注入代碼的區(qū)別,多了一個 @RefreshScope
,調整代碼驗證結果正常。引入 @RefreshScope
時,在配置變化后才會發(fā)生這個異常,首次運行時正常的。
延伸搜索發(fā)現(xiàn),負載均衡 RestTemplate
也有類似的問題 @scope(“prototype”)+@loadbalanced注解時負載均衡失效問題。
啟示錄
@LoadBalanced
和 @RefreshScope
同時使用,首次初始化時,RestTemplate
對象具有負載均衡的能力;當 Nacos 配置中的配置變動時,這個對象會重新創(chuàng)建,而且此時并沒有使用 @LoadBalanced
的能力,導致負載均衡失效。
就是說,這兩個注解同時使用時,在不同的時機,只會有一個注解生效:
- 初始創(chuàng)建時,
@LoadBalanced
生效,系統(tǒng)中的實例是負載均衡的RestTemplate
; - 當 Nacos 配置變化,
NacosContextRefresher
觸發(fā)通知@RefreshScope
注解的@Bean
對象時,重新創(chuàng)建的實例就是普通的RestTemplate
了。
引入任何一個第三方工具,面對的都是黑盒,各種資料用法看似簡單,一用就坑不斷啊!建議 Nacos Config 官方配置給出一個使用建議 @RefreshScope
不要用在 @LoadBalanced
注解上。
最后記錄一個偶然的發(fā)現(xiàn):
選中幾個圖片文件后,右側概覽圖是一個堆疊的圖,才注意到!