12 扩缩容基本实现

master
liuyunhu 2024-04-19 15:19:13 +08:00
parent 0dfd92682c
commit f23d69e410
4 changed files with 94 additions and 71 deletions

View File

@ -69,12 +69,13 @@ public class AliYunEcsService {
.setRegionId(regionId); .setRegionId(regionId);
DescribeInstancesResponse resp = this.client.describeInstances(describeInstancesRequest); DescribeInstancesResponse resp = this.client.describeInstances(describeInstancesRequest);
java.util.List<DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstance> instances = resp.body.instances.instance; java.util.List<DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstance> instances = resp.body.instances.instance;
log.info(regionId + " 下 ECS 实例列表:"); log.info(regionId + " 下 ECS 实例列表:");
//存储结果的List //存储结果的List
ArrayList<String> result = new ArrayList<>(); ArrayList<String> result = new ArrayList<>();
for (DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstance instance : instances) { for (DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstance instance : instances) {
log.info("主机名:" + instance.hostName + " 实例ID" + instance.instanceId + " CPU" + instance.cpu + " 内存:" + instance.memory + " MB 规格:" + instance.instanceType + " 系统:" + instance.OSType + "(" + instance.OSName + ") 状态:" + instance.status); // log.info("主机名:" + instance.hostName + " 实例ID" + instance.instanceId + " CPU" + instance.cpu + " 内存:" + instance.memory + " MB 规格:" + instance.instanceType + " 系统:" + instance.OSType + "(" + instance.OSName + ") 状态:" + instance.status);
result.add(instance.instanceId); result.add(instance.instanceId);
} }

View File

@ -98,7 +98,7 @@ public class HandleCache {
gatewayNodeIdCache.put(ecsIDList); gatewayNodeIdCache.put(ecsIDList);
} catch (Exception e) { } catch (Exception e) {
log.error("获取节点ID失败{}", e.getMessage()); throw new RuntimeException("获取节点ID失败" + e.getMessage());
} }
} }
@ -124,36 +124,37 @@ public class HandleCache {
} }
//将ID进行拼接用逗号分隔 //将ID进行拼接用逗号分隔
String ids = ""; StringBuilder ids = new StringBuilder();
for (String id : ecsIDList) { for (String id : ecsIDList) {
ids += id + ","; ids.append(id).append(",");
} }
ids = ids.substring(0, ids.length() - 1); ids = new StringBuilder(ids.substring(0, ids.length() - 1));
//查询所有ID实例的详细信息 //查询所有ID实例的详细信息
List<DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstance> response = aliYunEcsService.queryInstancesInformation(ids); List<DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstance> response = aliYunEcsService.queryInstancesInformation(ids.toString());
for (DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstance item : response) { for (DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstance item : response) {
log.info("查询第{" + count + "}个实例的ID:" + item.getInstanceId());
log.info("名称:" + item.getInstanceName()); log.info("查询第{" + count + 1 + "}个实例的ID:" + item.getInstanceId());
// log.info("名称:" + item.getInstanceName());
log.info("地域ID:" + item.getRegionId()); log.info("地域ID:" + item.getRegionId());
log.info("状态:" + item.getStatus()); // log.info("状态:" + item.getStatus());
log.info("类型:" + item.getInstanceType()); // log.info("类型:" + item.getInstanceType());
log.info("CPU核心数:" + item.getCpu()); log.info("CPU核心数:" + item.getCpu());
log.info("内存大小:" + item.getMemory() + "MB"); log.info("内存大小:" + item.getMemory() + "MB");
log.info("磁盘大小:" + item.getLocalStorageCapacity() + "G"); // log.info("磁盘大小:" + item.getLocalStorageCapacity() + "G");
log.info("操作系统:" + item.getOSName()); // log.info("操作系统:" + item.getOSName());
log.info("网络类型:" + item.getInstanceNetworkType()); // log.info("网络类型:" + item.getInstanceNetworkType());
log.info("公网出带宽值:" + item.getInternetMaxBandwidthOut() + "Mbit/s"); log.info("公网出带宽值:" + item.getInternetMaxBandwidthOut() + "Mbit/s");
log.info("公网入带宽值:" + item.getInternetMaxBandwidthIn() + "Mbit/s"); // log.info("公网入带宽值:" + item.getInternetMaxBandwidthIn() + "Mbit/s");
log.info("公网IP:" + UserUtil.removeBrackets(item.getPublicIpAddress().getIpAddress().toString())); log.info("公网IP:" + UserUtil.removeBrackets(item.getPublicIpAddress().getIpAddress().toString()));
log.info("私网IP:" + UserUtil.removeBrackets(item.getVpcAttributes().getPrivateIpAddress().ipAddress.toString())); log.info("私网IP:" + UserUtil.removeBrackets(item.getVpcAttributes().getPrivateIpAddress().ipAddress.toString()));
log.info("专有网络VPCID:" + item.getVpcAttributes().getVpcId()); // log.info("专有网络VPCID:" + item.getVpcAttributes().getVpcId());
log.info("安全组ID:" + UserUtil.removeBrackets(item.getSecurityGroupIds().getSecurityGroupId().toString())); // log.info("安全组ID:" + UserUtil.removeBrackets(item.getSecurityGroupIds().getSecurityGroupId().toString()));
log.info("创建时间:" + item.getCreationTime()); log.info("创建时间:" + item.getCreationTime());
log.info("到期时间:" + item.getExpiredTime()); // log.info("到期时间:" + item.getExpiredTime());
log.info("是否可以回收:" + (item.getRecyclable() ? "是" : "否") + "\n\n"); // log.info("是否可以回收:" + (item.getRecyclable() ? "是" : "否") + "\n\n");
//存入集合 //存入集合
gatewayNodeInfos.add( gatewayNodeInfos.add(
@ -283,6 +284,7 @@ public class HandleCache {
} }
log.info("实例IP和对应的权重{}", ipAndWeights);//[IpAndWeight(nodeIp=47.102.158.233, weight=55), IpAndWeight(nodeIp=47.102.123.209, weight=44)] log.info("实例IP和对应的权重{}", ipAndWeights);//[IpAndWeight(nodeIp=47.102.158.233, weight=55), IpAndWeight(nodeIp=47.102.123.209, weight=44)]
log.info("\n\n\n");
gatewayIpAndLoadWeightCache.put(ipAndWeights); gatewayIpAndLoadWeightCache.put(ipAndWeights);
} }
@ -336,7 +338,8 @@ public class HandleCache {
} }
} }
log.info("负载节点的IP序列列表{}", loadNodeList); // log.info("负载节点的IP序列列表{}", loadNodeList);
//节点IP序列存入缓存 //节点IP序列存入缓存
gatewayNodeOrderCache.put(loadNodeList); gatewayNodeOrderCache.put(loadNodeList);
} }

