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

前言

Ribbon作为Spring Cloud全家桶核心组件之一,是一套基于客户端的软负载工具,主要是基于Netfilx发布的开源项目,功能主要是应用于客户端软件的负载均衡算法、服务之间调用的桥梁。作为客户端的组件,提供了一系列的配置,如拒绝策略、超时重试、服务发现策略….主要的核心组件也是基于Load Balancer,会提供一些负载均衡策略,如轮询、加权轮询、随机连接、重试等策略。

注册中心、负载均衡、生产者服务之间的注册与调用情况

Ribbon负载均衡策略核心

IRule 接口定义了一系列的负载均衡策略

核心接口ILoadBalance定义了一系列的方法,包括获取服务列表、选择、添加、选择服务。

自定义负载均衡策略

1:代码方式配置新策略

首先定义Configuration的MyRule类,定义myRule方法返回IRule接口。

public class CustomRule extends AbstractLoadBalancerRule {


    private int total = 0; //被调用的次数
    private int currentIndex = 0; //当前是谁在提供服务

    public Server choose(ILoadBalancer lb, Object o) {
        if (lb == null) {
            return null;
        }
        Server server = null;

        while (server == null) {
            if (Thread./interrupted/()) {
                return null;
            }
            List<Server> upList = lb.getReachableServers(); //获得还活着的服务
            List<Server> allList = lb.getAllServers(); //获取全部服务

            int serverCount = allList.size();
            if (serverCount == 0) {

                return null;
            }

            //int index = chooseRandomInt(serverCount);
            //server = upList.get(index);

            if (total < 5) {
                server = upList.get(currentIndex);
                total++;
                System./out/.println(“<5” + total + “:” + currentIndex);
            } else {
                total = 0;
                currentIndex++;
                if (currentIndex > upList.size() - 1) {
                    currentIndex = 0;
                    System./out/.println(“>size” + total + “:” + currentIndex);
                }
                server = upList.get(currentIndex);
                System./out/.println(“>5” + total + “:” + currentIndex);
            }

            if (server == null) {

                Thread./yield/();
                continue;
            }

            if (server.isAlive()) {
                return (server);
            }


            server = null;
            Thread./yield/();
        }

        return server;
    }


    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {

    }

    @Override
    public Server choose(Object o) {
         return choose(getLoadBalancer(), o);
    }
}
复制代码

自定义策略类CustomRule继承AbstractLoadBalancerRule父类,重写choose 方法,去选择自已写的负载均衡策略,这里我定义的策略是一个消费者服务被调用5次后就去调下一个服务。

2:配置文件的方式:

XXXservice: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer. MyRule /# 负载均衡规则/ 复制代码

启动类配置,需要通过自定义RestTemplate模版实现自定义策略的调用

通过postman去调服务的接口

断点代码发现调用次数超过了5次就会去,获取还存活的服务,并且下标从0开始计算,如果还存活的服务只有一个那么只能去轮询这一个还存活的服务实例。

总结

随着业务的开发的多变,我们的服务的负载均衡的策略也需要在原来的基础上,作出拓展,有些公司会根据自己的业务不同实现自己的负载均衡策略,一般情况下的开发就用默认的负载均衡规则。

经验分享 程序员 微信小程序 职场和发展