Spring Cloud全解析:负载均衡之Ribbon的负载均衡算法

Ribbon的负载均衡算法

提供的负载均衡算法

Ribbon中有七种负载均衡算法可供选择

  • RoundRobinRule,轮询

  • RandomRule,随机

  • AvailabilityFilteringRule ,会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务(可以通过niws.loadbalancer.<clientName>.connectionFailureCountThreshold来配置连接失败的次数),还有并发的连接数量超过阈值的服务(可以通过<clientName>.ribbon.ActiveConnectionsLimit来配置最高并发数),然后对剩余的服务列表按照轮询策略进行访问

  • WeightedResponseTimeRule,根据平均响应时间计算所有服务的权重,响应时间越快的服务权重越大被选中的概率越高,刚启动时如果统计信息不足,则使用RoundRobinRule策略,等统计信息足够,会切换到WeightedResponseTimeRule

  • RetryRule,先按照轮询策略获取服务,如果获取服务失败则在指定时间内进行重试,获取可用服务

  • BestAvailableRule,会先过滤掉由于多次访问故障而处于跳闸状态的服务,然后选择一个并发量最小的进行访问

  • ZoneAvoidanceRule,复合判断server所在区域的性能和server的可用性选择

选择负载均衡算法

java 复制代码
// 配置restTemplate的负载均衡算法
@Bean
public IRule myRule(){
    return new RandomRule();
}

自定义负载均衡算法

java 复制代码
/**
 * 自定义负载均衡算法
 * @author zh
 */
public class MyRule  extends AbstractLoadBalancerRule {
    Random rand;

    public MyRule() {
        rand = new Random();
    }

		// 根据key来选择对应的服务
    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) {

                return null;
            }
            // 生成随机数作为索引获取服务
            int index = rand.nextInt(serverCount);
            server = upList.get(index);

            if (server == null) {

                Thread.yield();
                continue;
            }

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

            server = null;
            Thread.yield();
        }

        return server;

    }

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

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

    }
}

配置该bean

复制代码
@Configuration
public class MyRuleConfig {

    @Bean
    public IRule myRule(){
        return new MyRule();
    }
}

使用@RibbonClient来使用自定义的负载均衡类,但是这个自定义的负载均衡类不可以在@ComponentScan所能扫描的包下,否则这个自定义的负载均衡算法就会被所有的Ribbon客户端所共享,无法达到对于某个微服务定制的效果了,该bean在使用的时候才会进行实例化

java 复制代码
@SpringBootApplication
@EnableEurekaClient
// 配置自定义的负载均衡类,只针对于某个微服务有效
@RibbonClient(name = "micro-service-dept-provider",configuration = MyRule.class)
public class ConsumerApp {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApp.class,args);
    }
}

除了使用注解,还可以使用配置文件来配置服务使用的ribbon负载均衡算法

yaml 复制代码
micro-service-dept-provider:
  ribbon:
    NFLoadBalancerRuleClassName: com.zhanghe.ribbon.rule.MyRule

配置格式为<clientName>.ribbon

  • NFLoadBalancerClassName 配置ILoadBalancer的实现类
  • NFLoadBalancerRuleClassName 配置IRule的实现类
  • NFLoadBalancerPingClassName 配置IPing的实现类
  • NIWSServerListClassName 配置ServerList的实现类
  • NIWSServerListFilterClassName 配置ServerListFilter的实现类

https://zhhll.icu/2021/框架/微服务/springcloud/负载均衡/Ribbon/2.Ribbon的负载均衡算法/

相关推荐
别动我齐刘海2 小时前
C++ 工程化学习
java·linux·前端·c++·学习·机器学习·机器人
code2cat3 小时前
Java进阶篇之AtomicLongFieldUpdater:把累计额度留在对象字段中
java·cas·并发编程
WeiXin_DZbishe3 小时前
基于springboot城市公交实时运营与调度系统-计算机毕设 附源码【课程设计】66173
java·vue.js·spring boot·后端·python·php·课程设计
泡茶喝茶写代码3 小时前
A股量化数据工程:从 REST 接口到策略信号(第 18 篇):放量缩量异动扫描
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
wewowilling3 小时前
认识微服务
java·运维·微服务·springcloud
代码什么用4 小时前
Java Web 7-10
java·servlet
蜗牛互联网5 小时前
GPT-6 与 Intelligent UI:从回答到可审计操作的产品迁移
java·人工智能·后端
SL_staff6 小时前
运维救火实录:钉钉考勤API变更引发工资计算异常,我们用JVS-Logic可视化逻辑引擎实现分钟级热修复
java·mysql·全栈
SunnyDays10116 小时前
Java 查找并高亮 Word 文字:精确查找及正则表达式模糊查找
java·查找文字·word 文档·高亮文字·正则匹配查找·模糊查找