1.Ribbon默认使用RoundRobinRule策略轮询选择server

策略名 策略声明 策略描述 实现说明
BestAvailableRule
public class BestAvailableRule extends ClientConfigEnabledRoundRobinRule
选择一个最小的并发请求的server 逐个考察Server,如果Server被tripped了,则忽略,在选择其中ActiveRequestsCount最小的server
AvailabilityFilteringRule public class AvailabilityFilteringRule extends PredicateBasedRule 过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值) 使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个server的运行状态
WeightedResponseTimeRule public class WeightedResponseTimeRule extends RoundRobinRule 根据响应时间分配一个weight,响应时间越长,weight越小,被选中的可能性越低。 一个后台线程定期的从status里面读取评价响应时间,为每个server计算一个weight。Weight的计算也比较简单responsetime 减去每个server自己平均的responsetime是server的权重。当刚开始运行,没有形成status时,使用roubine策略选择server。
RetryRule public class RetryRule extends AbstractLoadBalancerRule 对选定的负载均衡策略机上重试机制 在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server
RoundRobinRule public class RoundRobinRule extends AbstractLoadBalancerRule roundRobin方式轮询选择server 轮询index,选择index对应位置的server
RandomRule
public class RandomRule extends AbstractLoadBalancerRule

随机选择一个server

在index上随机,选择index对应位置的server

ZoneAvoidanceRule

public class ZoneAvoidanceRule extends PredicateBasedRule

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

使用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个判断判定一个zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接数过多的Server。

切换策略

  1. @Configuration
  2. public class ConfigBean {
  3. // @Bean
  4. // public RestTemplate getRestTemplate() {
  5. // return new RestTemplate();
  6. // }
  7. @Bean
  8. @LoadBalanced//Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡的工具。
  9. public RestTemplate getRestTemplate() {
  10. return new RestTemplate();
  11. }
  12. @Bean
  13. public IRule myRule()
  14. {
  15. //return new RoundRobinRule();
  16. // return new RandomRule();//达到的目的,用我们重新选择的随机算法替代默认的轮询。
  17. return new RetryRule();
  18. }
  19. }

自定义算法:

配置类(必须不能在启动类和启动类下所包含的子包下面)

  1. public class RandomRule_ZY extends AbstractLoadBalancerRule
  2. {
  3. // total = 0 // 当total==5以后,我们指针才能往下走,
  4. // index = 0 // 当前对外提供服务的服务器地址,
  5. // total需要重新置为零,但是已经达到过一个5次,我们的index = 1
  6. // 分析:我们5次,但是微服务只有8001 8002 8003 三台,OK?
  7. //
  8. private int total = 0; // 总共被调用的次数,目前要求每台被调用5次
  9. private int currentIndex = 0; // 当前提供服务的机器号
  10. public Server choose(ILoadBalancer lb, Object key)
  11. {
  12. if (lb == null) {
  13. return null;
  14. }
  15. Server server = null;
  16. while (server == null) {
  17. if (Thread.interrupted()) {
  18. return null;
  19. }
  20. List<Server> upList = lb.getReachableServers();
  21. List<Server> allList = lb.getAllServers();
  22. int serverCount = allList.size();
  23. if (serverCount == 0) {
  24. /*
  25. * No servers. End regardless of pass, because subsequent passes only get more
  26. * restrictive.
  27. */
  28. return null;
  29. }
  30. // int index = rand.nextInt(serverCount);// java.util.Random().nextInt(3);
  31. // server = upList.get(index);
  32. // private int total = 0; // 总共被调用的次数,目前要求每台被调用5次
  33. // private int currentIndex = 0; // 当前提供服务的机器号
  34. if(total < 5)
  35. {
  36. server = upList.get(currentIndex);
  37. total++;
  38. }else {
  39. total = 0;
  40. currentIndex++;
  41. if(currentIndex >= upList.size())
  42. {
  43. currentIndex = 0;
  44. }
  45. }
  46. if (server == null) {
  47. /*
  48. * The only time this should happen is if the server list were somehow trimmed.
  49. * This is a transient condition. Retry after yielding.
  50. */
  51. Thread.yield();
  52. continue;
  53. }
  54. if (server.isAlive()) {
  55. return (server);
  56. }
  57. // Shouldn't actually happen.. but must be transient or a bug.
  58. server = null;
  59. Thread.yield();
  60. }
  61. return server;
  62. }
  63. @Override
  64. public Server choose(Object key)
  65. {
  66. return choose(getLoadBalancer(), key);
  67. }
  68. @Override
  69. public void initWithNiwsConfig(IClientConfig clientConfig)
  70. {
  71. // TODO Auto-generated method stub
  72. }
  73. }
  1. @Configuration
  2. public class MySelfRule {
  3. @Bean
  4. public IRule myRule() {
  5. // return new RandomRule();// Ribbon默认是轮询,我自定义为随机
  6. return new RandomRule_ZY();// 我自定义为每台机器5次
  7. }
  8. }

另一配置类(在启动类包里面)

  1. @Configuration
  2. public class ConfigBean {
  3. // @Bean
  4. // public RestTemplate getRestTemplate() {
  5. // return new RestTemplate();
  6. // }
  7. @Bean
  8. @LoadBalanced//Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡的工具。
  9. public RestTemplate getRestTemplate() {
  10. return new RestTemplate();
  11. }
  12. // @Bean
  13. // public IRule myRule()
  14. // {
  15. // //return new RoundRobinRule();
  16. // return new RandomRule();//达到的目的,用我们重新选择的随机算法替代默认的轮询。
  17. // return new RetryRule();
  18. // }
  19. }

