diff --git a/src/main/java/com/loadcenter/gateway/model/WorkGatewayNode.java b/src/main/java/com/loadcenter/gateway/model/WorkGatewayNode.java index 7529825..19614da 100644 --- a/src/main/java/com/loadcenter/gateway/model/WorkGatewayNode.java +++ b/src/main/java/com/loadcenter/gateway/model/WorkGatewayNode.java @@ -18,6 +18,6 @@ public class WorkGatewayNode { /** * 分数 */ - private Double source; + private int weight; } diff --git a/src/main/java/com/loadcenter/service/impl/GatewayLoadServiceImpl.java b/src/main/java/com/loadcenter/service/impl/GatewayLoadServiceImpl.java index b79c448..664e0ab 100644 --- a/src/main/java/com/loadcenter/service/impl/GatewayLoadServiceImpl.java +++ b/src/main/java/com/loadcenter/service/impl/GatewayLoadServiceImpl.java @@ -137,12 +137,12 @@ public class GatewayLoadServiceImpl implements GatewayLoadService { //空余连接数 Long vehicleOnlineNum = vehicleMaxOnlineNum - vehicleNowOnlineNum; - List loadNodeList =new ArrayList<>(); + List loadNodeList = new ArrayList<>(); List workGatewayNodeSources = workGatewayNodes.stream() .map(workGatewayNode -> WorkGatewayNodeSource.builder() .nodeId(workGatewayNode.getNodeId()) - .weight(Integer.parseInt(String.valueOf(vehicleOnlineNum / (nodeMaxNum - workGatewayNode.getSource())))) + .weight(Integer.parseInt(String.valueOf(vehicleOnlineNum / (nodeMaxNum - workGatewayNode.getWeight())))) .build()) .toList(); // 计算节点列表中所有节点的权重之和 @@ -164,7 +164,8 @@ public class GatewayLoadServiceImpl implements GatewayLoadService { } } // 当所有节点权重为0时,跳出循环 - whFor:while (true) { + whFor: + while (true) { // 遍历节点列表,将权重大于0的节点ID添加到loadNodeList中,并将节点权重减1 for (WorkGatewayNodeSource workGatewayNodeSource : workGatewayNodeSources) { int weight = workGatewayNodeSource.getWeight(); @@ -187,7 +188,7 @@ public class GatewayLoadServiceImpl implements GatewayLoadService { } /** - * 动态ECS + * 动态ECS */ public void dynamicEcs() throws Exception { //上线最大数量 @@ -196,15 +197,15 @@ public class GatewayLoadServiceImpl implements GatewayLoadService { Long vehicleOnlineNowNum = gatewayNodeScoreCache.getNodeNowNum(); BigDecimal loadRate = new BigDecimal(vehicleMaxOnlineNum).divide(new BigDecimal(vehicleOnlineNowNum), 0, BigDecimal.ROUND_HALF_UP); - log.info("负载率:[{}]",loadRate); + log.info("负载率:[{}]", loadRate); ArrayList nodeList = gatewayZSetNodeCache.get(); - if(loadRate.longValue()>=80L){ + if (loadRate.longValue() >= 80L) { //调用扩容逻辑 log.info("负载过高,开始扩容"); String instanceId = aliYunEcsService.RunInstances(); - log.info("扩容的节点是:[{}]",instanceId); + log.info("扩容的节点是:[{}]", instanceId); //休眠5秒确保新实例创建完成 Thread.sleep(5000); @@ -219,11 +220,37 @@ public class GatewayLoadServiceImpl implements GatewayLoadService { gatewayNodeCache.put(gatewayNodeInfo); - gatewayZSetNodeCache.put(instancesInformation.getPublicIpAddress(),0); + gatewayZSetNodeCache.put(instancesInformation.getPublicIpAddress(), 0); log.info("实例id和公网ip存入redis"); - }else if (loadRate.longValue()<20L){ + } else if (loadRate.longValue() < 20L) { + if (nodeList.size() > 2) { + log.info("负载率:[{}]", loadRate); + log.info("负载为:[{]]过低,开始缩容", loadRate.longValue()); + + WorkGatewayNode minConnectionNode = null; + int minConnections = Integer.MAX_VALUE; + + for (WorkGatewayNode node : nodeList) { + int nodeConnections = node.getWeight(); + if (nodeConnections < minConnections) { + minConnections = nodeConnections; + minConnectionNode = node; + } + } + + // minConnectionNode 现在存储了连接数最少的节点 + log.info("连接数最少的节点为:[{}]", minConnectionNode.getNodeId()); + + //先删除zSet,不让车连接 + gatewayZSetNodeCache.remove(minConnectionNode.getNodeId()); + + GatewayNodeInfo gatewayNodeInfo = gatewayNodeCache.get(minConnectionNode.getNodeId()); + log.info("删除节点:[{}]",gatewayNodeInfo.getNodeId()); + + + } } }