【笔记】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

	  }


}


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

posted @ 2020-08-03 00:38  杨不易呀  阅读(152)  评论(0编辑  收藏  举报