多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
### 加权随机(Weight Random)法 与加权轮询法类似,加权随机法也根据后端服务器不同的配置和负载情况,配置不同的权重。不同的是,它是按照权重来随机选取服务器的,而非顺序 ``` /** * 实现方法一 */ public static String testWeightRandom() { // 重新创建一个 map,避免出现由于服务器上线和下线导致的并发问题 Map<String, Integer> serverMap = new HashMap<>(); serverMap.putAll(serverWeightMap); // 取得 IP 地址 list Set<String> keySet = serverMap.keySet(); Iterator<String> it = keySet.iterator(); List<String> serverList = new ArrayList<>(); while (it.hasNext()) { String server = it.next(); Integer weight = serverMap.get(server); for (int i = 0; i < weight; i++) { serverList.add(server); } } Random random = new Random(); int randomPos = random.nextInt(serverList.size()); String server = serverList.get(randomPos); return server; } /** * 实现方法二 */ public static String testWeightRandom() { // 重新创建一个 map,避免出现由于服务器上线和下线导致的并发问题 Map<String, Integer> serverMap = new HashMap<>(); serverMap.putAll(serverWeightMap); // 计算权重和 long weightSum = 0; for (String key : serverMap.keySet()) { weightSum += serverMap.get(key); } // 产生随机数 long random = Math.round(Math.random() * weightSum); long weight = 0; for (String server : serverMap.keySet()) { weight += serverMap.get(server); if (weight >= random) { return server; } } return serverMap.keySet().iterator().next(); } ```