Ribbon负载均衡策略-3

  • 常用策略
  • 1.RoundRobinRule 轮转调度策略
  • 2.RetryRule重试规律策略
  • 3.RandomRule随机策略

Ribbon的负载均衡策略是由IRule接口定义,该接口如下实现

常用策略

1.RoundRobinRule 轮转调度策略

//该策略实现安装线性轮询的方式依次选择每个服务实例
public class RoundRobinRule extends AbstractLoadBalancerRule {private AtomicInteger nextServerCyclicCounter;private static final boolean AVAILABLE_ONLY_SERVERS = true;private static final boolean ALL_SERVERS = false;private static Logger log = LoggerFactory.getLogger(RoundRobinRule.class);public RoundRobinRule() {nextServerCyclicCounter = new AtomicInteger(0);}public RoundRobinRule(ILoadBalancer lb) {this();setLoadBalancer(lb);}public Server choose(ILoadBalancer lb, Object key) {if (lb == null) {log.warn("no load balancer");return null;}Server server = null;int count = 0;//最多选择十次,就会结束尝试while (server == null && count++ < 10) {List<Server> reachableServers = lb.getReachableServers();List<Server> allServers = lb.getAllServers();int upCount = reachableServers.size();int serverCount = allServers.size();if ((upCount == 0) || (serverCount == 0)) {log.warn("No up servers available from load balancer: " + lb);return null;}int nextServerIndex = incrementAndGetModulo(serverCount);server = allServers.get(nextServerIndex);if (server == null) {/* Transient. */Thread.yield();continue;}if (server.isAlive() && (server.isReadyToServe())) {return (server);}// Next.server = null;}if (count >= 10) {log.warn("No available alive servers after 10 tries from load balancer: "+ lb);}return server;}//通过递增实现轮询private int incrementAndGetModulo(int modulo) {for (;;) {int current = nextServerCyclicCounter.get();int next = (current + 1) % modulo;if (nextServerCyclicCounter.compareAndSet(current, next))return next;}}@Overridepublic Server choose(Object key) {return choose(getLoadBalancer(), key);}@Overridepublic void initWithNiwsConfig(IClientConfig clientConfig) {}
}

2.RetryRule重试规律策略

//具备重试机制的实例选择功能
public class RetryRule extends AbstractLoadBalancerRule {//默认使用RoundRobinRule实例IRule subRule = new RoundRobinRule();//阈值为500mslong maxRetryMillis = 500;public RetryRule() {}public RetryRule(IRule subRule) {this.subRule = (subRule != null) ? subRule : new RoundRobinRule();}public RetryRule(IRule subRule, long maxRetryMillis) {this.subRule = (subRule != null) ? subRule : new RoundRobinRule();this.maxRetryMillis = (maxRetryMillis > 0) ? maxRetryMillis : 500;}public void setRule(IRule subRule) {this.subRule = (subRule != null) ? subRule : new RoundRobinRule();}public IRule getRule() {return subRule;}public void setMaxRetryMillis(long maxRetryMillis) {if (maxRetryMillis > 0) {this.maxRetryMillis = maxRetryMillis;} else {this.maxRetryMillis = 500;}}public long getMaxRetryMillis() {return maxRetryMillis;}@Overridepublic void setLoadBalancer(ILoadBalancer lb) {        super.setLoadBalancer(lb);subRule.setLoadBalancer(lb);}public Server choose(ILoadBalancer lb, Object key) {long requestTime = System.currentTimeMillis();long deadline = requestTime + maxRetryMillis;Server answer = null;answer = subRule.choose(key);if (((answer == null) || (!answer.isAlive()))&& (System.currentTimeMillis() < deadline)) {InterruptTask task = new InterruptTask(deadline- System.currentTimeMillis());//反复重试while (!Thread.interrupted()) {//选择实例answer = subRule.choose(key);//500ms内没选择到就返回nullif (((answer == null) || (!answer.isAlive()))&& (System.currentTimeMillis() < deadline)) {/* pause and retry hoping it's transient */Thread.yield();} else //若能选择到实例,就返回{break;}}task.cancel();}if ((answer == null) || (!answer.isAlive())) {return null;} else {return answer;}}@Overridepublic Server choose(Object key) {return choose(getLoadBalancer(), key);}@Overridepublic void initWithNiwsConfig(IClientConfig clientConfig) {}
}

3.RandomRule随机策略

/*** Copyright 2013 Netflix, Inc.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.**/
package com.netflix.loadbalancer;import java.util.List;
import java.util.Random;import com.netflix.client.config.IClientConfig;/*** A loadbalacing strategy that randomly distributes traffic amongst existing* servers.* * @author stonse* */
public class RandomRule extends AbstractLoadBalancerRule {Random rand;public RandomRule() {rand = new Random();          //new  一个   Random类对象}/*** 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;                      //刚开始不知道服务哪个为nullwhile (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 = rand.nextInt(serverCount);               //假如有三台微服务serverCount=3   随机获取一个数字(nextInt(3)左闭右开)server = upList.get(index);                          //根据随机数获取集合的一个微服务if (server == null) {                             //如果微服务微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()) {                 //假如这个微server是活的return (server);                    //返回这个微服务}// Shouldn't actually happen.. but must be transient or a bug.server = null;Thread.yield();}return server;                               //最终返回这个微服务}@Overridepublic Server choose(Object key) {return choose(getLoadBalancer(), key);}@Overridepublic void initWithNiwsConfig(IClientConfig clientConfig) {// TODO Auto-generated method stub}
}

Ribbon负载均衡策略-3相关推荐

