同時使用@LoadBalanced?@RefreshScope注解負(fù)載均衡失效分析
背景
最近引入了 Nacos Config 配置管理能力,說起來用法很簡單,還是踩了三個坑。
- Nacos Config 的 nacos 的帳號密碼加密配置后,怎么解密而且在
NacosConfigBootstrapConfiguration
真正注入 Nacos Config 注入之前,而且不能觸發(fā)NacosDiscoveryProperties
的isNacosDiscoveryInfoChanged
變動事件。因為NacosDiscoveryProperties
接受NacosContextRefresher
事件時,還是從 yml 配置中獲取屬性,不會從Environment
對象中加載。 @RefreshScope
要想生效,該注意什么?非 shared-config 的配置變動時,要想實時生效,必須在當(dāng)前應(yīng)用的 bootstrap.yml 中配置spring.application.name
屬性,注冊該應(yīng)用在配置中心需要監(jiān)聽的配置。@RefreshScope + @LoadBalanced
同時使用導(dǎo)致 Ribbon 負(fù)載均衡失效問題。
問題一比較復(fù)雜,此處不做討論,本文記錄問題三的解決方法及個人思考。
問題
有個模塊使用了 @LoadBalanced
負(fù)載均衡,通過配置控制超時時間。
引入 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); //連接超時設(shè)置 requestFactory.setReadTimeout(readTimeout); //讀寫超時設(shè)置 RestTemplate restTemplate = new RestTemplate(requestFactory); logger.info("初始化負(fù)載均衡的 RestTemplate 對象 {} {}", connectTimeout, readTimeout); return restTemplate; }
修改配置中心的配置后,可以監(jiān)控到 RestTemplate
會在配置變化后重新初始化了,也打印了最新的配置。
但真正使用這個類,調(diào)用某個服務(wù)時,出現(xiàn)了服務(wù)無法解析的異常:
分析
首先,檢查調(diào)用的目標(biāo)服務(wù)是否注冊成功,目標(biāo)服務(wù)是正常啟動的。
其次,對比其他同樣引用了 @LoadBalanced
的 RestTemplate
的模塊,它調(diào)用是正常的。
最后,對比異常調(diào)用和正常調(diào)用的注入代碼的區(qū)別,多了一個 @RefreshScope
,調(diào)整代碼驗證結(jié)果正常。引入 @RefreshScope
時,在配置變化后才會發(fā)生這個異常,首次運行時正常的。
延伸搜索發(fā)現(xiàn),負(fù)載均衡 RestTemplate
也有類似的問題 @scope("prototype")+@loadbalanced注解時負(fù)載均衡失效問題。
啟示錄
@LoadBalanced
和 @RefreshScope
同時使用,首次初始化時,RestTemplate
對象具有負(fù)載均衡的能力;當(dāng) Nacos 配置中的配置變動時,這個對象會重新創(chuàng)建,而且此時并沒有使用 @LoadBalanced
的能力,導(dǎo)致負(fù)載均衡失效。
就是說,這兩個注解同時使用時,在不同的時機,只會有一個注解生效:
- 初始創(chuàng)建時,
@LoadBalanced
生效,系統(tǒng)中的實例是負(fù)載均衡的RestTemplate
; - 當(dāng) Nacos 配置變化,
NacosContextRefresher
觸發(fā)通知@RefreshScope
注解的@Bean
對象時,重新創(chuàng)建的實例就是普通的RestTemplate
了。
引入任何一個第三方工具,面對的都是黑盒,各種資料用法看似簡單,一用就坑不斷?。〗ㄗh Nacos Config 官方配置給出一個使用建議 @RefreshScope
不要用在 @LoadBalanced
注解上。
最后記錄一個偶然的發(fā)現(xiàn):
選中幾個圖片文件后,右側(cè)概覽圖是一個堆疊的圖,才注意到!
以上就是同時使用@LoadBalanced @RefreshScope負(fù)載均衡失效分析的詳細(xì)內(nèi)容,更多關(guān)于@LoadBalanced @RefreshScope失效的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Springboot?異步任務(wù)和定時任務(wù)的異步處理
本文介紹了Springboot異步任務(wù)和定時任務(wù)的異步處理,Springboot?中,異步任務(wù)和定時任務(wù)是經(jīng)常遇到的處理問題方式,為了能夠用好這兩項配置,不干擾正常的業(yè)務(wù),需要對其進(jìn)行異步化配置。怎么設(shè)置合理的異步處理線程就是其核心和關(guān)鍵,下文詳情需要的朋友可以參考下2022-05-05java 全角半角字符轉(zhuǎn)換如何實現(xiàn)
在java中可能會用到過全角半角字符轉(zhuǎn)換問題,于是網(wǎng)上搜索整理了一下,曬出來和大家分享,希望可以幫助你們2012-12-12SpringCloud中的熔斷監(jiān)控HystrixDashboard和Turbine示例詳解
HystrixDashboard是用于實時監(jiān)控Hystrix性能的工具,展示請求響應(yīng)時間和成功率等數(shù)據(jù),本文介紹了如何配置和使用HystrixDashboard和Turbine進(jìn)行熔斷監(jiān)控,包括依賴添加、啟動類配置和測試流程,感興趣的朋友一起看看吧2024-09-09SpringMVC @RequestMapping注解作用詳解
通過@RequestMapping注解可以定義不同的處理器映射規(guī)則,下面這篇文章主要給大家介紹了關(guān)于SpringMVC中@RequestMapping注解用法的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01