@scope("prototype") @loadbalanced注解負載均衡失效問題
正文
用RestTemplate想在有ribbon負載均衡的功能下又可以配置多例來注入一些不固定的參數(shù),bean 單例的時候沒問題多例的時候卻失效了,百度很久完全沒有這方面的答案,google了下starkoverflow有一篇回答解釋了
工具類
@scope(“prototype”)就是單純的new了一下,spring不管理bean,那注解就失效了,替代實現(xiàn)的方法就是傳一個LoadBalancerInterceptor的實例,根據(jù)這個思路我寫的工具類代碼如下:
@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;
}
}測試過默認情況 restTemplate.getInterceptors()是空的,加入loadBalancerInterceptor就可以實現(xiàn)@loadbalanced的功能了,LoadBalancerAutoConfiguration依賴于loadBalancerInterceptor,ribbonInterceptor又是在LoadBalancerAutoConfiguration中聲明的,這就解釋了為什么加入loadBalancerInterceptor可以實現(xiàn)負載均衡的效果,關(guān)于怎么取這個loadBalancerInterceptor我研究了下用@Resource注解注入,在沒有聲明spring管理的類中@Autowired的是取不了實例的,而@Resource可以直接匹配原始類型注入,而且貌似是單例的,正好符合需要就這樣使用了,能力有限,有些東西也是一知半解,算是給需要的人提供一些思路吧。
以上就是@scope("prototype") @loadbalanced注解負載均衡失效問題的詳細內(nèi)容,更多關(guān)于@scope @loadbalanced注解失效的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot配置動態(tài)數(shù)據(jù)源的實戰(zhàn)詳解
Spring對數(shù)據(jù)源的管理類似于策略模式,不懂策略模式也沒關(guān)系,其實就是有一個全局的鍵值對,類型是Map<String, DataSource>,當JDBC操作數(shù)據(jù)庫之時,會根據(jù)不同的key值選擇不同的數(shù)據(jù)源,本文介紹了SpringBoot配置動態(tài)數(shù)據(jù)源的方法,需要的朋友可以參考下2024-08-08
詳解springMVC兩種方式實現(xiàn)多文件上傳及效率比較
本篇文章介紹了springMVC兩種方式實現(xiàn)多文件上傳及效率比較。springMVC實現(xiàn)多文件上傳有兩種,一種是字節(jié)流的方式進行文件上傳,另外一種是使用springMVC包裝好的解析器進行上傳,有興趣的可以了解一下。2016-12-12
深入了解SpringBoot中的統(tǒng)一返回和統(tǒng)一異常處理
這篇文章主要為大家詳細介紹了SpringBoot項目中常用的統(tǒng)一返回結(jié)果和統(tǒng)一異常處理,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2024-01-01
Spring RedisTemplate優(yōu)化連接Redis數(shù)據(jù)庫詳解
這篇文章主要介紹了Spring RedisTemplate優(yōu)化連接Redis數(shù)據(jù)庫,RedisTemplate是Spring Data Redis中的核心組件之一,它提供了對Redis數(shù)據(jù)庫的訪問功能,對于高性能的Redis操作,合理的優(yōu)化RedisTemplate的使用非常重要2025-02-02
淺談Java中常用數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)類 Collection和Map
下面小編就為大家?guī)硪黄獪\談Java中常用數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)類 Collection和Map。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-09-09

