@LoadBalanced注解使用的理解

更新时间:2023-06-15 21:11:45 阅读: 评论:0

@LoadBalanced注解使⽤的理解
在使⽤springcloud ribbon客户端负载均衡的时候,可以给RestTemplate bean 加⼀个@LoadBalanced注解,就能让这个RestTemplate在请求时拥有客户端负载均衡的能⼒:
@Bean
@LoadBalanced //开启负载均衡的功能
RestTemplate restTemplate() {
return new RestTemplate();
}
@LoadBalanced的注解源码:
/**
* Annotation to mark a RestTemplate bean to be configured to u a LoadBalancerClient
* @author Spencer Gibb
*/
@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Qualifier
public @interface LoadBalanced {
}
关于@Qulifier注解作⽤⾃⾏百度。
LoadBalancerAutoConfiguration是为实现客户端负载均衡器的⾃动装配类:
/**
* Auto configuration for Ribbon (client side load balancing).
*
* @author Spencer Gibb
* @author Dave Syer
* @author Will Tran
*/
@Configuration
@ConditionalOnClass(RestTemplate.class)
@ConditionalOnBean(LoadBalancerClient.class)
@EnableConfigurationProperties(LoadBalancerRetryProperties.class)
public class LoadBalancerAutoConfiguration {
@LoadBalanced
@Autowired(required = fal)
private List<RestTemplate> restTemplates = ptyList();
@Bean
public SmartInitializingSingleton loadBalancedRestTemplateInitializer(
final List<RestTemplateCustomizer> customizers) {
return new SmartInitializingSingleton() {
@Override
public void afterSingletonsInstantiated() {
for (RestTemplate restTemplate : stTemplates) {
for (RestTemplateCustomizer customizer : customizers) {
customizer.customize(restTemplate);
}
}
}
};
}
@Autowired(required = fal)
cherish是什么意思private List<LoadBalancerRequestTransformer> transformers = ptyList();
@Bean
@Bean
@ConditionalOnMissingBean
public LoadBalancerRequestFactory loadBalancerRequestFactory(
LoadBalancerClient loadBalancerClient) {
return new LoadBalancerRequestFactory(loadBalancerClient, transformers);
}
@Configuration
@ConditionalOnMissingClass("support.RetryTemplate")
static class LoadBalancerInterceptorConfig {
@Bean
public LoadBalancerInterceptor ribbonInterceptor(
LoadBalancerClient loadBalancerClient,
LoadBalancerRequestFactory requestFactory) {
return new LoadBalancerInterceptor(loadBalancerClient, requestFactory);
}
@Bean
@ConditionalOnMissingBean
public RestTemplateCustomizer restTemplateCustomizer(
final LoadBalancerInterceptor loadBalancerInterceptor) {
return new RestTemplateCustomizer() {
@Override
public void customize(RestTemplate restTemplate) {
List<ClientHttpRequestInterceptor> list = new ArrayList<>(
list.add(loadBalancerInterceptor);
restTemplate.tInterceptors(list);
}
};
}
}
@Configuration
@ConditionalOnClass(RetryTemplate.class)
public static class RetryAutoConfiguration {
@Bean
public RetryTemplate retryTemplate() {
RetryTemplate template =  new RetryTemplate();
creating a green campustemplate.tThrowLastExceptionOnExhausted(true);
return template;
}
@Bean
@ConditionalOnMissingBean
public LoadBalancedRetryPolicyFactory loadBalancedRetryPolicyFactory() {
return new LoadBalancedRetryPolicyFactory.NeverRetryFactory();
}
}
@Configuration
@ConditionalOnClass(RetryTemplate.class)
public static class RetryInterceptorAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public RetryLoadBalancerInterceptor ribbonInterceptor(
LoadBalancerClient loadBalancerClient, LoadBalancerRetryProperties properties,            LoadBalancedRetryPolicyFactory lbRetryPolicyFactory,nice to meet you什么意思
LoadBalancerRequestFactory requestFactory) {
return new RetryLoadBalancerInterceptor(loadBalancerClient, properties,
lbRetryPolicyFactory, requestFactory);
}
@Bean
@ConditionalOnMissingBean
public RestTemplateCustomizer restTemplateCustomizer(
public RestTemplateCustomizer restTemplateCustomizer(
final RetryLoadBalancerInterceptor loadBalancerInterceptor) {
return new RestTemplateCustomizer() {
@Override
public void customize(RestTemplate restTemplate) {
List<ClientHttpRequestInterceptor> list = new ArrayList<>(
尹泰英
list.add(loadBalancerInterceptor);
restTemplate.tInterceptors(list);小马过河机经
高三英语课文}
};
}
}
}
从LoadBalancerAutoConfiguration类注解可以知道,负载均衡⾃动配置需
要ConditionalOnClass(RestTemplate.class)和@ConditionalOnBean(LoadBalancerClient.class)。
这⾥直接解释下为什么@LoadBalanced注解能让RestTemplate在请求时拥有客户端负载均衡的能⼒。LoadBalancerAutoConfiguration类会产⽣⼀个SmartInitializingSingleton的Bean:
@Bean
public SmartInitializingSingleton loadBalancedRestTemplateInitializer(
final List<RestTemplateCustomizer> customizers) {
return new SmartInitializingSingleton() {
@Override
public void afterSingletonsInstantiated() {
for (RestTemplate restTemplate : stTemplates) {
for (RestTemplateCustomizer customizer : customizers) {
customizer.customize(restTemplate);
}
}
}
};
}
stTemplates即所有被@LoadBalanced注解的RestTemplate,这⾥的customizers如下:
@Bean
@ConditionalOnMissingBean
public RestTemplateCustomizer restTemplateCustomizer(
final LoadBalancerInterceptor loadBalancerInterceptor) {
return new RestTemplateCustomizer() {
@Override
stonehengepublic void customize(RestTemplate restTemplate) {
List<ClientHttpRequestInterceptor> list = new ArrayList<>(
list.add(loadBalancerInterceptor);
restTemplate.tInterceptors(list);
}
};
}
}
会给restTemplate设置⼀个loadBalancerInterceptor,这个LoadBalancerInterceptor如下:
@Bean
public LoadBalancerInterceptor ribbonInterceptor(
LoadBalancerClient loadBalancerClient,
LoadBalancerRequestFactory requestFactory) {
return new LoadBalancerInterceptor(loadBalancerClient, requestFactory);
}spooky
⼊参就有⼀个loadBalancerClient。当RestTemplate发起⼀个请求,请求就会被LoadBalancerInterceptor拦截:
@Override
public ClientHttpRespon intercept(final HttpRequest request, final byte[] body,
final ClientHttpRequestExecution execution) throws IOException {
phonesuite
youarenotalone歌词final URI originalUri = URI();
String rviceName = Host();
Asrt.state(rviceName != null, "Request URI does not contain a valid hostname: " + originalUri);
return ute(rviceName, ateRequest(request, body, execution)); }
实际的请求是由loadBalancer发起的。

本文发布于:2023-06-15 21:11:45,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/146293.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:负载   请求   客户端   注解
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图