Ribbon自定义负载均衡算法的实现

SpringCloud在2020之后的版本里,移除了netflix相关的依赖,需要实现负载均衡的话,则需要通过loadbalancer来实现。响应的负载均衡算法是通过ReactiveLoadBalancer接口来实现的。
Ribbon自定义负载均衡算法的实现_第1张图片
从上图可以看出相关接口的继承关系,也可以知道,Ribbon中实现了两种负载均衡方式,一种是轮询,一种是随机。想要实现自定义的负载均衡算法,步骤如下:
1、导入依赖

		<!--loadbalancer依赖引入-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency> 
         <!--eureka依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>3.0.5</version>
        </dependency>

2、在项目中新建一个放自定义负载均衡算法的包,注意不能跟springBoot的主启动类在同一级下!
(这里是因为,需要通过@LoadBalancerClient来实现实现Ribbon的负载均衡,但是实现类必须是@Configuration且不能与主启动类存在与同一级下)
结构如下图
Ribbon自定义负载均衡算法的实现_第2张图片
3、修改负载均衡策略
Ribbon自定义负载均衡算法的实现_第3张图片
4、写自定义的负载均衡策略实现类,例如我下面实现的负载均衡策略是先一直访问一个服务,等访问该服务的次数达到了3次,则换另一个服务进行访问

public class selfLoadBalancer implements ReactorServiceInstanceLoadBalancer {
    //服务列表
    private ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSuppliers;

    public selfLoadBalancer(ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSuppliers){
        this.serviceInstanceListSuppliers = serviceInstanceListSuppliers;
    }
    @Override
    public Mono<Response<ServiceInstance>> choose(Request request) {
        ServiceInstanceListSupplier supplier = serviceInstanceListSuppliers.getIfAvailable();
        return supplier.get().next().map(this::getInstanceResponse);
    }

    private int total = 0; //统计服务访问的次数
    private int currentIndex = 0; //记录当前所使用的服务来自哪里
    private Response<ServiceInstance> getInstanceResponse(List<ServiceInstance> instance){
        if(instance.isEmpty()){
            return new EmptyResponse();
        }
        ServiceInstance inst;
        if (total < 3){
            inst = instance.get(currentIndex);
            total ++;
        }else{
            total = 0;
            currentIndex ++;
            if(currentIndex > instance.size() - 1){
                currentIndex = 0;
            }
            total ++;
            inst = instance.get(currentIndex);
        }
        return new DefaultResponse(inst);
    }
}

5、在消费者的主启动类上,加上@LoadBalancerClient注解,并配置其中的属性值

@SpringBootApplication
@EnableEurekaClient  //ribbon和eureka结合后,用户在访问的时候就不用再纠结ip地址以及端口号了
//在微服务启动的时候,就直接去加载我们自定义的ribbon类
//name属性填的是在eureka中,服务的名字(application值)
//configuretion属性填的是需要加载的自定义负载均衡策略的类名
@LoadBalancerClient(name = "SPRINGCLOUDPROVIDERDEPT",configuration = MyLoadBalancer.class)
public class DeptConsumer_80 {
    public static void main(String[] args) {
        SpringApplication.run(DeptConsumer_80.class,args);
    }
}

通过上述步骤,就能够成功的实现自定义负载均衡策略

你可能感兴趣的:(ribbon,负载均衡,java)