Ribbon 支持的9大负载均衡策略

个人博客 :https://www.siyuan.run
CSDN:https://blog.csdn.net/siyuan
微信小程序:思远Y

  1. 线性轮询策略: RoundRibbonRule

    BaseLoadBalancer 负载均衡器默认采用线性负载轮询负载均衡策略。

    工作流程:

    1. RoundRibbonRule 类的 choose(ILoadBalancer Ib,Object key) 方法初始化一个计数器。
    2. incrementAndGetModulo() 方法获取一个下标 (是先加1,然后和服务清单总数取模获取到的,不会越界),是一个不断增长的数。
    3. chooseServer(Object key) 方法拿着下标去服务列表中获取服务,每次循环计数器都会加1。如果连续10次都没有取到服务,则会报 “No available alive servers after 10 tries from loadbalancer.” 警告。
  2. 重试策略:RetryRule

    重试策略在使用 RetryRule 类中定义的 choose(ILoadBalance Ib,Object key) 方法来选择一个服务实例。

    choose() 方法也是采用 RoundRibbonRule 中的 choose() 方法来选择一个服务实例的。

    工作流程

    1. 如果选择到的服务实例正常,则返回数据。
    2. 如果选择到的服务实例为 null 或 失效,则 choose() 方法会在失效时间前不断地进行重试。
    3. 如果超过了失效时间还是没有取到,则返回一个 null。
  3. 加权响应时间策略:WeightedResponseTimeRule

    WeightedResponseTimeRule 类是 RoundRibbonRule 的一个子类,它对 RoundRibbonRule 的功能进行了扩展。它根据每一个服务实例的运行情况先计算出该服务实例的一个权重,然后根据权重进行服务实例的挑选,这样能够调用到更优的服务实例。

    工作流程

    1. 每 30S 计算一次各服务实例的响应时间,以响应时间来计算权重。平均响应时间越短则权重越高,权重越高则被选中的的概率越高,反之则被选中的概率较低。
    2. WeightedResponseTimeRule 中有一个名叫 DynamicServerWeightTask 的定时任务。它是一个后台线程,定期从 status 里面读取响应时间,用来计算每个服务实例权重。
  4. 随机策略:RandomRule

    随机选择一个可用的服务实例。

    工作流程

    1. 负载均衡通过 upList() 和 allList() 方法获得可用服务实例列表,然后初始化了一个 Randow 对象以生成一个不大于服务实例总的随机数。
    2. choose() 方法将该随机数作为下标获取一个服务实例。轮询 “index” 选择 “index” 对应的服务实例。
  5. 客户端配置启动线性轮询策略:ClientConfigEnabledRoundRobbinRule

    继承该策略默认的 choose() 方法就能实现线性轮询机制。

  6. 最空闲策略:BestAvailableRule

    该服务是逐个考察各服务实例,然后选择一个最小的并发请求的服务实例来提供实例。BestAvailableRule 继承自 ClientConfigEnabledRoundRobbinRule 类。

    工作流程

    1. 根据在 loadBalancerStats() 方法中保存的服务实例的状态信息来过滤失效的服务实例。
    2. 判断 loadBalancerStats 是否为空。
      1. 如果 loadBalancerStats 不为空,则找出并发请求最小的服务实例来使用。
      2. 如果 loadBalancerStats 为空,则 BestAvailableRule 类将采用它的父类。即 ClientConfigEnabledRoundRobbinRule 的服务选取策略 (线性策略)。
  7. 过滤性线性轮询策略:PredicateBasedRule

    PredicateBaseRule 类是 ClientConfigEnabledRoundRobbinRule 类的一个子类,它通过内部定义的一个过滤器过滤出一部分服务实例清单,然后用线性轮形的方式从过滤出来的服务实例清单中选取提个服务实例。

  8. 区域感知轮询策略:ZoneAvoidanceRule

    该策略以区域、可用的服务器为基础,选择服务实例并对服务实例进行分类。ZoneAvoidanceRule 类是 PredicateBasedRule 类的一个实现类,它有一个组合过滤条件 (CompositePredicate)。ZoneAvoidanceRule 类中的过滤条件是 “以 ZoneAvoidancePredicate() 方法为主过滤条件” 和 “以AvailabilityPredicate() 方法为次过滤条件” 组成的。在过滤成功后,继续采用线性轮询的方式从过滤结果中选择出一个服务实例。

  9. 可用性过滤策略:AvailabilityFilteringRule

    该策略根据服务状态 (宕机和繁忙) 来分配权重,过滤掉那些因为一直连接失败或高并发的服务实例。它使用一个 AvailabilityPredicate() 方法来包含过滤逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273558.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fedora20开机启动配置:systemctl

老版fedora中使用chkconfig配置开机启动,fedora20中,使用chkconfig会出现各种问题。使用systemctl配置。 具体表格如下 转载于:https://www.cnblogs.com/hh6plus/p/5548083.html

Mysql 字符操作函数相关

常用的字符串函数: 函数说明CONCAT(s1,s2,...)返回一个或多个待拼接的内容,任意一个为NULL则返回值为NULL。CONCAT_WS(x,s1,s2,...)返回多个字符串拼接之后的字符串,每个字符串之间有一个x。SUBSTRING(s,n,len)、MID(s,n,len)两个…

“cvSnakeImage”: 找不到标识符

1>g:\project\opencv\helloopencv\helloopencv\helloopencv.cpp(74) : error C2065: “CV_VALUE”: 未声明的标识符1>g:\project\opencv\helloopencv\helloopencv\helloopencv.cpp(74) : error C3861: “cvSnakeImage”: 找不到标识符 增加头文件 #include <opencv2/l…