启动类

  1. @SpringBootApplication
  2. @EnableEurekaClient
  3. //在启动该微服务的时候就能去加载我们的自定义Ribbon配置类,从而使配置生效
  4. //@RibbonClient(name="MICROSERVICECLOUD-DEPT",configuration=MySelfRule.class)
  5. @RibbonClient(name="MICROSERVICECLOUD-DEPT",configuration=MySelfRule.class)
  6. public class DeptConsumer80_App {
  7. public static void main(String[] args) {
  8. SpringApplication.run(DeptConsumer80_App.class, args);
  9. }
  10. }

测试效果为每个server执行5次再轮询

转自:https://blog.csdn.net/flynn_chen/article/details/80631717

转载于:https://www.cnblogs.com/dauber/p/9443072.html

SpringCloud的Ribbon自定义负载均衡算法相关推荐

  1. Ribbon自定义负载均衡算法

    Ribbon是什么? Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起.Ribbon客户端组件提供一系列完善的配置项如连接超时 ...

  2. 6.Springcloud的Ribbon的负载均衡算法解析及配置方式

    项目地址: github地址 配置方式 1.在restTemplate配置类里面添加一个bean,用于确认所属的负载均衡算法类类型,全部代码如下: package com.debuggg.cloud. ...

  3. Spring Cloud Alibaba - 11 Ribbon 自定义负载均衡策略(同集群优先权重负载均衡算法)

    文章目录 Pre 需求 工程 Code 继承AbstractLoadBalancerRule实现自定义Rule 随机权重策略 配置 验证 源码 Pre Spring Cloud Alibaba - 0 ...

  4. Spring Cloud Alibaba - 10 Ribbon 自定义负载均衡策略(权重算法)

    文章目录 Pre 工程 首先屏蔽细粒度配置 然后通过代码设置一个全局配置 指定 GlobalRibbonConfig GlobalRibbonConfig 设置负载均衡策略 开发自定义策略 (权重访问 ...

  5. Spring Cloud Alibaba - 06 RestTemplate 实现自定义负载均衡算法

    文章目录 负载均衡分类 分析 工程 调用 测试 源码 负载均衡分类 服务端负载均衡 ,比如我们常见的ng 客户端负载均衡 ,比如微服务体系中的ribbon spring cloud ribbon是 基 ...

  6. Ribbon默认负载均衡算法之轮训算法原理解析

    目录 此项目中用到的数据库脚本文件 父模块`cloud2020`中仅有一个`pom.xml`文件 项目结构图 `pom.xml`文件 1.创建一个微服务项目用来测试 1.1创建`cloud-api-c ...

  7. SpringCloud(7)Ribbon 与负载均衡

    Ribbon SpringCloud Ribbon 是基于NetFlix Ribbon实现的一套客户端负载均衡的工具 简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负 ...

  8. Ribbon 自定义负载均衡策略

    Ribbon默认的负载均衡策略默认的有下面几种: 我们也可以自定义负载均衡策略: 修改springcloud-consumer-dept-80的主启动类: 下面开始编写自定义配置类MySelfRule ...

  9. Spring Cloud Alibaba gateway ribbon 自定义负载均衡规则。发散灰度发布,金丝雀测试等

    上一篇介绍了,ribbon的组件.本篇要自己写一个灰度方案.其实就是一个很简单的思维扩散. 需求 前端header请求携带version字段.路由服务根据version去需要对应版本的服务集合,进行或 ...

最新文章

  1. Swift反射API及其用法
  2. 【业务知识】企业数字档案馆总体架构图
  3. (转)剖析Delphi中的构造和析构
  4. 信息学奥赛一本通 1165:Hermite多项式
  5. 4,表查询语法,表连接,子查询
  6. websockert后台定时向前端发送状态_(文末送书)手把手教你打造属于自己团队的前端小报系统...
  7. 【转载】cocos2d-x类型转换(CCstring int string char UTF-8互转)以及字符串详解
  8. Java多线程(四)——多线程数据隔离与共享
  9. 搜索鸿蒙系统,鸿蒙系统更进一步,华为上线搜索服务,HMS有望替代谷歌GMS
  10. 力扣-386 字典序排数
  11. github上的优秀项目和开发环境配置
  12. ubuntu下取代ping的好工具tcpping
  13. Axure 8 注册码
  14. 缺少tlqcu_qcu1.conf文件
  15. 【Linux】用户管理命令
  16. HTTP headers 详解 headers 常用属性
  17. php mysql某小型汽车维修店信息管理系统zjyY3
  18. 优化了的过关键点的光滑曲线拟合算法
  19. vue引入wangEditor
  20. airplay服务器linux,树莓派搭建AirPlay服务实现WiFi无线音响外放

热门文章

  1. map-based exploration of intrinsic shape differences and variability
  2. Function Maps: A Flexible Representation of Maps Between Shapes
  3. SENet(ILSVRC2017-最后一个冠军)
  4. mysql 覆盖索引 简书_mysql覆盖索引与回表
  5. Fixchart图表组件——仪表盘,纳尼?
  6. java 密码连接mongo_mongodb启用密码认证连接
  7. 九龙擒庄指标源码破译_九龙擒庄指标源码破译_破译股市密码
  8. 操作系统核心原理-3.进程原理(上):进程概要
  9. C#静态类,静态构造函数,静态变量
  10. JavaScript函数—JavaScript闭包