负载均衡器Ribbon中的IRule负责选择什么样的负载均衡算法

源码中IRule的接口

package com.netflix.loadbalancer;/**- Interface that defines a "Rule" for a LoadBalancer. A Rule can be thought of- as a Strategy for loadbalacing. Well known loadbalancing strategies include- Round Robin, Response Time based etc.- - @author stonse- */
public interface IRule{/** choose one alive server from lb.allServers or* lb.upServers according to key* * @return choosen Server object. NULL is returned if none*  server is available */public Server choose(Object key);public void setLoadBalancer(ILoadBalancer lb);public ILoadBalancer getLoadBalancer();
}

该接口的实现类有

  • RoundRobinRule:轮询(默认)
  • RandomRule:随机
  • RetryRule:重试(先按照轮询规则获取服务,如果获取服务失败则在指定时间内进行重试)

如果修改规则为源码中的其他规则吗可以在配置类中注入相应的Bean

demo

package com.mark.config;import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.springcloud.MyRandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** Created by Choisaaaa on 2018/7/9.* 自定义的轮询算法的配置类*/
@Configuration
public class MyRuleConfig {@Bean //修改轮询规则为随机public IRule iRule(){return new RandomRule();}
}

随机规则RandomRule源码中的choose方法

    /*** Randomly choose from all living servers*/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 = rand.nextInt(serverCount);server = upList.get(index);//从存活的列表中获取serverif (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;//调到下一次循环(server == null)会为真继续进入while循环}if (server.isAlive()) { //如果服务实例是存活的则返回该服务实例return (server);}// Shouldn't actually happen.. but must be transient or a bug.server = null;Thread.yield();}return server;}

编写自定义的轮询规则

1.编写自定义的轮写规则类(该类不能和主程序类在同一层目录结构或者在子包下)
demo

package com.springcloud;import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;import java.util.List;
import java.util.Random;/*** Created by Choisaaaa on 2018/7/9.* 自定义随机算法** 一个服务实例server 用3次  在轮询选择下一个server*/
public class MyRandomRule extends AbstractLoadBalancerRule {Random rand;public MyRandomRule() {rand = new Random();}/*** Randomly choose from all living servers*/public Server choose(ILoadBalancer lb, Object key) {//重写该方法}@Overridepublic Server choose(Object key) {return choose(getLoadBalancer(), key);}@Overridepublic void initWithNiwsConfig(IClientConfig clientConfig) {// TODO Auto-generated method stub}
}

2.编写配置类将自定义的规则类注入到IOC容器中
demo

package com.mark.config;import com.netflix.loadbalancer.IRule;
import com.springcloud.MyRandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** Created by Choisaaaa on 2018/7/9.* 自定义的轮询算法的配置类*/
@Configuration
public class MyRuleConfig {@Bean //注入自定义的负载均衡的算法public IRule iRule(){return new MyRandomRule();}
}

3.修改主程序类
@RibbonClient(name = “PROVIDERPRODUCT”,configuration = MyRuleConfig.class)

@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
//为服务PROVIDERPRODUCT指定自定义的负载均衡算法
@RibbonClient(name = "PROVIDERPRODUCT",configuration = MyRuleConfig.class)
public class ConsumerApplication {

Ribbon中的IRule相关推荐

  1. Sharepoint学习笔记—Ribbon系列-- 5. 在Ribbon中添加新控件(针对用户自定义Tab)

