LoadBalance自定义负载均衡策略

LoadBalance已有策略

  LoadBalance的源码中已有两种策略,RandomLoadBalancer(随机)、RoundRobinLoadBalancer(轮询,默认的负载均衡策略)。

LoadBalance自定义策略

   以下为使用自定义负载均衡策略的样例,根据配置服务提供者的权重,按比例随机访问服务器。仅展示自定义负载均衡策略相关的部分,Eureka等其他相关代码不作展示。提供两个服务提供者,端口分别为11000,11001。
在这里插入图片描述
自定义负载均衡策略

public class WeightLoadBalancer implements ReactorServiceInstanceLoadBalancer {

    final String serviceId;

    ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider;

    public WeightLoadBalancer(ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider,
                              String serviceId) {
        this.serviceId = serviceId;
        this.serviceInstanceListSupplierProvider = serviceInstanceListSupplierProvider;
    }

    @Override
    public Mono<Response<ServiceInstance>> choose(Request request) {
        ServiceInstanceListSupplier supplier = serviceInstanceListSupplierProvider
                .getIfAvailable(NoopServiceInstanceListSupplier::new);
        return supplier.get(request).next().map(this::select);
    }

    private Response<ServiceInstance> select(List<ServiceInstance> instances) {
        if (instances.isEmpty()) {
            return new EmptyResponse();
        }
        // 简单模拟权重,仅作演示
        // 11000:3  11001:1
        int[] ports = {11000, 11000, 11000, 11001};
        int port = ports[ThreadLocalRandom.current().nextInt(ports.length)];
        for (ServiceInstance instance : instances) {
            if (port == instance.getPort()) {
                return new DefaultResponse(instance);
            }
        }
        return new DefaultResponse(instances.get(0));
    }
}

LoadBalance配置类

public class MyLoadBalanceConfig {
    @Bean
    public ReactorLoadBalancer<ServiceInstance> reactorLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory){
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        // 随机
//        return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
        // 轮询
//        return new RoundRobinLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
        // 权重,自定义
        return new WeightLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
    }
}

启动类设置LoadBalance配置

@SpringBootApplication
@EnableDiscoveryClient
@LoadBalancerClients(
        @LoadBalancerClient(name = "cloud-payment-service", configuration = MyLoadBalanceConfig.class)
)
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}

调用的Controller

@Controller
@RequestMapping("/order")
public class OrderController {
    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @GetMapping("/loadBalance")
    public void loadBalance(){
        ServiceInstance instance = loadBalancerClient.choose("cloud-payment-service");
        System.out.println("port:" + instance.getPort());
    }
}

多次访问的效果如下:

port:11000
port:11000
port:11000
port:11000
port:11000
port:11000
port:11001
port:11000
port:11000
port:11000
port:11001
port:11000
port:11000
port:11001

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值