0022-Ribbon负载均衡算法

本文深入解析了多种内置负载均衡算法,包括轮询、随机、权重响应时间、重试及最佳可用算法,并介绍了如何在微服务架构中全局或局部更换这些算法,同时探讨了自定义负载均衡算法的方法。

1. 内置算法种类

  • RoundRobinRule 轮询算法
  • RandomRule 随机算法
  • AvailabilityFilteringRule
    会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,
    还有并发的连接数量超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问
  • WeightedResponseTimeRule
    根据平均响应时间计算所有服务的权重,响应时间越快服务权重越大被选中的概率越高。
    刚启动时如果统计信息不足,则使用RoundRobinRule策略,等统计信息足够,
    会切换到WeightedResponseTimeRule
  • RetryRule
    先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试,获取可用的服务
  • BestAvailableRule 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
  • ZoneAvoidanceRule 默认规则,复合判断server所在区域的性能和server的可用性选择服务器,对合规的服务使用线性轮询

2. 更换负载均衡算法

2.1 全局配置

这种配置方式会影响所有的微服务调用

@Configuration
public class RuleConfig {

    /**
     * 改为随机算法, 全局生效
     *
     * @return
     */
    @Bean
    public IRule getRule() {
        return new RandomRule();
    }
}
2.2 局部配置
2.2.1 外层目录建立个性化配置

在@ComponentScan扫描不到的地方建立配置文件

/**
 * Created by rongyaowen
 * on 2020/4/2.
 * 针对eureka-provider做的ribbon客户端配置
 */
@Configuration
public class EurekaProviderServiceConfig {
    @Bean
    public IRule getRule() {
        return new RandomRule();
    }
}
2.2.2 配置方式1

在@ComponentScan扫描目录下建立配置文件

/**
 * Created by rongyaowen
 * on 2020/3/31.
 * ribbon客户端配置
 */
@Configuration
@RibbonClient(name = "eureka-provider", configuration = EurekaProviderServiceConfig.class)
public class RibbonConfig {

}
2.2.3 配置方式2

application.yml中配置

eureka-provider: # 服务名称
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 表示配置轮询算法

3. 自定义负载均衡算法

实现IRule接口或者实现其子类

/**
 * Created by rongyaowen
 * on 2020/3/31.
 * 只返回第1台主机
 */
public class MyRule extends AbstractLoadBalancerRule {
    public void initWithNiwsConfig(IClientConfig iClientConfig) {

    }

    /**
     * Randomly choose from all living servers
     */
    public Server choose(ILoadBalancer lb, Object key) {
        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) {
                /*
                 * No servers. End regardless of pass, because subsequent passes
                 * only get more restrictive.
                 */
                return null;
            }

            int index = 0;
            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;

    }

    public Server choose(Object key) {
        return choose(getLoadBalancer(), key);
    }
}

根据第二点讲的将其配置上就可以了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值