@scope("prototype") @loadbalanced注解負(fù)載均衡失效問(wèn)題
正文
用RestTemplate想在有ribbon負(fù)載均衡的功能下又可以配置多例來(lái)注入一些不固定的參數(shù),bean 單例的時(shí)候沒(méi)問(wèn)題多例的時(shí)候卻失效了,百度很久完全沒(méi)有這方面的答案,google了下starkoverflow有一篇回答解釋了
工具類
@scope(“prototype”)就是單純的new了一下,spring不管理bean,那注解就失效了,替代實(shí)現(xiàn)的方法就是傳一個(gè)LoadBalancerInterceptor的實(shí)例,根據(jù)這個(gè)思路我寫的工具類代碼如下:
@Configuration public class RestTemplateManager { @Resource private LoadBalancerInterceptor loadBalancerInterceptor; /** * Time:millisecond * @param readtimout * @param connectionRequestTimeout * @param connectTimeout * @return HttpComponentsClientHttpRequestFactory */ public HttpComponentsClientHttpRequestFactory getHttpRequestFactory(int readtimout,int connectionRequestTimeout,int connectTimeout) { HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(); factory.setReadTimeout(readtimout); factory.setConnectionRequestTimeout(connectionRequestTimeout); factory.setConnectTimeout(connectTimeout); factory.setBufferRequestBody(false); return factory; } @Bean @Scope("prototype") public RestTemplate getConfigRestTemplate(HttpComponentsClientHttpRequestFactory factory) { RestTemplate restTemplate = new RestTemplate(); //解決編碼問(wèn)題 restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8)); restTemplate.setRequestFactory(factory); //add loadbalancerInterceptor,list is empty default restTemplate.getInterceptors().add(loadBalancerInterceptor); return restTemplate; } @Bean @LoadBalanced public RestTemplate getRestTemplate() { RestTemplate restTemplate = new RestTemplate(); //解決編碼問(wèn)題 restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8)); return restTemplate; } }
測(cè)試過(guò)默認(rèn)情況 restTemplate.getInterceptors()是空的,加入loadBalancerInterceptor就可以實(shí)現(xiàn)@loadbalanced的功能了,LoadBalancerAutoConfiguration依賴于loadBalancerInterceptor,ribbonInterceptor又是在LoadBalancerAutoConfiguration中聲明的,這就解釋了為什么加入loadBalancerInterceptor可以實(shí)現(xiàn)負(fù)載均衡的效果,關(guān)于怎么取這個(gè)loadBalancerInterceptor我研究了下用@Resource注解注入,在沒(méi)有聲明spring管理的類中@Autowired的是取不了實(shí)例的,而@Resource可以直接匹配原始類型注入,而且貌似是單例的,正好符合需要就這樣使用了,能力有限,有些東西也是一知半解,算是給需要的人提供一些思路吧。
以上就是@scope("prototype") @loadbalanced注解負(fù)載均衡失效問(wèn)題的詳細(xì)內(nèi)容,更多關(guān)于@scope @loadbalanced注解失效的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java通過(guò)工廠、Map容器創(chuàng)建對(duì)象的方法
這篇文章主要介紹了Java通過(guò)工廠、Map容器創(chuàng)建對(duì)象的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03Java實(shí)現(xiàn)一鍵獲取Mysql所有表字段設(shè)計(jì)和建表語(yǔ)句的工具類
這篇文章主要為大家詳細(xì)介紹了如何利用Java編寫一個(gè)工具類,可以實(shí)現(xiàn)一鍵獲取Mysql所有表字段設(shè)計(jì)和建表語(yǔ)句,感興趣的小伙伴可以了解一下2023-05-05阿里nacos+springboot+dubbo2.7.3統(tǒng)一處理異常的兩種方式
本文主要介紹了阿里nacos+springboot+dubbo2.7.3統(tǒng)一處理異常的兩種方式,文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Spring boot集成spring session實(shí)現(xiàn)session共享的方法
這篇文章主要介紹了Spring boot集成spring session實(shí)現(xiàn)session共享的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-06-06詳解Java在redis中進(jìn)行對(duì)象的緩存
這篇文章主要介紹了Java在redis中進(jìn)行對(duì)象的緩存,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03Kafka是什么及如何使用SpringBoot對(duì)接Kafka(最新推薦)
這篇文章主要介紹了Kafka是什么,以及如何使用SpringBoot對(duì)接Kafka,今天我們通過(guò)一個(gè)Demo講解了在SpringBoot中如何對(duì)接Kafka,也介紹了下關(guān)鍵類?KafkaTemplate,需要的朋友可以參考下2023-11-11