View File

@ -3,9 +3,10 @@ package com.lyh.job;
import com.lyh.common.aliyun.service.AliYunEcsService; import com.lyh.common.aliyun.service.AliYunEcsService;
import com.lyh.gateway.cache.GatewayIpAndLoadCountCache; import com.lyh.gateway.cache.GatewayIpAndLoadCountCache;
import com.lyh.gateway.cache.GatewayNodeIdCache; import com.lyh.gateway.cache.GatewayNodeIdCache;
import com.lyh.gateway.cache.GatewayNodeInfoCache;
import com.lyh.gateway.mode.GatewayNodeInfo;
import com.lyh.gateway.mode.IpAndLoadCount; import com.lyh.gateway.mode.IpAndLoadCount;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -24,20 +25,26 @@ public class Timer {
/* /*
* api * api
* */ * */
@Autowired private final AliYunEcsService aliYunEcsService;
private AliYunEcsService aliYunEcsService;
/* /*
* *
* */ * */
@Autowired private final GatewayIpAndLoadCountCache gatewayIpAndLoadCountCache;
private GatewayIpAndLoadCountCache gatewayIpAndLoadCountCache;
@Autowired private final GatewayNodeIdCache gatewayNodeIdCache;
private GatewayNodeIdCache gatewayNodeIdCache;
private final GatewayNodeInfoCache gatewayNodeInfoCache;
public Timer(AliYunEcsService aliYunEcsService, GatewayIpAndLoadCountCache gatewayIpAndLoadCountCache, GatewayNodeIdCache gatewayNodeIdCache, GatewayNodeInfoCache gatewayNodeInfoCache) {
this.aliYunEcsService = aliYunEcsService;
this.gatewayIpAndLoadCountCache = gatewayIpAndLoadCountCache;
this.gatewayNodeIdCache = gatewayNodeIdCache;
this.gatewayNodeInfoCache = gatewayNodeInfoCache;
}
@Scheduled(cron = "0/5 * * * * ?") @Scheduled(cron = "0/10 * * * * ?")
/* /*
* @Description: * @Description:
* @Date: 2024/4/19 9:44 * @Date: 2024/4/19 9:44
@ -47,6 +54,10 @@ public class Timer {
public void dynamicExpansion() { public void dynamicExpansion() {
//先获取所有的负载列表 //先获取所有的负载列表
List<IpAndLoadCount> ipAndLoadCounts = gatewayIpAndLoadCountCache.get(); List<IpAndLoadCount> ipAndLoadCounts = gatewayIpAndLoadCountCache.get();
if (ipAndLoadCounts.isEmpty()) {
log.error("负载量列表为空!");
return;
}
//计算所有节点的负载 //计算所有节点的负载
int connectSize = ipAndLoadCounts.stream().mapToInt(IpAndLoadCount::getLoadCount).sum(); int connectSize = ipAndLoadCounts.stream().mapToInt(IpAndLoadCount::getLoadCount).sum();
@ -58,7 +69,7 @@ public class Timer {
//执行节点扩容 //执行节点扩容
//返回实例的ID //返回实例的ID
String instanceId = null; String instanceId;
try { try {
instanceId = aliYunEcsService.createAndRunInstance(); instanceId = aliYunEcsService.createAndRunInstance();
} catch (Exception e) { } catch (Exception e) {
@ -66,8 +77,7 @@ public class Timer {
} }
if (!instanceId.isEmpty()) { if (!instanceId.isEmpty()) {
log.info("扩容 成功!"); log.info("扩容 成功扩容的节点ip为" + instanceId);
log.info("扩容的节点ip为" + instanceId);
} }
} else { } else {
log.info("暂时不需要扩容"); log.info("暂时不需要扩容");
@ -75,51 +85,60 @@ public class Timer {
} }
// @Scheduled(cron = "0/5 * * * * ?") @Scheduled(cron = "0/10 * * * * ?")
/* TODO /* TODO
* @Description: * @Description:
* @Date: 2024/4/19 9:44 * @Date: 2024/4/19 9:44
* @Param: [] * @Param: []
* @Return: void * @Return: void
**/ **/
// public void dynamicReduction() { public void dynamicReduction() {
// //求出所有的节点ID //求出所有的节点ID
// List<String> nodeIds = gatewayNodeIdCache.get(); List<String> nodeIds = gatewayNodeIdCache.get();
//
// if (nodeIds.size() <= 1) { //如果节点数量小于等于1则不执行缩容至少保留一个节点
// log.error("暂无节点可删除!"); if (nodeIds.size() <= 1) {
// return; log.info("暂无节点可删除!");
// } return;
// }
//
// //先获取所有的负载列表
// List<IpAndLoadCount> ipAndLoadCounts = gatewayIpAndLoadCountCache.get(); //先获取所有的负载列表
// if (ipAndLoadCounts.size() <= 1) { List<IpAndLoadCount> ipAndLoadCounts = gatewayIpAndLoadCountCache.get();
// log.error("负载列表为空!"); if (ipAndLoadCounts.size() <= 1) {
// return; log.error("负载列表为空!");
// } return;
// }
// //计算所有节点的负载
// int connectSize = ipAndLoadCounts.stream().mapToInt(IpAndLoadCount::getLoadCount).sum(); //获取节点信息IP集合
// List<GatewayNodeInfo> gatewayNodeInfoList = gatewayNodeInfoCache.get();
// //求出平均值 if (gatewayNodeInfoList.isEmpty()) {
// int avg = connectSize / ipAndLoadCounts.size(); log.error("节点信息为空!");
// return;
// if (avg <= 30) { }
//
// //判断哪个节点的负载小于30
// request = request.substring(0, request.length() - 1);
// for (GatewayNodeInfo gatewayNodeInfo : gatewayNodeInfoList) {//获取节点的IP
// //执行节点缩容 String ip = gatewayNodeInfo.getPublicIpAddress();
// try { //获取当前循环节点的负载
// aliYunEcsService.releaseInstances(request); int loadCount = ipAndLoadCounts.stream().filter(ipAndLoadCount -> ipAndLoadCount.getIp().equals(ip)).findFirst().get().getLoadCount();
// } catch (Exception e) { //判断节点的负载是否小于30
// throw new RuntimeException("节点缩容失败!" + e.getMessage()); if (loadCount < 30) {
// } //对这个节点进行缩容
// } else { String instanceId = gatewayNodeInfo.getInstanceId();
// log.info("暂时不需要缩容"); try {
// } aliYunEcsService.releaseInstances(instanceId);
// } } catch (Exception e) {
throw new RuntimeException("节点缩容失败!" + e.getMessage());
}
log.info("节点缩容成功");
//一次只删除一个节点
break;
}
}
}
} }

View File

@ -72,7 +72,7 @@ public class Test {
**/ **/
@org.junit.jupiter.api.Test @org.junit.jupiter.api.Test
public void releaseInstances() throws Exception { public void releaseInstances() throws Exception {
aliYunEcsService.releaseInstances("i-uf62wv013unz2ee2tsl6"); aliYunEcsService.releaseInstances("i-uf6h4s0jtpvrtgx574s1,");
} }
/* /*