Shell 快速入门

个人博客 &#xff1a;https://www.siyuan.run CSDN&#xff1a;https://blog.csdn.net/siyuan 微信小程序&#xff1a;思远Y 概述 Shell 是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言。 Shell…

Andriod开发 --插件安装、环境配置、问题集锦

1.用Eclipse搭建Android开发环境和创建第一个Android项目&#xff08;Windows平台&#xff09; 链接阅读http://www.cnblogs.com/allenzheng/archive/2012/11/10/2762379.html 搭建环境中的不同之处&#xff1a; &#xff08;1&#xff09;我在安装过程中&#xff0c;在安装ADT…

《Java 高并发》01 高并发基本概念

基本概念 同步和异步 同步和异步通常是用来形容一次方法调用。 同步方法调用一旦开始&#xff0c;调用者必须等到方法返回才能继续执行后续操作。 异步方法调用更像一个消息传递&#xff0c;一旦开始&#xff0c;方法调用就会立即返回&#xff0c;调用者就可以继续后续的操…

Android之Http网络编程(四)

前面几篇博文简单的介绍了一些常见的Http的操作&#xff0c;这些操作几乎都是在新开的线程中进行的网络请求&#xff0c;并在日志中打印出获取到的网络数据。那么&#xff0c;问题来了&#xff01;&#xff08;呃~感觉下一句是蓝翔有木有&#xff1f;&#xff09;如何在把获取到…

《Java 高并发》02 多线程的特性

多线程的三大特性&#xff1a;原子性、可见性和有序性。 原子性 原子性是指一个操作或者多个操作&#xff0c;一旦开始就不会被其他线程干扰&#xff0c;即使是在多个线程一起执行的情况下也不会被干扰。或者不执行。 原子性主要是为了保证数据一致&#xff0c;线程安全问题…

U3D-FSM有限状态机的简单设计

http://coder.beitown.com/archives/592 在之前的文章里介绍了一个基础U3D状态机框架&#xff08;Unity3D游戏开发之状态流框架&#xff09;即大Switch的枚举状态控制。这种方法虽然容易理解&#xff0c;编程方法也相对简单&#xff0c;但是弊端是当状态变得复杂之后&#xff0…

《Java 高并发》04 线程的基本操作

新建线程 新建线程很简单。只要使用new 关键字创建一个线程对象&#xff0c;并且调用 start 方法启动线程。 Thread t new Thread(); t.start();注意&#xff1a;run 方法不是用来启动线程。如果调用 run 方法它只会作为普通方法来执行&#xff0c;而不会开启线程执行。 终止…

Dispatch 方法简介

后台执行 dispatch_async(dispatch_get_global_queue(0, 0), ^{ //后台程执行 something; }); 主线程执行 dispatch_async(dispatch_get_main_queue(), ^{// 主线程执行something; }); 一次性执行 static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ // 主…

linux杂七杂八整理

64系统里执行32位程序&#xff1a; 1、在64系统里执行32位程序如果出现/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory&#xff0c;安装下glic即可sudo yum install glibc.i6862、error while loading shared libraries: libz.so.1: cannot …

《Java 高并发》05 线程的基本操作

volatile 与 Java 内存模型 Java 内存模型都是围绕着原子性、有序性和可见性展开的。为了在适当的场合&#xff0c;确保线程间的原子性、有序性和可见性。Java 使用了一些特许的操作或者关键字来申明、告诉虚拟机&#xff0c;在这个地方&#xff0c;要尤其注意&#xff0c;不能…

mybatis 2 -常用数据操作

1、写入数据并获取自增ID XML配置&#xff1a; <!-- 写入数据获取自增ID --><insert id"insertLog" parameterType"com.mamaguwen.entity.sys_loginlog" useGeneratedKeys"true" keyProperty"logid">insert into sys_…

Spring常用的的注解对应xml配置详解

Component(value"")注解&#xff1a;组件 标记在类上&#xff0c;也可以放在接口上注解作用&#xff1a;把AccountDao实现类对象交由Spring IOC容器管理 相当于XML配置文件中的Bean标签 <bean id"userAnnonMapper" class"com.spring.mapper.User…

安卓模拟器bluestacks mac地址修改教程

http://szmars2008.blog.163.com/blog/static/118893702201373181349348/ 转载于:https://www.cnblogs.com/prayer521/p/4069037.html

Docker 搭建 ELK 日志系统,并通过 Kibana 查看日志

Docker 搭建 ELK 日志系统,并通过 Kibana 查看日志 docker-compose.yml version: 3 services:elasticsearch:image: elasticsearch:7.7.0 #镜像container_name: elasticsearch #定义容器名称restart: always #开机启动&#xff0c;失败也会一直重启environment:- "cl…

蟠桃记

Problem Description 喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事&#xff0c;你们一定都觉得这猴子太闹腾了&#xff0c;其实你们是有所不知&#xff1a;悟空是在研究一个数学问题&#xff01; 什么问题&#xff1f;他研究的问题是蟠桃一共有多少个&#xff01; 不过&#…

Spring 定时任务动态管理

管理 Spring 中定时任务 pom.xml <properties><hutool.version>5.6.6</hutool.version><lombok.version>1.18.20</lombok.version><spring-boot.web.version>2.2.10.RELEASE</spring-boot.web.version> </properties><de…

高效率Oracle SQL语句

1、Where子句中的连接顺序&#xff1a; ORACLE采用自下而上的顺序解析WHERE子句。 根据这个原理&#xff0c;表之间的连接必须写在其他WHERE条件之前&#xff0c; 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。 举例&#xff1a; (低效) select ... from table1…