需要在基包的上一级定义,不然会被扫到如:com.cn.me,要和me同级

然后自定义两个类

DshzsRandomRule类写自己定义的算法,DshzsRule写注入的bean

import com.netflix.loadbalancer.IRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class DshzsRule {

   @Bean
   public IRule myRule(){
       return new DshzsRandomRule();
  }

}
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.concurrent.ThreadLocalRandom;


public class DshzsRandomRule extends AbstractLoadBalancerRule {


   //定义次数
   private int total = 0;

   //定义当前的数量
   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 = chooseRandomInt(serverCount);

           //从可以用的服务中随机获取一个
//           server = upList.get(index);

           if (total<5){
               server = upList.get(currentIndex);
               total++;
          }else {
               total = 0;
               currentIndex++;
               if (currentIndex>=upList.size()){
                   currentIndex = 0;
              }
               server = upList.get(currentIndex);
          }


           if (server == null) {
               Thread.yield();
               continue;
          }

           if (server.isAlive()) {
               return (server);
          }

           server = null;
           Thread.yield();
      }

       return server;

  }

//   protected int chooseRandomInt(int serverCount) {
//       return ThreadLocalRandom.current().nextInt(serverCount);
//   }

@Override
public Server choose(Object key) {
return choose(getLoadBalancer(), key);
}

@Override
public void initWithNiwsConfig(IClientConfig clientConfig) {
// TODO Auto-generated method stub }
}

定义完之后需要在启动类这里加一个注解才能找到你定义的ribbon

@RibbonClient(name = "服务名称", configuration = 你自定义的类(DshzsRule.class))

自定义Ribbon负载均衡的更多相关文章

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

    一.Ribbon中的负载均衡策略 1.Ribbon中支持的负载均衡策略 AvailabilityFilteringRule:过滤掉那些因为一直连接失败的被标记为circuit tripped的后端se ...

  2. Spring Cloud06: Ribbon 负载均衡

    一.使用背景 前面的学习中,我们已经使用RestTemplate来实现了服务消费者对服务提供者的调用,如果在某个具体的业务场景下,对某个服务的调用量突然大幅提升,这个时候就需要对该服务实现负载均衡以满 ...

  3. SpringCloud系列五:Ribbon 负载均衡(Ribbon 基本使用、Ribbon 负载均衡、自定义 Ribbon 配置、禁用 Eureka 实现 Ribbon 调用)

    1.概念:Ribbon 负载均衡 2.具体内容 现在所有的服务已经通过了 Eureka 进行了注册,那么使用 Eureka 注册的目的是希望所有的服务都统一归属到 Eureka 之中进 行处理,但是现 ...

  4. spring-cloud: eureka之:ribbon负载均衡自定义配置(二)

    spring-cloud: eureka之:ribbon负载均衡自定义配置(二) 有默认配置的话基本上就是轮询接口,现在我们改用自定义配置,同时支持:轮询,随机接口读取 准备工作: 1.eureka服 ...

  5. Ribbon负载均衡策略与自定义配置new

    Ribbon负载均衡策略 配置 对调用的某个服务启用某种负载策略 1)通过配置文件配置 hello: ribbon: NFLoadBalancerRuleClassName:com.netflix.l ...

  6. Ribbon负载均衡策略与自定义配置

    Ribbon负载均衡策略 配置 对调用的某个服务启用某种负载策略 1)通过配置文件配置 hello: ribbon: NFLoadBalancerRuleClassName:com.netflix.l ...

  7. Spring Cloud微服务Ribbon负载均衡/Zuul网关使用

    客户端负载均衡,当服务节点出现问题时进行调节或是在正常情况下进行 服务调度.所谓的负载均衡,就是当服务提供的数量和调用方对服务进行 取舍的调节问题,在spring cloud中是通过Ribbon来解决 ...

  8. 【四】Ribbon负载均衡

    1.概述1.1.是什么 Spring Cloud Ribbon 是基于Netflix Ribbon实现的一套客户端负载均衡的工具. 简单的说, Ribbon是Netflix发布的开源项目,主要功能是提 ...

  9. SpringCloud学习(4)——Ribbon负载均衡

    Ribbon概述 SpringCloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡工具. 简单的说, Ribbon是Netflix发布的开源项目, 主要功能是提供客户端软 ...

  10. Ribbon负载均衡(四)

    一.Ribbon定义 spring cloud Ribbon是基于Netflix Ribbon实现的一套客户端,负载均衡工具 简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端 ...

随机推荐

  1. [数据结构]Hash Table(哈希表)

    Hash Table基本概念 散列函数:一个把查找表中的关键字映射成该关键字对应的地址的函数,记为Hash(key)=Addr. 散列函数可能会把两个或者两个以上的关键字映射到同一个地址,称这种情况为 ...

  2. angularIonic CLI环境搭建安装以及栅格响应式布局

  3. java 进阶P-6.2+P-6.3

    细胞自动机 CellularAutomation(细胞自动机)细胞自动机(英语:Cellular automaton),又称格状自动机.元胞自动机,是一种离散模型,在可算性理论.数学及理论生物学都有相 ...

  4. Map集合概述-Map常用子类

    Map集合概述 现实生活中,我们常会看到这样的一种集合︰IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种--对应的关系,就叫做映射.Java提供了专门的集合类用来存放这种对象关系的对 ...

  5. do-while循环-练习_用循环求出1-100之间的耦合数

    do-while循环 do..while循环格式 初始化表达式① do{ 循环体③ 步进表达式④ }while(布尔表达式②); 执行流程 执行顺序:①③④>②③④>②③④-②不满足为止. ...

  6. SpringBoot 三大开发工具,你都用过么?

    本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...

  7. JAVA虚拟机20-基于栈的解释器执行过程示例

    1.准备代码 public int calc() { int a = 100; int b = 200; int c = 300; return (a + b) * c; } 2.使用javap -v ...

  8. JAVA虚拟机16-方法的动态调用

    更详细:https://www.cnblogs.com/jthr/p/15762527.html 1.子类重写父类方法 1.1父类 public class Father { public int n ...

  9. 强大的Excel工具,简便Vlookup函数操作:通用Excel数据匹配助手V2.0

    通用Excel数据匹配助手V2.0 For Windows 通用Excel数据匹配助手是一款非常实用的数据匹配软件,可以用来代替Excel中的Vlookup函数,帮助用户轻松完成数据匹配操作,需要的朋 ...

  10. vue原理:diff、模板编译、渲染过程等

    一.虚拟DOM: 因为DOM操作非常消耗性能,在操作DOM时,会出现DOM的回流(Reflow:元素大小或者位置发生改变)与重绘(元素样式的改变)使DOM重新渲染. 现在的框架Vue和React很少直 ...