基于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版权协议,转载请附上原文出处链接和本声明。