springcloud~ LoadBalancer

发布时间 2023-05-05 09:25:06作者: 张占岭

前言

由于 Netflix Ribbon 进入停更维护阶段,因此 SpringCloud 2020.0.1 版本之后 删除了eureka中的ribbon,替代ribbon的是spring cloud自带的LoadBalancer,默认使用的是轮询的方式,新版本的 Nacos discovery 都已经移除了 Ribbon ,此时我们需要引入loadbalancer代替,才能调用服务提供者提供的服务。

Spring Cloud全家桶在Spring Cloud Commons项目中,添加了Spring cloud Loadbalancer作为新的负载均衡器,并且做了向前兼容,就算你的项目中继续用 Spring Cloud Netflix 套装(包括Ribbon,Eureka,Zuul,Hystrix等等)让你的项目中有这些依赖,你也可以通过简单的配置,把ribbon替换成Spring Cloud LoadBalancer。

均衡负载

  • 大概就是两种:网关层均衡负载和客户端层均衡负载
  • 网关层想我之前公司有用的F5,就是在网管层做均衡负载,就是你只管请求我,我来负责维护服务地址列表,你也不需要搞什么服务发现这些。(坏处是涉及到网关层维护,网络消耗和复杂度维护角度不简单)
  • 客户端层就好比我们这个LoadBalancer,就是我作为一个客户端我自己去不断去发现更新维护自己的一套服务列表,我自己去定义服务的均衡负载策略,不管是随机还是计数甚至可以搞小流量的金丝雀

客户端负载均衡组件

架构设计

  • 默认使用BlockingLoadBalancerClient来实现,也可以自己去定义,不建议再使用ribbon了。

两种负载算法

目前 SpringCloud LoadBalance 仅支持两种负载均衡策略:【轮询策略】和【随机策略】,默认是轮询策略。

随机策略的使用

  • 首先需要定义随机的算法对象,并通过 @Bean 将其加载到 Spring 容器中,具体如下:
public class RandomLoadBalancerConfig {

    @Bean
    ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(
            Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {

        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new RandomLoadBalancer(loadBalancerClientFactory
                .getLazyProvider(name, ServiceInstanceListSupplier.class), name);
    }
}
  • 然后在@LoadBalancerClient 或 @LoadBalancerClients 注解,针对具体服务配置具体的客户端负载均衡算法策略。
@LoadBalancerClient(name = "PROVIDER-APP", configuration = RandomLoadBalancerConfig.class)
@Configuration
public class RestTemplateConfig {

    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}