LoadBalancer 自定义负载均衡策略

spring cloud 后面版本默认使用LoadBalancer为负载均衡器

全局负载均衡器设置

@LoadBalancerClients(defaultConfiguration = {LbConfig.class})
public class xxxxxxServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(xxxxxxServerApplication .class, args);
    }
}

在启动类上增加注解LoadBalancerClients以及相关配置

LbConfig 配置Bean

public class LbConfig {
    // 配置负载均衡策略
    @Bean
    public ReactorLoadBalancer<ServiceInstance> myLB(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {
        String serviceId = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new MyLB(loadBalancerClientFactory.getLazyProvider(serviceId, ServiceInstanceListSupplier.class), serviceId);
    }
}

自定义负载均衡策略实现

/**
 * Created by IntelliJ IDEA.
 * 自定义负载均衡策略
 * @Author : 
 * @create 2023/4/25 9:24
 */
public class MyLB implements ReactorServiceInstanceLoadBalancer {

    private String serviceId;
    @Value("${spring.profiles.active}")
    private String active;

    private ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider;

    /**
     * @param serviceInstanceListSupplierProvider a provider of
     *                                            {@link ServiceInstanceListSupplier} that will be used to get available instances
     * @param serviceId                           id of the service for which to choose an instance
     */
    public MyLB(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(p -> getInstanceResponse(p));
    }

    private Response<ServiceInstance> getInstanceResponse(List<ServiceInstance> instances){
        if (instances.isEmpty()) {
            return new EmptyResponse();
        }

        NacosServiceInstance instanceResult = null;
        //开发环境执行  将特定应用的请求路由到指定实例
        if ("dev".equals(active) && "xxxxxx".equals(serviceId)) {
            instanceResult = new NacosServiceInstance();
            instanceResult.setServiceId(serviceId);
            //新地址ip
            instanceResult.setHost("xxxxxx");
            //新地址端口
            instanceResult.setPort(8080);
            //是否https
            instanceResult.setSecure(false);
        }

        // 如果指定的实例不可用,则随机取一个可用的服务
        if (instanceResult == null) {
            return new DefaultResponse(instances.get(0));
        }

        return new DefaultResponse(instanceResult);
    }

}

初级使用综上所述。

问题1:在此处只能修改新地址的ip加端口,不能修改路由

在这里插入图片描述
箭头位置为负载均衡之后得到的实例对象,上面的url已经在这之前从request中获取出来了,并且是final的,所以此处不能修改路由。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值