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

