Spring Cloud Ribbon 负载均衡策略

1、接口 IRule

public interface IRule{
   
	//选择server
    public Server choose(Object key);
    //设置LoadBalancer
    public void setLoadBalancer(ILoadBalancer lb);
    //获取LoadBalancer
    public ILoadBalancer getLoadBalancer();    
}

2、接口的抽象实现类 AbstractLoadBalancerRule

public abstract class AbstractLoadBalancerRule implements IRule, IClientConfigAware {
   
    private ILoadBalancer lb;
    @Override
    public void setLoadBalancer(ILoadBalancer lb){
   
        this.lb = lb;
    }
    @Override
    public ILoadBalancer getLoadBalancer(){
   
        return lb;
    }      
}

上一篇中,IRule是在 BaseLoadBalancer 中做了一个绑定,在这里,在接口中设置了Loadbalancer

3、轮询 RoundRobinRule

public class RoundRobinRule extends AbstractLoadBalancerRule {
   
	//下一个计数
    private AtomicInteger nextServerCyclicCounter;
    private static final boolean AVAILABLE_ONLY_SERVERS = true;
    private static final boolean ALL_SERVERS = false;
    private static Logger log = LoggerFactory.getLogger(RoundRobinRule.class);

    public RoundRobinRule() {
   
        nextServerCyclicCounter = new AtomicInteger(0);
    }

    public RoundRobinRule(ILoadBalancer lb) {
   
        this();
        setLoadBalancer(lb);
    }

    public Server choose(ILoadBalancer lb, Object key) {
   
        if (lb == null) {
   
            log.warn("no load balancer");
            return null;
        }

        Server server = null;
        //尝试次数
        int count = 0;
        while (server == null && count++ < 10) {
   
            //可用的servers
            List<Server> reachableServers = lb.getReachableServers();
            //所有的servers
            List<Server> allServers = lb.getAllServers();
            int upCount = reachableServers.size();
            int serverCount = allServers.size();

            if ((upCount == 0) || (serverCount == 0)) {
   
                log.warn("No up servers available from load balancer: " + lb);
                return null;
            }
			//获取server,递增计数并取模
            int nextServerIndex = incrementAndGetModulo(serverCount);
            server = allServers.get(nextServerIndex);

            if (server == null) {
   
                /* Transient. */
                Thread.yield();
                continue;
            }

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

            // Next.
            server = null;
        }
		//尝试10次还没有获取到server,则返回空
        if (count >= 10) {
   
            log.warn("No available alive servers after 10 tries from load balancer: "
                    + lb);
        }
        return server;
    }
	//递增计数并取模
    private int incrementAndGetModulo(int modulo) {
   
        for (;;) {
   
            int current = nextServerCyclicCounter.get();
            int next = (current + 1) % modulo;
            if (nextServerCyclicCounter.compareAndSet(current, next))
                return next;
        }
    }
    @Override
    public Server choose(Object key) {
   
        return choose(getLoadBalancer(), key);
    }
    @Override
    public void initWithNiwsConfig(IClientConfig clientConfig) {
   
    }
}

4、权重轮询WeightedResponseTimeRule

将server的应答时间的平均值或者百分比作为权重

public class WeightedResponseTimeRule extends RoundRobinRule {
   

    public static final IClientConfigKey<Integer> WEIGHT_TASK_TIMER_INTERVAL_CONFIG_KEY = new IClientConfigKey<Integer>() {
   
        @Override
        public String key() {
   
            return "ServerWeightTaskTimerInterval";
        }
        
        @Override
        public String toString() {
   
            return key();
        }

        @Override
        public Class<Integer> type() {
   
            return Integer.class;
        }
    };
    //默认时间周期 30秒
    public static final int DEFAULT_TIMER_INTERVAL = 30 * 1000;
    //权重计算定时时间 默认 30秒
    private int serverWeightTaskTimerInterval = DEFAULT_TIMER_INTERVAL;
    private static final Logger logger = LoggerFactory.getLogger(WeightedResponseTimeRule.class);
    
	//服务的权重值,后面的会叠加前面的
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值