  1. spring cloud中通过配置文件自定义Ribbon负载均衡策略

    2019独角兽企业重金招聘Python工程师标准>>> spring cloud中通过配置文件自定义Ribbon负载均衡策略 博客分类: 微服务 一.Ribbon中的负载均衡策略 1 ...

  2. 【云原生微服务八】Ribbon负载均衡策略之WeightedResponseTimeRule源码剖析(响应时间加权)

    文章目录 一.前言 二.WeightedResponseTimeRule 1.计算权重? 1)如何更新权重? 2)如何计算权重? 3)例证权重的计算 2.权重的使用 1)权重区间问题? 一.前言 前置 ...

  3. Ribbon负载均衡策略配置

    在这里吐槽一句:网上很多文章真是神坑,你不看还好,看了只会问题越来越多,就连之前的问题都没有解决!!! 不多说了,Ribbon作为后端负载均衡器,比Nginx更注重的是请求分发而不是承担并发,可以直接 ...

  4. Ribbon负载均衡策略初步解读

    1.接口实现结构图 此图参考(https://blog.csdn.net/qq_31489805/article/details/80341200) 2.ribbon的几种负载均衡原则 RandomR ...

  5. SpringCloud组件:Ribbon负载均衡策略及执行原理!

    大家好,我是磊哥. 今天我们来看下微服务中非常重要的一个组件:Ribbon.它作为负载均衡器在分布式网络中扮演着非常重要的角色. 本篇主要内容如下: 在介绍 Ribbon 之前,不得不说下负载均衡这个 ...

  6. Ribbon负载均衡策略

    目录 1.基于Ribbon方式的负载均衡,Netflix默认提供了七种负载均衡策略, 2. @LoadBalanced 1.基于Ribbon方式的负载均衡,Netflix默认提供了七种负载均衡策略, ...

  7. ribbon负载均衡策略详解

    一,IRule接口 IRule接口定义了选择负载均衡策略的基本操作.通过调用choose()方法,就可以选择具体的负载均衡策略. // 选择目标服务节点 Server choose(Object va ...

  8. Ribbon负载均衡策略、懒加载及饥饿加载

    目录 一.负载均衡概述 二.负载均衡策略 三.懒加载及饥饿加载 一.负载均衡概述 在业务初期,我们一般会先使用单台服务器对外提供服务.随着业务流量越来越大,单台服务器无论如何优化,无论采用多好的硬件, ...

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

    官方文档指出:自定义的负载均衡配置类不能放在 @componentScan 所扫描的当前包下及其子包下,否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,也就是说我们达不到特殊化定制的目 ...

最新文章

  1. MIT:机器学习预测2018世界杯冠军
  2. Service应用场景分析
  3. Android Volley彻底解决(三),定制自己Request
  4. 软件开发依据的标准或法律法规_第178篇丨直真科技:官宣!定制软件开发不应该采用完工百分比法确认收入...
  5. python android自动化元素定位_linux下Appium+Python移动应用自动化测试实战---3.手把手教你定位元素编写测试用例...
  6. 成功解决AttributeError: 'map' object has no attribute 'items'
  7. 使用.NET Core与Google Optimization Tools实现加工车间任务规划
  8. 设计即开发,如何打通软件研发的“任督二脉”?
  9. ArrayAdapter requires the resource ID to be a TextView错误
  10. 主引导扇区(MBR)释疑
  11. Java反射常见面试题
  12. 科研必备:LaTeX论文排版软件的简介,安装与使用教程
  13. Hello CSDN blog
  14. laravel的seeder数据填充
  15. 【AI视野·今日CV 计算机视觉论文速览 第225期】Wed, 23 Jun 2021
  16. HBase环境搭建与基本使用(保姆级教程)
  17. vue输入框禁止输入表情的实现方法
  18. 修改Ubuntu时区
  19. fiddler模拟伪造请求
  20. LabVIEW 严格类型VI

热门文章

  1. opencv计算视频和摄像头的帧数及帧率(FPS)
  2. 上半年阅读笔记——想成为优秀的程序员
  3. 第十三届蓝桥杯A组省赛填空程序真题集
  4. 电商试水“先白拿后付费” 大数据筛选信用买家
  5. 九宫格的填法和数独的验证
  6. Nginx转发ssh服务
  7. FleaPHP 域名事件搞笑版 1
  8. SparkListener监听机制使用及自定义事件处理
  9. antlr v4 使用指南连载4——词法规则入门之黄金定律
  10. 飞凌嵌入式RK3399开发板人工智能为广告机赋能