Ribbon负载均衡策略-3
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相关推荐
- spring cloud中通过配置文件自定义Ribbon负载均衡策略
2019独角兽企业重金招聘Python工程师标准>>> spring cloud中通过配置文件自定义Ribbon负载均衡策略 博客分类: 微服务 一.Ribbon中的负载均衡策略 1 ...
- 【云原生微服务八】Ribbon负载均衡策略之WeightedResponseTimeRule源码剖析(响应时间加权)
文章目录 一.前言 二.WeightedResponseTimeRule 1.计算权重? 1)如何更新权重? 2)如何计算权重? 3)例证权重的计算 2.权重的使用 1)权重区间问题? 一.前言 前置 ...
- Ribbon负载均衡策略配置
在这里吐槽一句:网上很多文章真是神坑,你不看还好,看了只会问题越来越多,就连之前的问题都没有解决!!! 不多说了,Ribbon作为后端负载均衡器,比Nginx更注重的是请求分发而不是承担并发,可以直接 ...
- Ribbon负载均衡策略初步解读
1.接口实现结构图 此图参考(https://blog.csdn.net/qq_31489805/article/details/80341200) 2.ribbon的几种负载均衡原则 RandomR ...
- SpringCloud组件:Ribbon负载均衡策略及执行原理!
大家好,我是磊哥. 今天我们来看下微服务中非常重要的一个组件:Ribbon.它作为负载均衡器在分布式网络中扮演着非常重要的角色. 本篇主要内容如下: 在介绍 Ribbon 之前,不得不说下负载均衡这个 ...
- Ribbon负载均衡策略
目录 1.基于Ribbon方式的负载均衡,Netflix默认提供了七种负载均衡策略, 2. @LoadBalanced 1.基于Ribbon方式的负载均衡,Netflix默认提供了七种负载均衡策略, ...
- ribbon负载均衡策略详解
一,IRule接口 IRule接口定义了选择负载均衡策略的基本操作.通过调用choose()方法,就可以选择具体的负载均衡策略. // 选择目标服务节点 Server choose(Object va ...
- Ribbon负载均衡策略、懒加载及饥饿加载
目录 一.负载均衡概述 二.负载均衡策略 三.懒加载及饥饿加载 一.负载均衡概述 在业务初期,我们一般会先使用单台服务器对外提供服务.随着业务流量越来越大,单台服务器无论如何优化,无论采用多好的硬件, ...
- 自定义Ribbon负载均衡策略
官方文档指出:自定义的负载均衡配置类不能放在 @componentScan 所扫描的当前包下及其子包下,否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,也就是说我们达不到特殊化定制的目 ...
最新文章
- MIT:机器学习预测2018世界杯冠军
- Service应用场景分析
- Android Volley彻底解决(三),定制自己Request
- 软件开发依据的标准或法律法规_第178篇丨直真科技:官宣!定制软件开发不应该采用完工百分比法确认收入...
- python android自动化元素定位_linux下Appium+Python移动应用自动化测试实战---3.手把手教你定位元素编写测试用例...
- 成功解决AttributeError: 'map' object has no attribute 'items'
- 使用.NET Core与Google Optimization Tools实现加工车间任务规划
- 设计即开发,如何打通软件研发的“任督二脉”?
- ArrayAdapter requires the resource ID to be a TextView错误
- 主引导扇区(MBR)释疑
- Java反射常见面试题
- 科研必备:LaTeX论文排版软件的简介,安装与使用教程
- Hello CSDN blog
- laravel的seeder数据填充
- 【AI视野·今日CV 计算机视觉论文速览 第225期】Wed, 23 Jun 2021
- HBase环境搭建与基本使用(保姆级教程)
- vue输入框禁止输入表情的实现方法
- 修改Ubuntu时区
- fiddler模拟伪造请求
- LabVIEW 严格类型VI