zoukankan      html  css  js  c++  java
  • 【笔记】Ribbon负载均衡伪随机算法

    伪随机:思路 当一个下标(伪服务)连接被调用两次,第三次如果还是它,就让再随机一次

    当重复随机到一台服务两次时判断第三次是否还是它 是的话 我们要进行 再次随机 也就是第三次

    package top.yangbuyi.Rule;
    
    /**
     * @description: 杨不易网站:www.yangbuyi.top
     * @program: yangbuyispringcloudparent
     * @ClassName: yangbuyi_Rule
     * @create: 2020-08-02 23:30
     * @author: yangbuyi
     * @since: JDK1.8
     * @yangbuyi_Rule: 随机 负载均衡
     **/
    
    public class yangbuyiRule extends AbstractLoadBalancerRule {
    
    	  /**
    	   * 开始下标
    	   */
    	  private int nowIndex = -1;
    	  /**
    	   * 最后的下标
    	   */
    	  private int lastIndex = -1;
    	  /**
    	   * 记录要跳过 的记录数 (上一次的下标等于当前的下标 表示要跳过的下标)
    	   */
    	  private int skipIndex = -1;
    
    
    	  /**
    	   * 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 upList = lb.getReachableServers();
    				  // 获取全部服务列表
    				  List 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;
    				  }
    
    				  /*
    				   * 伪随机:思路 当重复随机到一台服务两次时判断第三次是否还是它  是的话  我们要进行 再次随机 也就是第三次
    				   * 当一个下标(伪服务)连接被调用两次
    				   * 第三次如果还是它,就让再随机一次
    				   * */
    
    				  // 随机一次  获取一个在serverCount范围内的随机数
    				  int index = chooseRandomInt(serverCount);
    
    				  // 要不要跳过 表示跳过的条件
    				  if (index == skipIndex) { // 1,1,1
    						System.out.println("要重新随机");
    						index = chooseRandomInt(serverCount);
    						// 清空 跳过记录值
    						skipIndex = -1;
    				  }
    
    				  // 要进行记录当前的下标
    				  nowIndex = index;
    				  if (lastIndex == nowIndex) {
    						// 如果 上一次的角标 等于  当前角标 就要 跳过了
    						skipIndex = nowIndex; // skipIndex = 1
    				  }
    				  // 记录 上一次的下标
    				  lastIndex = nowIndex;
    
    
    				  // 从可用的微服务列表中,获取随机的微服务出来
    				  server = upList.get(index);
    
    				  if (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;
    				  }
    
    				  if (server.isAlive()) {
    						return (server);
    				  }
    
    				  // Shouldn't actually happen.. but must be transient or a bug.
    				  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
    
    	  }
    
    
    }
    


    你的压力源于无法自律,只是假装努力,现状跟不上你内心的欲望,所以你焦急又恐慌---杨不易

  • 相关阅读:
    POJ1296
    BZOJ1003
    POJ1160
    中国剩余定理(转)
    组合数公式
    网络操作系统*习题
    网络操作系统*习题
    网络操作系统习题
    网络操作系统习题
    Access总结
  • 原文地址:https://www.cnblogs.com/Yangbuyi/p/13424071.html
Copyright © 2011-2022 走看看