SpringCloud_负载均衡

基于loadbalancer的负载均衡

在高版本的eureka与feign中均剔除了ribbon依赖,采用loadbalancer。若想使用ribbon进行负载均衡需要额外导入ribbon依赖

项目结构

高版本eureka自带loadbalancer,若在项目中使用了eureka则无需再单独导入loadbalancer依赖

1.在服务消费者端(Consumer)编写balanceRule,注意为其中方法添加@Bean注解

public class DefaultBalanceRule {
    @Bean
    public ReactorLoadBalancer<ServiceInstance> balancer(Environment environment, LoadBalancerClientFactory clientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new RandomLoadBalancer(clientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class),name);
    }
//        RandomLoadBalancer();//随机
//        RoundRobinLoadBalancer();//轮询
}

注:loadbalancer自带随机与轮询两种负载均衡算法,默认为轮询,这里设置为随机

2.为主启动类添加@LoadBalancerClient注解,并配置参数

@SpringBootApplication
@EnableEurekaClient//开启eureka
@EnableFeignClients//开启Feign
//value值为被负载均衡的微服务名 configuration值为balance策略类
@LoadBalancerClient(value = "SPRINGCLOUD-PROVIDER-DEPT",configuration = DefaultBalanceRule.class)
public class DpetConsumer_80_Feign {
    public static void main(String[] args) {
        SpringApplication.run(DpetConsumer_80_Feign.class);
    }
}

运行效果

选择查询所有数据的方法作为实验方法,在Provider端中添加输出自身端口的语句(8002及8003端口均做修改)

启动Consumer与Provider及eureka服务注册中心,进行多次访问

可以看到确实实现了负载均衡,也确实是随机策略,不过通过截图难以展现

如何实现自定义负载均衡策略?

1.创建自定义负载均衡策略类

//自定义负载均衡策略需要实现ReactorServiceInstanceLoadBalancer接口
public class CustomBalanceRule implements ReactorServiceInstanceLoadBalancer {
    ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider;
    
    public CustomBalanceRule(ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider) {
        this.serviceInstanceListSupplierProvider = serviceInstanceListSupplierProvider;
    }

    @Override
    public Mono<Response<ServiceInstance>> choose(Request request) {
        //此处为具体的负载均衡算法
        return null;
    }
}

2.创建负载均衡选择类

public class RuleChoose {
    // serviceInstanceListSupplierProvider可自动注入
    @Bean
    public ReactorServiceInstanceLoadBalancer chooseBalanceRule(
            ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider){
        //返回需要的自定义负载均衡策略
        return new CustomBalanceRule(serviceInstanceListSupplierProvider);
    }
}

3.将RestTemplate配置类中的@LoadBalancerClient注解的configuration参数的值改为RuleChoose.class

如此一来微服务将采用自定义的负载均衡策略


版权声明:本文为Mudrock__原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。