Ribbon中的IRule
负载均衡器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相关推荐
- Sharepoint学习笔记—Ribbon系列-- 5. 在Ribbon中添加新控件(针对用户自定义Tab)
前面我们实现了向用户自定义的Tab中添加新的Group,并向其中创建了两个Button按钮.这里我们看看如何向这个已经创建好的Group中再另外添加新的Button控件(当然,你可以添加其它控件,实现 ...
- Sharepoint学习笔记—Ribbon系列-- 2. 在Ribbon中添加新Tab
有了上面的基础,我们来看看如何向Sharepoint网站的Ribbon中添加我们定义的Tab. 直接进入操作步骤 一.创建 SharePoint 项目 要添加新选项卡,应首先创建一个空白 ShareP ...
- Spring Clould负载均衡重要组件:Ribbon中重要类的用法
Ribbon是Spring Cloud Netflix全家桶中负责负载均衡的组件,它是一组类库的集合.通过Ribbon,程序员能在不涉及到具体实现细节的基础上"透明"地用到负载均衡 ...
- Sharepoint学习笔记—Ribbon系列-- 3.在Ribbon中找到正确的Location
如果我们想要自定义Sharepoint的Ribbon,向其中增,删,改各种元素(Tab,Group,Controls),我们就必须要正确定位我们的操作.Ribbon就像一个靶子,我们的操作只有打向了正 ...
- SpringCloud Ribbon中的7种负载均衡策略!
作者 | 磊哥 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 负载均衡通器常有两种实现手段,一种是服务端负载均衡器,另一种是客户端负载均衡器,而 ...
- 浅谈Fluent Ribbon 中的SplitButton
Fluent Ribbon Control Suite 就不做介绍了,网上的例子比较多,类似Office2007及以后版本的图形界面(菜单栏).官网地址:https://github.com/flue ...
- Spring Cloud Ribbon 中的 7 种负载均衡策略
负载均衡通器常有两种实现手段,一种是服务端负载均衡器,另一种是客户端负载均衡器,而我们今天的主角 Ribbon 就属于后者--客户端负载均衡器. 服务端负载均衡器的问题是,它提供了更强的流量控制权,但 ...
- Ribbon中的负载均衡算法实现
Ribbon响应时间权重负载均衡算法,假设有3台服务器A,B,C响应时间为10,40,80ms. 算法公式:weighsofar + 总响应时长- 本服务器平均响应时长 A:0+130-10=120 ...
- 3.springcloud中使用Ribbon和Feign调用服务以及服务的高可用
1.消费者使用Ribbon组件负载均衡的调用服务者接口 在上一节中只介绍了如何将服务者和消费者注册到Eureka注册中心中,消费者并没有调用服务者,现在开始介绍,首先为了避免混淆,不再用上一节的消费者 ...
最新文章
- as无效 mysql_MySQL 全文索引实现简单版搜索引擎
- 记一次线上偶现的循环依赖问题
- java pdf添加图片_java实现在pdf模板的指定位置插入图片
- c++ 虚继承与继承的差异
- idea 运行单个main方法_IntelliJ IDEA 运行你的第一个Java应用程序 idea运行main方法
- 前端学习(1658):前端系列实战课程之图片延迟加载思路
- 使用IPMI工具实现对服务器的远程管理
- linux网卡ip自动启动不了怎么办,Linux杂谈:解决配置静态ip后eth0网卡启动不了的问题...
- linux MySQL5.7 rpm安装
- 2021年3月勒索病毒流行态势分析
- js实现城市拼音首字母排序
- java课程设计员工信息管理系统,javaweb课程设计之员工信息管理系统
- 盘点17个能帮助企业运营完美服务的AI聊天机器人
- cmos逻辑门传输延迟时间_什么是TTL电平、CMOS电平?区别是什么?
- 红包雨架构设计---1、技术架构
- 文本域中只允许输入特定长度的字符
- 将BMP图片转换成ICON图标
- 机器学习之密度聚类算法
- 西安互联网公司防坑指南
- 【微机原理大作业】从0开始设计RTC电子钟系统(三)(含完整源码和仿真图及下载地址)