    前面我们实现了向用户自定义的Tab中添加新的Group,并向其中创建了两个Button按钮.这里我们看看如何向这个已经创建好的Group中再另外添加新的Button控件(当然,你可以添加其它控件,实现 ...

  2. Sharepoint学习笔记—Ribbon系列-- 2. 在Ribbon中添加新Tab

    有了上面的基础,我们来看看如何向Sharepoint网站的Ribbon中添加我们定义的Tab. 直接进入操作步骤 一.创建 SharePoint 项目 要添加新选项卡,应首先创建一个空白 ShareP ...

  3. Spring Clould负载均衡重要组件:Ribbon中重要类的用法

    Ribbon是Spring Cloud Netflix全家桶中负责负载均衡的组件,它是一组类库的集合.通过Ribbon,程序员能在不涉及到具体实现细节的基础上"透明"地用到负载均衡 ...

  4. Sharepoint学习笔记—Ribbon系列-- 3.在Ribbon中找到正确的Location

    如果我们想要自定义Sharepoint的Ribbon,向其中增,删,改各种元素(Tab,Group,Controls),我们就必须要正确定位我们的操作.Ribbon就像一个靶子,我们的操作只有打向了正 ...

  5. SpringCloud Ribbon中的7种负载均衡策略!

    作者 | 磊哥 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 负载均衡通器常有两种实现手段,一种是服务端负载均衡器,另一种是客户端负载均衡器,而 ...

  6. 浅谈Fluent Ribbon 中的SplitButton

    Fluent Ribbon Control Suite 就不做介绍了,网上的例子比较多,类似Office2007及以后版本的图形界面(菜单栏).官网地址:https://github.com/flue ...

  7. Spring Cloud Ribbon 中的 7 种负载均衡策略

    负载均衡通器常有两种实现手段,一种是服务端负载均衡器,另一种是客户端负载均衡器,而我们今天的主角 Ribbon 就属于后者--客户端负载均衡器. 服务端负载均衡器的问题是,它提供了更强的流量控制权,但 ...

  8. Ribbon中的负载均衡算法实现

    Ribbon响应时间权重负载均衡算法,假设有3台服务器A,B,C响应时间为10,40,80ms. 算法公式:weighsofar + 总响应时长- 本服务器平均响应时长 A:0+130-10=120 ...

  9. 3.springcloud中使用Ribbon和Feign调用服务以及服务的高可用

    1.消费者使用Ribbon组件负载均衡的调用服务者接口 在上一节中只介绍了如何将服务者和消费者注册到Eureka注册中心中,消费者并没有调用服务者,现在开始介绍,首先为了避免混淆,不再用上一节的消费者 ...

最新文章

  1. as无效 mysql_MySQL 全文索引实现简单版搜索引擎
  2. 记一次线上偶现的循环依赖问题
  3. java pdf添加图片_java实现在pdf模板的指定位置插入图片
  4. c++ 虚继承与继承的差异
  5. idea 运行单个main方法_IntelliJ IDEA 运行你的第一个Java应用程序 idea运行main方法
  6. 前端学习(1658):前端系列实战课程之图片延迟加载思路
  7. 使用IPMI工具实现对服务器的远程管理
  8. linux网卡ip自动启动不了怎么办,Linux杂谈:解决配置静态ip后eth0网卡启动不了的问题...
  9. linux MySQL5.7 rpm安装
  10. 2021年3月勒索病毒流行态势分析
  11. js实现城市拼音首字母排序
  12. java课程设计员工信息管理系统,javaweb课程设计之员工信息管理系统
  13. 盘点17个能帮助企业运营完美服务的AI聊天机器人
  14. cmos逻辑门传输延迟时间_什么是TTL电平、CMOS电平?区别是什么?
  15. 红包雨架构设计---1、技术架构
  16. 文本域中只允许输入特定长度的字符
  17. 将BMP图片转换成ICON图标
  18. 机器学习之密度聚类算法
  19. 西安互联网公司防坑指南
  20. 【微机原理大作业】从0开始设计RTC电子钟系统(三)(含完整源码和仿真图及下载地址)

热门文章

  1. 香橙派OrangePi Zero 装HomeAssistant (一)
  2. mysql描述性统计函数_你知道什么是 MySQL 的模糊查询?
  3. SAP-FICO学习总结(一)
  4. JavaScript 语言
  5. MAC 开不开机的问题
  6. 【MAPBOX基础功能】16、mapbox叠加图片图层到地图上
  7. 2385. 感染二叉树需要的总时间
  8. Sql基础(零基础学数据库_SqlServer版)
  9. Linux 命令 su 和 sudo 的区别
  10. SpringBoot自定义start启动器图文教程(详细)