1. 在springcloud中,使用的是ribbon来解决负载均很的问题,而常见的负载均衡策略包括有:轮询,随机, 一致性哈希,哈希,加权。

  2. 在ribbon中提供了ILoadBalance接口用来代表负责均衡的操作,它提供了增加服务器,选择服务器,标记服务器状态为down,获得可用服务器以及获得所有服务器的操作。


public interface ILoadBalancer {void addServers(List<Server> var1);Server chooseServer(Object var1);void markServerDown(Server var1);/** @deprecated */@DeprecatedList<Server> getServerList(boolean var1);List<Server> getReachableServers();List<Server> getAllServers();
}
  1. ribbon中具体实现负载均衡的策略是通过IRule这个接口来实现的,接口实现结构图
  2. ribbon默认是使用的是zoneAvoidanceRule规则
 @Bean@ConditionalOnMissingBeanpublic IRule ribbonRule(IClientConfig config) {if (this.propertiesFactory.isSet(IRule.class, this.name)) {return (IRule)this.propertiesFactory.get(IRule.class, config, this.name);} else {ZoneAvoidanceRule rule = new ZoneAvoidanceRule();rule.initWithNiwsConfig(config);return rule;}
  1. 自定义负载规则,通过yml配置文件
    格式如下.ribbon.
service-provider-user:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
策略名 策略声明 策略描述 实现说明
BestAvailableRule public class BestAvailableRule extends ClientConfigEnabledRoundRobinRule 选择一个最小的并发请求的serve 逐个考察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的权重。当刚开始运行,没有形成statas时,使用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。

如果ribbon的这些规则都不满足需求,可以定义自己的规则,继承AbstractLoadBalancerRule类,重写choose方法,参考随机规则。


package com.netflix.loadbalancer;import com.netflix.client.config.IClientConfig;import java.util.List;
import java.util.concurrent.ThreadLocalRandom;/*** A loadbalacing strategy that randomly distributes traffic amongst existing* servers.* * @author stonse* */
public class RandomRule extends AbstractLoadBalancerRule {/*** Randomly choose from all living servers*/@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;}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 = chooseRandomInt(serverCount);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);}@Overridepublic Server choose(Object key) {return choose(getLoadBalancer(), key);}@Overridepublic void initWithNiwsConfig(IClientConfig clientConfig) {// TODO Auto-generated method stub}
}

Springcloud学习系列之Ribbon自定义负载均衡规则相关推荐

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

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

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

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

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

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

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

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

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

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

  6. SpringCloud的Ribbon自定义负载均衡算法

    1.Ribbon默认使用RoundRobinRule策略轮询选择server 策略名 策略声明 策略描述 实现说明 BestAvailableRule public class BestAvailab ...

  7. 玩转Eureka+Ribbon系列之Ribbon的负载均衡策略

    文章目录 1.全局设置 1.1.随机策略 1.2.轮询策略 1.3.重试策略 1.4.最少并发数策略 1.5.可用过滤策略 1.6.响应时间+权重策略 1.7.区域权重策略 2.局部设置 策略类 na ...

  8. SpringCloud Ribbon(二)之自定义负载均衡策略IRule

    一.Ribbon负载均衡策略 一个服务对应一个LoadBalancer,一个LoadBalancer只有一个Rule,LoadBalancer记录服务的注册地址,Rule提供从服务的注册地址中找出一个 ...

  9. Springcloud、Nacos 服务注册、负载均衡Ribbon、http客户端Feign

    SpringCloud是基于SpringBoot的一整套实现微服务的框架.它提供了微服务开发所需的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集群状态管理等组 ...

  10. Ribbon 客户端负载均衡

    文章目录 零.懒汉式改为饿汉式 一.基于配置文件 二.基于Bean配置 三.自定义规则 1 权重优先调用 2 集群优先调用 3 元数据优先调用 零.懒汉式改为饿汉式 [consumer-springb ...

最新文章

  1. 学习 .net 的一些主要网站
  2. 什么是同源策略及限制
  3. day58-activiti 02-历史数据查询
  4. 安卓怎么显示res文件夹中的html_android中自定义WebView显示网页或本地html文件 | 学步园...
  5. 安卓安卓移动操作系统优缺点
  6. laravel 执行php命令报错PHP Parse error: syntax error, unexpected '=' in的解决方式
  7. 纯css3云彩动画效果
  8. android 系统(20)---背光灯
  9. 化繁为简 回归初心 细品雅致设计的vivo X50系列
  10. css background 一半_CSS---阴阳图
  11. Python Tricks(十八) —— range
  12. Jenkins持续集成环境, 如何自定义 maven 仓库
  13. 小米随身wifi驱动linux驱动下载,小米随身无线wifi电脑驱动下载|小米随身wifi驱动 v2.5 官方版 - 软件下载 - 绿茶软件园|33LC.com...
  14. 1.STC15W408AS单片机硬件资源
  15. MySQL8.0.26的时候解压libs文件出现错误:依赖检测失败:mariadb-libs 被 mysql-community-libs-8.0.26-1.el7.x86_64 取代
  16. 合并空间和时间姿势估算
  17. 计算机网络(考研)第二章 物理层
  18. App-UI自动化测试(Airtest+Pycharm)
  19. Flume+kafka+Spark Steaming demo2
  20. 如何科学有效地根治肾虚——中篇(肾虚到底是什么?)

热门文章

  1. leetcode最小面积_LeetCode 题解 |力扣杯 LCP 13.寻宝
  2. android 替代map,Android为什么推荐使用SparseArray来替代HashMap?
  3. AWS SageMaker 基于Random Cut Forest 的异常值检测 随机森林
  4. Swift设计模式: 观察者模式(发布-订阅模式)
  5. linux yum jemalloc,Redis安装报错error:jemalloc/jemalloc.h:No such file or directory解决方法
  6. 113. 路径总和 II
  7. 编程实现strcpy函数
  8. 逻辑斯蒂回归和感知机模型、支持向量机模型对比
  9. How to do Regularization?(如何正则化)(1)----吴恩达机器学习
  10. 【知识图谱系列】基于Random Propagation的深度图神经网络