微服务服务调用-RestTemplate通过@LoadBalaced具备负载均衡与服务发现的原理

RestTemplate通过@LoadBalaced注解集成Ribbon

前言

接触过微服务的可能知道在RestTemplate上添加@LoadBalaced即可具备服务发现与负载均衡的能力,但是其中的原理是什么?我曾带着这样的疑问开始了一波学习。

如果对于Ribbon使用不了解的可以参考这篇文章:Ribbon的简单使用

疑问:

  1. 为什么RestTemplate上加一个@LoadBalaced注解即具备服务发现与负载均衡的能力?
  2. 为什么通过@Qualifier就能注入具有负载均衡能力的RestTemplate?

首先先说第二个问题:

当存在两个RestTemplate时,想要获取具有负载均衡能力的RestTemplate需要加@Qualifier,如下:

@Bean // 不具备负载均衡能力
public RestTemplate restTemplate() {
    return new RestTemplate();
}

@LoadBalanced  // 具备负载均衡能力
@Bean
public RestTemplate loadBalanceRestTemplate() {
    return new RestTemplate();
}

@Autowired
private RestTemplate restTemplate; // 不具备负载均衡能力

@Qualifier
@Autowired
private RestTemplate loadBalanceRestTemplate; // 具备负载均衡能力

@Qualifier是Spring的注解,通过它可以注入同类别的Bean。而@LoadBalaced中的实现是这样的:

/**
 * Annotation to mark a RestTemplate or WebClient bean to be configured to use a
 * LoadBalancerClient.
 * @author Spencer Gibb
 */
@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Qualifier
public @interface LoadBalanced {

}

同样使用了@Qualifier标注,所以加了@LoadBalanced注解的RestTemplate与@Qualifier的可以当作是同一种RestTemplate Bean。

自定义注解时也可以使用此方式来扩展功能:比如在自定义注解上加@Component,那么被自定义注解标记的也会被注册成Bean。

再来说第一个问题:

为什么RestTemplate上加一个@LoadBalaced注解即具备服务发现与负载均衡的能力?

  • LoadBalancerAutoConfiguration
    • 该类中,当存在@LoadBalancedRestTemplate时,会将bean通过@Autowired注入到一个list中,
      并且是有@LoadBalanced标记的RestTemplate。@LoadBalanced上有@Qualifier标记,按类型注入。
      在这里插入图片描述
    • loadBalancedRestTemplateInotializerDeprecated方法中,对所有注入的RestTemplate进行处理
      		customizer.customize(restTemplate);
      
    • 其中一个RestTemplateCustomizerBean为RestTemplate添加拦截器LoadBalancerInterceptorRetryLoadBalancerInterceptor,在请求时会生成一个InterceptingClientHttpRequest,
      会进入LoadBalancerInterceptor/RetryLoadBalancerInterceptor的intercept方法,调用RibbonLoadBalancerClient的execute方法,执行请求。
    • RibbonLoadBalancerClient借助ILoadBalancer可达到服务发现的功能
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

future_1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值