Ribbon自定义修改负载均衡

Ribbon

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具,主要功能是提供客户端的软件负载均衡算法和服务调用。
如果使用的RestTemplate进行服务调用,那么创建RestTemplate的方法上面加@LoadBalanced注解就会开启Ribbon的负载均衡,Ribbon负载均衡有以下7中规则,默认轮询
在这里插入图片描述
修改负载均衡规则为随机
1.建立自定义配置类,自定义配置类不能放在@ComponentScan当前包和和子包下,否则会被所有Ribbon客户端所共享

@Configuration
public class MyRuleConfig {
    @Bean
    public IRule rule(){
    //随机
        return new RandomRule();
    }
}

2.启动类上根据自己需求添加全局注解或者局部注解RibbonClients

//针对全局修改
@RibbonClients(defaultConfiguration = MyRuleConfig.class)
//针对某个服务修改
@RibbonClient(name = "cloud-payment-service",configuration = MyRuleConfig.class)

3.结合OpenFeign写一个自定义的负载均衡规则
1.实现一个OpenFeign跨进程调用服务的例子(https://blog.csdn.net/weixin_44728473/article/details/126043232?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22126043232%22%2C%22source%22%3A%22weixin_44728473%22%7D&ctrtid=pfPyf)
2.自定义一个类继承AbstractLoadBalancerRule 接口 模拟的业务逻辑,对i取模,为零的返回权重小的服务 的ip地址和端口号,不为零返回权重大的服务

public class MyRule extends AbstractLoadBalancerRule {

    //Nacos自带的自定义配置
    @Autowired
    private NacosDiscoveryProperties nacosDiscoveryProperties;

    //AtomicInteger线程安全
    public static AtomicInteger count = new AtomicInteger(0);

    Server server = null;

    @SneakyThrows
    @Override
    public Server choose(Object key) {

        //BaseLoadBalancer为bstractLoadBalancerRule 基类
        BaseLoadBalancer loadBalancer = (BaseLoadBalancer) this.getLoadBalancer();
        //获取到服务名
        String name = loadBalancer.getName();

        NamingService namingService = nacosDiscoveryProperties.namingServiceInstance();

        List<Instance> instances = namingService.selectInstances(name, true);

       /*
       * 模拟的业务逻辑
       * 对i取模,为零的返回权重小的服务 的ip地址和端口号
       * 不为零返回权重大的服务
       * */
        /*获取服务最大权重*/
        Instance instanceMax = instances.stream().max(Comparator.comparing(Instance::getWeight)).get();
        /*获取服务最小权重*/
        Instance instanceMin = instances.stream().min(Comparator.comparing(Instance::getWeight)).get();
        /*相当于i++*/
        int i = count.getAndAdd(1);
        int mod = i % 5;
        if (mod == 0) {
            server = new Server(instanceMin.getIp(), instanceMin.getPort());
        } else {
            server = new Server(instanceMax.getIp(), instanceMax.getPort());
        }
        return server;
    }

    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {

    }

}

2.自定义配置类(RibbonClient可以加在任何地方)

@Configuration
//针对全局修改
//@RibbonClients(defaultConfiguration = MyRuleConfig.class)
//针对某个服务修改
@RibbonClient(name = "nacos-app-a", configuration = MyRuleConfig.class)
public class MyRuleConfig {
    @Bean
    public IRule rule() {
      //返回上面自定义的规则类
        return new MyRule();
    }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

great-sun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值