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

要求自定义的算法:依旧是轮询策略,但是每个服务器被调用5次后轮到下一个服务,即以前是每个服务被调用1次,现在是每个被调用5次。

打开消费者工程:

1、自定义算法类必须继承 AbstractLoadBalanceRule 类

启动类在com.bruce.springcloud 包下,所以我们新建一个包: con.bruce.myrule,并在该包下新建一个类:CustomeRule

public class CustomeRule extends AbstractLoadBalancerRule
{/*total = 0 // 当total==5以后,我们指针才能往下走,index = 0 // 当前对外提供服务的服务器地址,total需要重新置为零,但是已经达到过一个5次,我们的index = 1*/private int total = 0;             // 总共被调用的次数,目前要求每台被调用5次private int currentIndex = 0;    // 当前提供服务的机器号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) {return null;}//int index = rand.nextInt(serverCount);//server = upList.get(index);if(total < 5){server = upList.get(currentIndex);total++;}else {total = 0;currentIndex++;if(currentIndex >= upList.size()){currentIndex = 0;}}if (server == null) {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;}@Overridepublic Server choose(Object key) {return choose(getLoadBalancer(), key);}@Overridepublic void initWithNiwsConfig(IClientConfig clientConfig) {}
}

2、配置类中增加自定义规则

@Configuration
public class ConfigBean
{@Bean@LoadBalanced //Ribbon 是客户端负载均衡的工具;public RestTemplate getRestTemplate(){return new RestTemplate();}@Beanpublic IRule myRule(){return new CustomeRule(); //自定义负载均衡规则}
}

3、主启动类添加 @RibbonClient 注解,name和configuration参数很重要;

在启动该微服务的时候就能去加载我们自定义的Ribbon配置类,从而使配置生效:

@RibbonClient(name=“microservicecloud-dept”, configuration=ConfigBean.class)

name指定针对哪个服务 进行负载均衡,而configuration指定负载均衡的算法具体实现类。

4、测试

启动该消费者服务,然后访问:http://localhost/consumer/dept/get/1,可以看到先访问生产者1服务5次,然后访问生产者2服务5次…

自定义Ribbon负载均衡策略相关推荐

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

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

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

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

  3. ribbon负载均衡策略详解

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

  4. Ribbon负载均衡策略-3

    Ribbon负载均衡策略-3 常用策略 1.RoundRobinRule 轮转调度策略 2.RetryRule重试规律策略 3.RandomRule随机策略 Ribbon的负载均衡策略是由IRule接 ...

  5. Ribbon负载均衡策略配置

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

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

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

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

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

  8. Ribbon负载均衡策略

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

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

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

最新文章

  1. php 字符串处理
  2. 剑指offerpython_剑指offer系列python实现 日更(一)
  3. Spring Boot 应用程序启动流程分析
  4. ANSYS Products 19.1 安装教程
  5. Jmeter性能测试-GC相关
  6. replugin源码解析之replugin-plugin-gradle(插件的gradle插件)
  7. 《cocos2d-x手机游戏开发实战》直播课程第一期介绍
  8. PHP中Cookie的使用
  9. pandoc epub_使用Pandoc将您的书变成网站和ePub
  10. Windows一些操作
  11. blog推荐 - Sources of Insight
  12. html自动旋转屏幕,求教!HTML5屏幕旋转90度再让画布自适应,该如何做,大神给留demo...
  13. 右键菜单 GenericMenu
  14. Python编程基础 一张图认识Python
  15. Axure8授权激活码
  16. GPRS网络继电器SAC07GSA评估套件使用心得
  17. DOM drag 事件
  18. cpu和显卡瓶颈测试软件,CPU与GPU瓶颈的详述
  19. EasyUI使用基础教程
  20. 压力传感器故障检测方法

热门文章

  1. algodoo 搭建二维物理引擎 写代码进行物理实验 让代码运行在可视的物理环境中
  2. C语言基于单链表的班级通讯录(VS2019)
  3. 软件测试基础知识之黑盒测试-因果图法
  4. 第3章 为Jenkins添加静态agent节点
  5. Modbus和Modbus Rtu和Modbus tcp
  6. 淘宝运营转抖音直播卖衣服,我会不断努力不断进步 #播动师
  7. 初三同学的选择——上职高是否可行?
  8. openocd目录_跟我一起学OpenOCD(一)
  9. vue.js基础学习(数组更新)
  10. vue 数组对象更新