负载均衡策略之AbstractLoadBalancerRule和RandomRule源码解读

一 负载均衡类图

二 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;
    }      
}

三 RandomRule解读

public class RandomRule extends AbstractLoadBalancerRule {

    //从服务清单中随机选择一个服务实例
    @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE")
    public Server choose(ILoadBalancer lb, Object key) {
        if (lb == null) {
            return null;
        }
        Server server = null;

        while (server == null) {
            if (Thread.interrupted()) {
                return null;
            }
            //负载均衡来获得可用实例列表upList和allList
            List<Server> upList = lb.getReachableServers();
            List<Server> allList = lb.getAllServers();

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

            //随机来获取一个随机数
            int index = chooseRandomInt(serverCount);
            //随机数作为upList的索引值来返回具体实例
            server = upList.get(index);

            if (server == null) {
                /*
                 * The only time this should happen is if the server list were
                 * somehow trimmed. This is a transient condition. Retry after
                 * yielding.
                 */
                Thread.yield();
                continue;
            }

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

            // Shouldn't actually happen.. but must be transient or a bug.
            server = null;
            Thread.yield();
        }
        //正常情况下,每次都应该可以选择一个服务实例
        return server;

    }

    protected int chooseRandomInt(int serverCount) {
        return ThreadLocalRandom.current().nextInt(serverCount);
    }

    //接口中的choose委托给该类中的choose(getLoadBalancer(), key)方法
    @Override
    public Server choose(Object key) {
        return choose(getLoadBalancer(), key);
    }

    @Override
    public void initWithNiwsConfig(IClientConfig clientConfig) {
        // TODO Auto-generated method stub
        
    }
}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: AbstractLoadBalancerRuleRibbon负载均衡规则的抽象基类。这个类主要定义了负载均衡的基本逻辑,包括选择一个可用的服务器,忽略不可用的服务器,以及根据负载均衡算法选择一个服务器来处理请求。具体来说,该类具有以下特征: 1. 构造函数:该类有两个构造函数,其中一个是空的,另一个可以接受一个IRule对象作为参数。 2. choose方法:该方法是选择服务器的核心方法,返回一个可用的服务器实例。该方法包含基本的逻辑,如忽略禁用的服务器、根据权重值选择服务器等。 3. getRuleDefinition和setRuleDefinition方法:这两个方法用于获取和设置规则定义,后者用于将规则配置文件中的规则定义传递给负载均衡规则。 4. getLoadBalancer和setLoadBalancer方法:这两个方法分别用于获取和设置负载平衡器实例,该实例用于在选择服务器时使用。 总的来说,AbstractLoadBalancerRuleRibbon中的负载均衡提供了基础的实现类,具有良好的可扩展性和可定制性,用户可以通过继承该类,并覆盖choose方法,实现自己的负载均衡规则。 ### 回答2: abstractloadbalancerrule负载均衡算法的抽象类,它是AWS负载均衡服务中LoadBalancerRule接口的实现类。主要负责定义负载均衡规则的基本属性和行为。 该类具有以下主要方法和属性: 1. name:规则的名称,用来标识该规则。 2. priority:规则的优先级,用来指定规则的执行顺序。 3. abstractLoadBalancer负载均衡器对象,表示该规则所属的负载均衡器。 4. loadBalancerAttribute:负载均衡器的属性,包括访问日志配置、连接超时等等。 5. listeners:监听器对象列表,表示该规则所属的监听器。 主要方法包括: 1. apply:将负载均衡规则应用到指定的负载均衡器实例上。该方法会将规则添加到负载均衡器的规则列表中。 2. isUseDataFeed:判断该规则是否启用了数据供应。若启用,则返回true,否则返回false。 3. ensureAttributes:确保负载均衡器的属性已经初始化,如果没有则进行初始化。 4. modifyAttribute:修改负载均衡器的属性值,包括磁盘容量、访问日志配置等。 该类还可以通过继承来拓展更多负载均衡规则,例如实现基于时间片的负载均衡、基于请求路径的负载均衡等等。 abstractLoadBalancerRule类的设计符合面向对象的思想,通过将通用的负载均衡规则逻辑封装在抽象类中,具体的负载均衡规则可以通过继承和重写方法来实现。这样设计能够提高代码的复用性和可扩展性,使得负载均衡规则的管理更加灵活和可定制化。 ### 回答3: abstractloadbalancerrule(抽象负载均衡规则)是负载均衡器的一个抽象类,是负责实现负载均衡算法的核心部分。它提供了许多抽象方法和属性,用于定义不同负载均衡规则的具体实现。 该类的源码主要包括以下几个方面的内容: 1. 抽象方法:abstractloadbalancerrule定义了一系列抽象方法,如choose()、getMaxServerCount()、getName()等。这些方法是具体负载均衡规则类必须实现的,用于选择目标服务器、获取最大服务器数量和获取规则名字等功能。 2. 属性:该类定义了一些属性,如ruleConfig(规则配置)、loadBalancer负载均衡器)等。这些属性用于保存规则的配置信息和负载均衡器的实例,以便在具体规则类中使用。 3. 辅助方法:abstractloadbalancerrule中也包含了一些辅助方法,如validateRuleConfig(验证规则配置)和getLoadBalancer(获取负载均衡器)等。这些方法用于辅助具体规则类的实现,进行规则配置的验证和获取负载均衡器的操作。 通过在具体负载均衡规则类中继承和实现abstractloadbalancerrule,我们可以根据具体业务需求来定义不同的负载均衡算法。例如,可以基于轮询、随机、加权轮询或一致性哈希等算法来实现choose()方法,用于选择目标服务器。同时,也可以通过在具体规则类中覆盖validateRuleConfig()方法,对规则的配置进行验证,确保规则的有效性。 总之,abstractloadbalancerrule是一个抽象类,提供了负载均衡规则的基本实现,通过继承和实现该类,可以实现各种不同的负载均衡算法,并根据具体业务需求进行定制。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值