Netflix Ribbon - 负载均衡

133 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。


负载均衡

负载均衡是对系统的高可用网络压力的缓解处理能力扩容的重要手段之一

负载均衡通常指的是服务端负载均衡,其中分为硬件负载均衡和软件负载均衡。

服务端负载均衡

服务端负载均衡都会维护一个可用的服务端清单,通过心跳检测来剔除故障的服务端节点,以保证清单中都是可以正常访问的服务端端节点。

客户端负载均衡

客户端负载均衡会讲自己要访问的服务端清单维护在客户端节点。服务端清单来自于服务注册中心。客户端负载均衡与服务注册中心配合检测服务心跳来剔除故障的服务端节点。

RestTemplate

Get请求

  1. getForEntity函数
  2. getForObject函数

POST请求

  1. postForEntity函数
  2. postForObject函数
  3. postForLocation函数

PUT请求

  1. put函数

DELETE请求

  1. delete函数

@LoadBalanced注解

/**
 * Annotation to mark a RestTemplate 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 {

}

@LoadBalanced注解用来标记RestTemplate使用LoadBalancerClient,以使RestTemplate可以支持负载均衡能力。

LoadBalancerClient

public interface LoadBalancerClient extends ServiceInstanceChooser

    ServiceInstance choose(String serviceId);

    <T> T execute(String serviceId, ServiceInstance serviceInstance, LoadBalancerRequest<T> request) throws IOException;
    
    URI reconstructURI(ServiceInstance instance, URI original);
    
    

choose函数:根据传入的服务名serviceId从负载均衡器中挑选一个对应服务的实例。
execute函数:使用从负载均衡器中挑选出的服务实例来执行请求内容。
reconstructURI函数:为系统构建一个合适的host:port形式的URI。

LoadBalancerAutoConfiguration

org.springframework.cloud:spring-cloud-loadbalancer:2.2.1.RELEASE

spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration

org.springframework.cloud.loadbalancer.config.LoadBalancerAutoConfiguration

当一个被@LoadBalanced注解修饰的RestTemplate对象向外发器HTTP请求时,会被LoadBalancerInterceptor类的intercept函数所拦截。解析URI,调用execute函数根据服务名来选择实例并发起实际的请求。

SmartInitializingSingleton

通过SmartInitializingSingleton接口的afterSingletonsInstantiated方法的生命周期。实现在所有bean都注入之后,将所有的自定义RestTemplateRestTemplateCustomizer添加到所有的RestTemplate实例中。 其中LoadBalancerInterceptor就是通过RestTemplateCustomizer添加到RestTemplate中的。