当前位置:   article > 正文

java 带权重轮询算法

java 带权重轮询算法

java 带权重轮询算法

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. /**
  4. * 一个实现加权轮询算法的类。
  5. */
  6. class WeightedRoundRobin {
  7. // 保存权重的服务器节点列表
  8. private volatile List<ServerNode> serverNodes = new ArrayList<>();
  9. /**
  10. * 添加一个服务器节点到列表中。
  11. *
  12. * @param serverNode 要添加的服务器节点
  13. */
  14. public void addServer(ServerNode serverNode) {
  15. serverNodes.add(serverNode);
  16. }
  17. /**
  18. * 根据当前权重轮询选择一个服务器节点。
  19. *
  20. * @return 返回被选中的服务器节点
  21. */
  22. public ServerNode getNextServer() {
  23. int totalWeight = 0; // 记录所有节点的总权重
  24. ServerNode maxServerNode = null; // 用于保存当前权重最大的节点
  25. if (null == serverNodes || serverNodes.isEmpty()) {
  26. return maxServerNode;
  27. }
  28. int maxWeight = 0; // 记录当前发现的最大权重
  29. // 遍历所有服务器节点,更新它们的当前权重,并找出当前权重最大的节点
  30. for (int i = 0; i < serverNodes.size(); i++) {
  31. ServerNode n = serverNodes.get(i);
  32. totalWeight += n.getWeight();
  33. // 更新节点的当前权重
  34. n.setCurrentWeight(n.getCurrentWeight() + n.getWeight());
  35. // 比较并保存当前权重最大的节点
  36. if (maxServerNode == null || maxWeight < n.getCurrentWeight()) {
  37. maxServerNode = n;
  38. maxWeight = n.getCurrentWeight();
  39. }
  40. }
  41. // 被选中的节点权重减掉总权重,为下一次选择做准备
  42. maxServerNode.setCurrentWeight(maxServerNode.getCurrentWeight() - totalWeight);
  43. return maxServerNode;
  44. }
  45. /**
  46. * 适合单个请求
  47. *
  48. * @return
  49. */
  50. public ServerNode random() {
  51. if (null == serverNodes || serverNodes.isEmpty()) {
  52. return null;
  53. }
  54. ArrayList<ServerNode> data = new ArrayList<>();
  55. for (int i = 0; i < serverNodes.size(); i++) {
  56. int weight = serverNodes.get(i).getWeight();
  57. for (int j = 0; j < weight; j++) {
  58. data.add(serverNodes.get(i));
  59. }
  60. }
  61. if (data.isEmpty()) {
  62. return null;
  63. }
  64. int index = new Random().nextInt(data.size());
  65. return data.get(index);
  66. }
  67. }
  68. /**
  69. * 表示一个服务器节点的类。
  70. */
  71. class ServerNode {
  72. // 初始权重,不会改变
  73. private final int weight;
  74. // 服务器名称
  75. private final String serverName;
  76. // 当前权重,可变
  77. private int currentWeight;
  78. /**
  79. * 构造一个服务器节点。
  80. *
  81. * @param serverName 服务器名称
  82. * @param weight 初始权重
  83. */
  84. public ServerNode(String serverName, int weight) {
  85. this.weight = weight;
  86. this.serverName = serverName;
  87. this.currentWeight = weight;
  88. }
  89. // 以下是一些getter和setter方法,用于访问类的属性
  90. public int getCurrentWeight() {
  91. return currentWeight;
  92. }
  93. public void setCurrentWeight(int currentWeight) {
  94. this.currentWeight = currentWeight;
  95. }
  96. public int getWeight() {
  97. return weight;
  98. }
  99. public String getServerName() {
  100. return serverName;
  101. }
  102. }
  103. /**
  104. * 测试类,用于演示加权轮询算法的使用。
  105. */
  106. class Test {
  107. public static void main(String[] args) {
  108. // 创建并配置三个服务器节点
  109. ServerNode serverA = new ServerNode("serverA", 4);
  110. ServerNode serverB = new ServerNode("serverB", 3);
  111. ServerNode serverC = new ServerNode("serverC", 2);
  112. // 创建加权轮询对象,并添加服务器节点
  113. WeightedRoundRobin weightedRoundRobin = new WeightedRoundRobin();
  114. weightedRoundRobin.addServer(serverA);
  115. weightedRoundRobin.addServer(serverB);
  116. weightedRoundRobin.addServer(serverC);
  117. // 进行9次选择,演示加权轮询算法的工作过程
  118. for (int i = 0; i < 9; i++) {
  119. ServerNode i1 = weightedRoundRobin.getNextServer();
  120. System.out.println(i1.getServerName());
  121. }
  122. }
  123. }

单次随机使用random方法

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/289100
推荐阅读
相关标签
  

闽ICP备14008679号