master
31353 2024-04-19 21:38:28 +08:00
parent eaeb3f4f26
commit 56d7efe441
16 changed files with 328 additions and 202 deletions

View File

@ -87,6 +87,14 @@
<artifactId>fastjson2</artifactId>
<version>2.0.47</version>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.15.5</version> <!-- 替换为你想要使用的版本 -->
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>

View File

@ -17,6 +17,7 @@ import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author gxb
@ -42,19 +43,27 @@ public class ALYunEcsService {
* @return
*/
public List<InstanceInfo> selectEscList(EcsSelectModel ecsSelectModel){
log.info("当前对象的参数值:" + ecsSelectModel.toString());
DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest()
.setRegionId(aliConfig.getRegionId());
if (ecsSelectModel.getInstanceNameList() == null || (ecsSelectModel.getInstanceIdList() != null && ecsSelectModel.getInstanceIdList().isEmpty())) {
//判断实例名称 == null 或 实例名称 == 空
if (ecsSelectModel.getInstanceNameList().toString() != null) {
//不为空
describeInstancesRequest.setInstanceName(Common.toJSONString(ecsSelectModel.getInstanceNameList()));
} else {
// 为空 加 * 号
describeInstancesRequest.setInstanceName("*");
} else {
describeInstancesRequest.setInstanceName(Common.toJSONString(ecsSelectModel.getInstanceNameList()));
}
if (ecsSelectModel.getInstanceIdList() != null && !ecsSelectModel.getInstanceIdList().isEmpty()) {
describeInstancesRequest.setInstanceIds(Common.toJSONString(ecsSelectModel.getInstanceIdList()).toString());
} else {
describeInstancesRequest.setInstanceName(Common.toJSONString(ecsSelectModel.getInstanceNameList()));
}
if (ecsSelectModel.getInstanceIdList() != null) {
describeInstancesRequest.setInstanceIds(Common.toJSONString(ecsSelectModel.getInstanceIdList()).toString());
}
//else {
// describeInstancesRequest.setInstanceName(Common.toJSONString(ecsSelectModel.getInstanceNameList()));
// }
describeInstancesRequest.setPageSize(10);
RuntimeOptions runtime = new RuntimeOptions();
@ -92,14 +101,18 @@ public class ALYunEcsService {
}
return new ArrayList<>();
}
/**
*
* @throws Exception
*/
public String createAnServers() throws Exception {
public String createAnServer(String isNull) throws Exception {
// 地域Id
//String regionId = "cn-shanghai";
String regionId = aliConfig.getRegionId();
@ -135,13 +148,18 @@ public class ALYunEcsService {
// PostPaid按量付费
//String instanceChargeType = "PostPaid";
String instanceChargeType = aliConfig.getInstanceChargeType();
// 创建 【1台】 实例
if (isNull == null){
String instances = RunInstance(client, regionId, imageId, instanceType, securityGroupId, vSwitchId, internetMaxBandwidthOut, internetChargeType, size, category, instanceChargeType);
return instances; //返回实例ID
}
// 批量创建实例
String instances = RunInstances(client, regionId, imageId, instanceType, securityGroupId, vSwitchId, internetMaxBandwidthOut, internetChargeType, size, category, instanceChargeType);
//返回实例ID
return instances;
}
/**
* 2
* RunInstances ECS
@ -184,52 +202,6 @@ public class ALYunEcsService {
return JSON.toJSONString(responces.body.instanceIdSets.instanceIdSet);
}
/**
* 1
* @param
* @throws Exception
*/
public String createAnServer() throws Exception {
// 地域Id
//String regionId = "cn-shanghai";
String regionId = aliConfig.getRegionId();
// 镜像 ID启动实例时选择的镜像资源。
// String imageId = "m-uf6elrscl3c9wk6o762l";
String imageId = aliConfig.getImageId();
// 实例规格
//String instanceType = "ecs.u1-c1m1.large";
String instanceType = aliConfig.getInstanceType();
// 新创建实例所属于的安全组 ID。
//String securityGroupId = "sg-uf6bj6vxp8ruhvffdsau";
String securityGroupId = aliConfig.getSecurityGroupId();
// 虚拟交换机 ID。
//String vSwitchId = "vsw-uf66jtgij0ptqxf1ix6l7 ";
String vSwitchId = aliConfig.getVSwitchId();
// 公网出带宽最大值,单位为 Mbit/s。取值范围0~100。 默认值0。
//Integer internetMaxBandwidthOut = Integer.parseInt("2");
Integer internetMaxBandwidthOut = Integer.parseInt(aliConfig.getInternetMaxBandwidthOut());
// 网络计费类型。取值范围:
// PayByBandwidth: 按固定带宽计费。
// PayByTraffic: 按使用流量计费。
// 默认值PayByTraffic。
//String internetChargeType = "PayByTraffic";
String internetChargeType = aliConfig.getInternetChargeType();
// 系统盘大小
//String size = "20";
String size = aliConfig.getSize();
// 系统盘的云盘种类
//String category = "cloud_essd";
String category = aliConfig.getCategory();
// ECS实例的计费方式
// PrePaid包年包月
// PostPaid按量付费
//String instanceChargeType = "PostPaid";
String instanceChargeType = aliConfig.getInstanceChargeType();
// 批量创建实例
String instances = RunInstance(client, regionId, imageId, instanceType, securityGroupId, vSwitchId, internetMaxBandwidthOut, internetChargeType, size, category, instanceChargeType);
return instances;
}
/**
* 1
@ -273,6 +245,7 @@ public class ALYunEcsService {
return JSON.toJSONString(responces.body.instanceIdSets.instanceIdSet);
}
public DescribeInstancesResponse DescribeInstances(Client client, String regionId, String instanceIds, String instanceName) throws Exception {
DescribeInstancesRequest req = new DescribeInstancesRequest()
.setRegionId(regionId)

View File

@ -0,0 +1,49 @@
package com.guo.common.constant;
/**
* @author gxb
* @description
* @date 2024-04-19 14:20
*/
public class CacheConstants {
/**
* 50
*/
public final static int EXPIRATIOTIME = 50;
/**
* encode
*/
public final static String GATEWAY_COMMON = "gateway:load:";
/**
*
*/
public final static String GATEWAY_LOAD_NODE_KEY = "node";
/**
*
*/
public final static String GATEWAY_LOAD_SERIES_KEY = "series";
/**
*
*/
public final static String GATE_WAY_NODE_INFO= "gateway:node:info:";
/**
*
*/
public final static String GATEWAY_NODE_SCORE_CACHE = "score";
/**
* VIN
*/
public final static String GATEWAY_VEHICLE= "gateway:vehicle:";
/**
* ID
*/
public final static String GATEWAY_VEHICLE_LINE= "gateway:vehicleLine:";
}

View File

@ -0,0 +1,40 @@
package com.guo.common.constant;
/**
* @author gxb
* @description
* @date 2024-04-19 14:23
*/
public class LoadConstants {
/**
*
*/
public final static Long NODE_LENGTH = 100L;
/**
*
*/
public final static Long MAX_NUMBER = 100L;
/**
*
*/
public final static String IS_NULL = "isNotNull";
/**
* 60%
*/
public final static Long INTERMEDIATE = 60L;
/**
* 80%
*/
public final static Long MAXIMUM = 80L;
/**
* 100
*/
public final static int BE_COMMON = 100;
}

View File

@ -1,5 +1,6 @@
package com.guo.gateway.cache;
import com.guo.common.constant.CacheConstants;
import com.guo.gateway.cache.abs.CacheAbs;
import org.springframework.stereotype.Component;
@ -13,11 +14,10 @@ import java.util.List;
@Component
public class LoadNodeCache extends CacheAbs<String> {
private final static String gatewayLoadNodeKey = "node";
@Override
public String getPre() {
return "gateway:load:";
return CacheConstants.GATEWAY_COMMON;
}
/**
@ -26,9 +26,9 @@ public class LoadNodeCache extends CacheAbs<String> {
*/
public void put(List<String> nodeList){
//删除key
redisService.deleteObject(encode(gatewayLoadNodeKey));
redisService.deleteObject(encode(CacheConstants.GATEWAY_LOAD_NODE_KEY));
//存入节点权重集合
redisService.setCacheList(encode(gatewayLoadNodeKey),nodeList);
redisService.setCacheList(encode(CacheConstants.GATEWAY_LOAD_NODE_KEY),nodeList);
}
/**
@ -36,7 +36,7 @@ public class LoadNodeCache extends CacheAbs<String> {
* @return
*/
public List<String> get(){
return redisService.getCacheList(encode(gatewayLoadNodeKey));
return redisService.getCacheList(encode(CacheConstants.GATEWAY_LOAD_NODE_KEY));
}
/**
@ -48,6 +48,6 @@ public class LoadNodeCache extends CacheAbs<String> {
if (index == null || index > 100){
throw new RuntimeException("下标违法【0 - 100】");
}
return redisService.getCacheListValue(encode(gatewayLoadNodeKey),index);
return redisService.getCacheListValue(encode(CacheConstants.GATEWAY_LOAD_NODE_KEY),index);
}
}

View File

@ -1,5 +1,6 @@
package com.guo.gateway.cache;
import com.guo.common.constant.CacheConstants;
import com.guo.gateway.cache.abs.CacheAbs;
import org.springframework.stereotype.Component;
@ -13,11 +14,9 @@ import javax.annotation.PostConstruct;
@Component
public class LoadSeriesCache extends CacheAbs<String> {
private final static String gatewayLoadSeriesKey = "series";
@Override
public String getPre() {
return "gateway:load:";
return CacheConstants.GATEWAY_COMMON;
}
/**
@ -25,7 +24,7 @@ public class LoadSeriesCache extends CacheAbs<String> {
*/
@PostConstruct
public void init(){
redisService.setCacheObject(encode(gatewayLoadSeriesKey),0);
redisService.setCacheObject(encode(CacheConstants.GATEWAY_LOAD_SERIES_KEY),0);
}
/**
@ -33,7 +32,7 @@ public class LoadSeriesCache extends CacheAbs<String> {
* @return
*/
public Long get(){
return redisService.getCacheObject(encode(gatewayLoadSeriesKey));
return redisService.getCacheObject(encode(CacheConstants.GATEWAY_LOAD_SERIES_KEY));
}
/**
@ -41,7 +40,7 @@ public class LoadSeriesCache extends CacheAbs<String> {
* @return
*/
public Long incrementAndGet(){
return redisService.increment(encode(gatewayLoadSeriesKey),1L);
return redisService.increment(encode(CacheConstants.GATEWAY_LOAD_SERIES_KEY),1L);
}
/**

View File

@ -1,5 +1,6 @@
package com.guo.gateway.cache;
import com.guo.common.constant.CacheConstants;
import com.guo.gateway.cache.abs.CacheAbs;
import com.guo.gateway.model.NodeInfo;
import org.springframework.stereotype.Component;
@ -14,7 +15,7 @@ public class NodeCache extends CacheAbs<String> {
@Override
public String getPre() {
return "gateway:node:info:";
return CacheConstants.GATE_WAY_NODE_INFO;
}
/**

View File

@ -1,5 +1,6 @@
package com.guo.gateway.cache;
import com.guo.common.constant.CacheConstants;
import com.guo.gateway.cache.abs.CacheAbs;
import org.springframework.stereotype.Component;
@ -16,7 +17,7 @@ import java.util.concurrent.TimeUnit;
@Component
public class NodeReduced extends CacheAbs<String> {
private final static int Expiratiotime = 50;
@Override
public String getPre() {
@ -30,7 +31,7 @@ public class NodeReduced extends CacheAbs<String> {
public void put(String nodeId){
Set<String> thresholeSet = new HashSet<>();
thresholeSet.add(nodeId);
redisService.setCacheSetEndTime(encode(nodeId),thresholeSet, TimeUnit.MINUTES,Expiratiotime);
redisService.setCacheSetEndTime(encode(nodeId),thresholeSet, TimeUnit.MINUTES, CacheConstants.EXPIRATIOTIME);
}
/**

View File

@ -1,10 +1,16 @@
package com.guo.gateway.cache;
import com.guo.common.constant.CacheConstants;
import com.guo.gateway.cache.abs.CacheAbs;
import com.guo.gateway.model.NodeJoin;
import com.guo.gateway.model.WorkGatewayNode;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
* @author gxb
@ -14,18 +20,27 @@ import java.util.List;
@Component
public class NodeScoreCache extends CacheAbs<String> {
private final static String gatewayNodeScoreCache = "score";
@Override
public String getPre() {
return "gateway:join:";
return CacheConstants.GATEWAY_COMMON;
}
public List<WorkGatewayNode> getNodeScore(){
Set<ZSetOperations.TypedTuple<String>> range = redisService.redisTemplate.opsForZSet().rangeWithScores(encode(CacheConstants.GATEWAY_NODE_SCORE_CACHE), 0, -1);
return range.stream()
.map(ZSet -> WorkGatewayNode.builder().nodeId(ZSet.getValue()).weight(Integer.valueOf(String.valueOf(ZSet.getScore()))).build())
.toList();
}
/**
* ID
* @param nodeJoin
*/
public void save(NodeJoin nodeJoin){
redisService.setCacheSets(encode(gatewayNodeScoreCache),nodeJoin);
redisService.setCacheSets(encode(CacheConstants.GATEWAY_NODE_SCORE_CACHE),nodeJoin);
}
/**
@ -33,7 +48,7 @@ public class NodeScoreCache extends CacheAbs<String> {
* @return
*/
public List<String> get(){
return redisService.getCacheObject(encode(gatewayNodeScoreCache));
return redisService.getCacheObject(encode(CacheConstants.GATEWAY_NODE_SCORE_CACHE));
}

View File

@ -1,5 +1,6 @@
package com.guo.gateway.cache;
import com.guo.common.constant.CacheConstants;
import com.guo.gateway.cache.abs.CacheAbs;
import com.guo.gateway.model.NodeVehicle;
import org.springframework.stereotype.Component;
@ -14,7 +15,7 @@ public class NodeSetVinCache extends CacheAbs<String> {
@Override
public String getPre() {
return "gateway:vehicle:";
return CacheConstants.GATEWAY_VEHICLE;
}
/**

View File

@ -1,6 +1,7 @@
package com.guo.gateway.cache;
import com.alibaba.fastjson2.JSON;
import com.guo.common.constant.CacheConstants;
import com.guo.gateway.cache.abs.CacheAbs;
import com.guo.gateway.model.NodeVehicle;
import org.springframework.stereotype.Component;
@ -21,7 +22,7 @@ public class VehicleLineNodeCache extends CacheAbs<String> {
@Override
public String getPre() {
return "gateway:vehicleLine:";
return CacheConstants.GATEWAY_VEHICLE_LINE;
}
/**

View File

@ -0,0 +1,26 @@
package com.guo.gateway.model;
import lombok.*;
/**
* @author gxb
* @description
* @date 2024-04-19 14:25
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Builder
public class WorkGatewayNode {
/**
* ID
*/
private String nodeId;
/**
*
*/
private int weight;
}

View File

@ -13,4 +13,9 @@ public interface GateWayLoadService {
*/
String loadNode();
/**
*
*/
void refreshLoad();
}

View File

@ -1,14 +1,19 @@
package com.guo.service.impl;
import com.alibaba.fastjson2.JSONObject;
import com.guo.common.constant.LoadConstants;
import com.guo.gateway.cache.*;
import com.guo.gateway.model.NodeInfo;
import com.guo.gateway.model.NodeJoin;
import com.guo.gateway.model.WorkGatewayNode;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.extern.log4j.Log4j2;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
@ -16,6 +21,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
/**
@ -28,11 +34,6 @@ import java.util.concurrent.atomic.AtomicInteger;
@Log4j2
public class GateWayLoadServicelmpl implements GateWayLoadService {
/**
*
*/
private final Long nodeLength = 100L;
/**
*
*/
@ -63,6 +64,11 @@ public class GateWayLoadServicelmpl implements GateWayLoadService {
*/
private final VehicleLineNodeCache vehicleLineNodeCache;
/**
*
*/
//private final RedissonClient redissonClient;
/**
*
@ -71,31 +77,56 @@ public class GateWayLoadServicelmpl implements GateWayLoadService {
*/
@Override
public String loadNode() {
//初始化序列
loadSeriesCache.reset();
//new一个WorkGatewayNode类的集合
List<WorkGatewayNode> nodeIdList = new ArrayList<>();
//获取缓存内节点信息及连接数
List<String> LinkingValue = nodeScoreCache.get();
//遍历
if (!LinkingValue.isEmpty()) {
for (String nodejoin : LinkingValue) {
//转型
NodeJoin nodeJoin = JSONObject.parseObject(nodejoin, NodeJoin.class);
nodeIdList.add(new WorkGatewayNode(nodeJoin.getNodeId(), nodeJoin.getLinkingNumber().intValue()));
}
//去刷新负载
refreshLoad();
//获取自增序列值
Long seriesLoad = loadSeriesCache.incrementAndGet(); //获取自增序列值
Long seriesLoadIndex = seriesLoad % LoadConstants.NODE_LENGTH;
//获取负载下标
String loadNodeId = loadNodeCache.getFindByIndex(seriesLoadIndex);
//通过获取节点ID
NodeInfo nodeInfo = nodeCache.get(loadNodeId);
//获取缓存内节点的公网/内网信息 返回公网IP
return nodeInfo.getPublicIdAddress();
}
/**
*
*/
@Override
public void refreshLoad() {
//分布式锁
// RLock refreshLoadLock = redissonClient.getLock("refreshLoadLock");
// try {
// 尝试获取锁最多等待10秒持有锁60秒后自动释放
// if (refreshLoadLock.tryLock(10, 60, TimeUnit.SECONDS)) {
// 在锁内执行刷新负载的逻辑
List<WorkGatewayNode> workGatewayNodes = nodeScoreCache.getNodeScore();
//车辆上线总数量
long vehicleMaxOnlineNUm = workGatewayNodes.size() * 80;
//目前连接数
long veicleOnlineNowNum = Long.valueOf(String.valueOf(workGatewayNodes.stream().mapToDouble(WorkGatewayNode::getWeight).sum()));
//空余连接数
long vehicleOnlineNum = vehicleMaxOnlineNUm - veicleOnlineNowNum;
//转换
List<WorkGatewayNode> workGatewayNodeWeight = workGatewayNodes.stream()
.map(workGatewayNode -> WorkGatewayNode.builder()
.nodeId(workGatewayNode.getNodeId())
.weight(Integer.parseInt(String.valueOf(vehicleOnlineNum / (80L - workGatewayNode.getWeight()))))
.build())
.toList();
List<String> loadNodeList = new ArrayList<>();
int count = nodeIdList.stream().mapToInt(WorkGatewayNode::getWeight).sum();
int count = workGatewayNodeWeight.stream().mapToInt(WorkGatewayNode::getWeight).sum();
if (count < 100) {
List<WorkGatewayNode> list = nodeIdList.stream().sorted((o1, o2) -> o2.getWeight() - o1.getWeight()).toList();
List<WorkGatewayNode> list = workGatewayNodeWeight.stream().sorted((o1, o2) -> o2.getWeight() - o1.getWeight()).toList();
int countWeight = 0;
for (long i = count; i < 100; i++) {
@ -106,7 +137,7 @@ public class GateWayLoadServicelmpl implements GateWayLoadService {
whFor:
while (true) {
for (WorkGatewayNode workGatewayNode : nodeIdList) {
for (WorkGatewayNode workGatewayNode : workGatewayNodeWeight) {
int weight = workGatewayNode.getWeight();
if (weight > 0) {
loadNodeList.add(
@ -117,63 +148,50 @@ public class GateWayLoadServicelmpl implements GateWayLoadService {
}
}
int sum = nodeIdList.stream().
int sum = workGatewayNodeWeight.stream().
mapToInt(WorkGatewayNode::getWeight).sum();
if (sum <= 0) {
break whFor;
}
}
//打印负载节点信息
log.info(loadNodeList);
//存负载集合
//重置
loadSeriesCache.reset();
//存负载集合
loadNodeCache.put(loadNodeList);
//获取自增序列值
Long seriesLoad = loadSeriesCache.incrementAndGet(); //获取自增序列值
Long seriesLoadIndex = seriesLoad % nodeLength;
//获取负载下标
String loadNodeId = loadNodeCache.getFindByIndex(seriesLoadIndex);
//通过获取节点ID
NodeInfo nodeInfo = nodeCache.get(loadNodeId);
//获取缓存内节点的公网/内网信息
return nodeInfo.getPublicIdAddress();
//返回公网IP
}
//} catch (InterruptedException e) {
// Thread.currentThread().interrupt();
// 处理中断异常
//} finally {
// 释放锁
// if (refreshLoadLock.isHeldByCurrentThread()) {
// refreshLoadLock.unlock();
//}
}
/**
*
*/
class StiNode {
// 使用 ConcurrentHashMap 保证线程安全
private static final Map<String, AtomicInteger> stiNodeMap = new ConcurrentHashMap<>();
public static void sti(String nodeId) {
// 使用 computeIfAbsent 方法确保原子性操作
stiNodeMap.computeIfAbsent(nodeId, key -> new AtomicInteger()).incrementAndGet();
}
public static Map<String, Long> show() {
Map<String, Long> resultMap = new HashMap<>();
stiNodeMap.forEach((key, val) -> {
resultMap.put(key, (long) val.get());
System.out.println(key + "▷◁▷◁▷◁▷◁▷◁▷◁▷▷◁▷◁▷◁☛☛" + val.get());
});
return resultMap;
}
}
//class StiNode {
// // 使用 ConcurrentHashMap 保证线程安全
// private static final Map<String, AtomicInteger> stiNodeMap = new ConcurrentHashMap<>();
//
// public static void sti(String nodeId) {
// // 使用 computeIfAbsent 方法确保原子性操作
// stiNodeMap.computeIfAbsent(nodeId, key -> new AtomicInteger()).incrementAndGet();
// }
//
// public static Map<String, Long> show() {
// Map<String, Long> resultMap = new HashMap<>();
// stiNodeMap.forEach((key, val) -> {
// resultMap.put(key, (long) val.get());
// System.out.println(key + "--------------" + val.get());
// });
// return resultMap;
// }
//}
/**
* ID
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
class WorkGatewayNode {
private String nodeId;
private int weight;
}

View File

@ -34,11 +34,6 @@ import java.util.List;
@AllArgsConstructor
public class Collection {
/**
*
*/
private final Long nodeLength = 100L;
/**
*
*/
@ -83,6 +78,9 @@ public class Collection {
@Autowired
private ALYunEcsService alYunEcsService;
/**
*
*/
@Scheduled(cron = "0/10 * * * * ?")
public void scheduledEcsCompanding() {
@ -177,7 +175,5 @@ public class Collection {
//调用扩容方法去判断是否需要扩缩容
contractionVolume.contractionVolume(totalNumber);
}
}

View File

@ -1,6 +1,7 @@
package com.guo.task.Contraction;
import com.guo.aly.ALYunEcsService;
import com.guo.common.constant.LoadConstants;
import com.guo.common.model.TotalNumber;
import com.guo.gateway.cache.NodeReduced;
import lombok.AllArgsConstructor;
@ -20,17 +21,6 @@ import java.util.concurrent.TimeUnit;
@Log4j2
public class ContractionVolume {
/**
*
*/
private final static Long Maxnumber = 100L;
/**
* 60%80%
*/
private final static Long Intermediate = 60L;
private final static Long Maximum = 80L;
@Autowired
private ALYunEcsService alYunEcsService;
@ -58,6 +48,7 @@ public class ContractionVolume {
//比较 剩余时间 小于5分钟
if (expire < fiveMinutesSeconds){
//数据迁移 释放节点
}
}
//记录
@ -73,11 +64,11 @@ public class ContractionVolume {
public void contractionVolume(TotalNumber totalNumber){
//特殊情况 无节点
if (totalNumber.getNodeNumber() == 0L){
//无则创建两台实力
// 则创建两台实力
log.error("当前未存在节点信息");
try {
//创建实例方法 【2台】
alYunEcsService.createAnServers();
// alYunEcsService.createAnServer(LoadConstants.IS_NULL);
} catch (Exception e) {
log.error("扩容失败!!!!!");
e.printStackTrace();
@ -88,24 +79,24 @@ public class ContractionVolume {
//调用计算
Long value = this.percentage(totalNumber);
//判断达到60%
if (value >= Intermediate && value < Maximum){
if (value >= LoadConstants.INTERMEDIATE && value < LoadConstants.MAXIMUM){
//当节点负载达到 60%时,调用扩容一台方法
log.info("Node 节点负载达到 " + value + "%,达到扩容一台的条件☑");
try {
//创建实例方法 【1台】
alYunEcsService.createAnServer();
alYunEcsService.createAnServer(null);
} catch (Exception e) {
log.error("扩容失败!!!!!");
e.printStackTrace();
}
}
//判断达到80%
if (value >= Maximum){
if (value >= LoadConstants.MAXIMUM){
//当节点负载达到 80%时,调用扩容一台方法
log.info("Node 节点负载达到 " + value + "%,达到扩容台的条件☑");
log.info("Node 节点负载达到 " + value + "%,达到扩容台的条件☑");
try {
//创建实例方法 【2台】
alYunEcsService.createAnServers();
alYunEcsService.createAnServer(LoadConstants.IS_NULL);
} catch (Exception e) {
log.error("扩容失败!!!!!");
e.printStackTrace();
@ -121,13 +112,15 @@ public class ContractionVolume {
//获取节点数量
Long nodeNumber = totalNumber.getNodeNumber();
//根据nodeNumber去获取最大节点数 默认 100
Long sumNodeNumber = nodeNumber * Maxnumber;
Long sumNodeNumber = nodeNumber * LoadConstants.MAX_NUMBER;
//获取节点连接总数
Long connectionTotal = totalNumber.getConnectionTotal();
//计算空余连接数
Long vacantNumber = sumNodeNumber - connectionTotal;
//计算当前负载情况
double loadPercentage = (double)connectionTotal / sumNodeNumber;
double loadPercentage = (double)vacantNumber / sumNodeNumber;
//进行四舍五入取整
long roundLoadPercentage = Math.round(loadPercentage) * 100;
long roundLoadPercentage = Math.round(loadPercentage) * LoadConstants.BE_COMMON;
//返回百分比
return roundLoadPercentage;
}