4-19-2
parent
eaeb3f4f26
commit
56d7efe441
8
pom.xml
8
pom.xml
|
@ -87,6 +87,14 @@
|
||||||
<artifactId>fastjson2</artifactId>
|
<artifactId>fastjson2</artifactId>
|
||||||
<version>2.0.47</version>
|
<version>2.0.47</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.redisson</groupId>
|
||||||
|
<artifactId>redisson</artifactId>
|
||||||
|
<version>3.15.5</version> <!-- 替换为你想要使用的版本 -->
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.projectlombok</groupId>
|
<groupId>org.projectlombok</groupId>
|
||||||
<artifactId>lombok</artifactId>
|
<artifactId>lombok</artifactId>
|
||||||
|
|
|
@ -17,6 +17,7 @@ import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author gxb
|
* @author gxb
|
||||||
|
@ -42,19 +43,27 @@ public class ALYunEcsService {
|
||||||
* @return 返回实例集合信息
|
* @return 返回实例集合信息
|
||||||
*/
|
*/
|
||||||
public List<InstanceInfo> selectEscList(EcsSelectModel ecsSelectModel){
|
public List<InstanceInfo> selectEscList(EcsSelectModel ecsSelectModel){
|
||||||
DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest()
|
log.info("当前对象的参数值:" + ecsSelectModel.toString());
|
||||||
|
DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest()
|
||||||
.setRegionId(aliConfig.getRegionId());
|
.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("*");
|
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);
|
describeInstancesRequest.setPageSize(10);
|
||||||
|
|
||||||
RuntimeOptions runtime = new RuntimeOptions();
|
RuntimeOptions runtime = new RuntimeOptions();
|
||||||
|
@ -92,14 +101,18 @@ public class ALYunEcsService {
|
||||||
}
|
}
|
||||||
|
|
||||||
return new ArrayList<>();
|
return new ArrayList<>();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建实例方法
|
* 创建实例方法
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
public String createAnServers() throws Exception {
|
public String createAnServer(String isNull) throws Exception {
|
||||||
// 地域Id
|
// 地域Id
|
||||||
//String regionId = "cn-shanghai";
|
//String regionId = "cn-shanghai";
|
||||||
String regionId = aliConfig.getRegionId();
|
String regionId = aliConfig.getRegionId();
|
||||||
|
@ -135,13 +148,18 @@ public class ALYunEcsService {
|
||||||
// PostPaid:按量付费
|
// PostPaid:按量付费
|
||||||
//String instanceChargeType = "PostPaid";
|
//String instanceChargeType = "PostPaid";
|
||||||
String instanceChargeType = aliConfig.getInstanceChargeType();
|
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);
|
String instances = RunInstances(client, regionId, imageId, instanceType, securityGroupId, vSwitchId, internetMaxBandwidthOut, internetChargeType, size, category, instanceChargeType);
|
||||||
//返回实例ID
|
//返回实例ID
|
||||||
return instances;
|
return instances;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 批量创建【2】台服务器
|
* 批量创建【2】台服务器
|
||||||
* RunInstances 通过备选实例规格创建ECS实例最佳实践
|
* RunInstances 通过备选实例规格创建ECS实例最佳实践
|
||||||
|
@ -184,52 +202,6 @@ public class ALYunEcsService {
|
||||||
return JSON.toJSONString(responces.body.instanceIdSets.instanceIdSet);
|
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】台服务器
|
* 批量创建【1】台服务器
|
||||||
|
@ -273,6 +245,7 @@ public class ALYunEcsService {
|
||||||
return JSON.toJSONString(responces.body.instanceIdSets.instanceIdSet);
|
return JSON.toJSONString(responces.body.instanceIdSets.instanceIdSet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public DescribeInstancesResponse DescribeInstances(Client client, String regionId, String instanceIds, String instanceName) throws Exception {
|
public DescribeInstancesResponse DescribeInstances(Client client, String regionId, String instanceIds, String instanceName) throws Exception {
|
||||||
DescribeInstancesRequest req = new DescribeInstancesRequest()
|
DescribeInstancesRequest req = new DescribeInstancesRequest()
|
||||||
.setRegionId(regionId)
|
.setRegionId(regionId)
|
||||||
|
|
|
@ -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:";
|
||||||
|
}
|
|
@ -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;
|
||||||
|
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
package com.guo.gateway.cache;
|
package com.guo.gateway.cache;
|
||||||
|
|
||||||
|
import com.guo.common.constant.CacheConstants;
|
||||||
import com.guo.gateway.cache.abs.CacheAbs;
|
import com.guo.gateway.cache.abs.CacheAbs;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@ -13,11 +14,10 @@ import java.util.List;
|
||||||
@Component
|
@Component
|
||||||
public class LoadNodeCache extends CacheAbs<String> {
|
public class LoadNodeCache extends CacheAbs<String> {
|
||||||
|
|
||||||
private final static String gatewayLoadNodeKey = "node";
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getPre() {
|
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){
|
public void put(List<String> nodeList){
|
||||||
//删除key
|
//删除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 负载节点集合
|
* @return 负载节点集合
|
||||||
*/
|
*/
|
||||||
public List<String> get(){
|
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){
|
if (index == null || index > 100){
|
||||||
throw new RuntimeException("下标违法:【0 - 100】");
|
throw new RuntimeException("下标违法:【0 - 100】");
|
||||||
}
|
}
|
||||||
return redisService.getCacheListValue(encode(gatewayLoadNodeKey),index);
|
return redisService.getCacheListValue(encode(CacheConstants.GATEWAY_LOAD_NODE_KEY),index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.guo.gateway.cache;
|
package com.guo.gateway.cache;
|
||||||
|
|
||||||
|
import com.guo.common.constant.CacheConstants;
|
||||||
import com.guo.gateway.cache.abs.CacheAbs;
|
import com.guo.gateway.cache.abs.CacheAbs;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@ -13,11 +14,9 @@ import javax.annotation.PostConstruct;
|
||||||
@Component
|
@Component
|
||||||
public class LoadSeriesCache extends CacheAbs<String> {
|
public class LoadSeriesCache extends CacheAbs<String> {
|
||||||
|
|
||||||
private final static String gatewayLoadSeriesKey = "series";
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getPre() {
|
public String getPre() {
|
||||||
return "gateway:load:";
|
return CacheConstants.GATEWAY_COMMON;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -25,7 +24,7 @@ public class LoadSeriesCache extends CacheAbs<String> {
|
||||||
*/
|
*/
|
||||||
@PostConstruct
|
@PostConstruct
|
||||||
public void init(){
|
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 序列值
|
* @return 序列值
|
||||||
*/
|
*/
|
||||||
public Long get(){
|
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 自增后的值
|
* @return 自增后的值
|
||||||
*/
|
*/
|
||||||
public Long incrementAndGet(){
|
public Long incrementAndGet(){
|
||||||
return redisService.increment(encode(gatewayLoadSeriesKey),1L);
|
return redisService.increment(encode(CacheConstants.GATEWAY_LOAD_SERIES_KEY),1L);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.guo.gateway.cache;
|
package com.guo.gateway.cache;
|
||||||
|
|
||||||
|
import com.guo.common.constant.CacheConstants;
|
||||||
import com.guo.gateway.cache.abs.CacheAbs;
|
import com.guo.gateway.cache.abs.CacheAbs;
|
||||||
import com.guo.gateway.model.NodeInfo;
|
import com.guo.gateway.model.NodeInfo;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
@ -14,7 +15,7 @@ public class NodeCache extends CacheAbs<String> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getPre() {
|
public String getPre() {
|
||||||
return "gateway:node:info:";
|
return CacheConstants.GATE_WAY_NODE_INFO;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.guo.gateway.cache;
|
package com.guo.gateway.cache;
|
||||||
|
|
||||||
|
import com.guo.common.constant.CacheConstants;
|
||||||
import com.guo.gateway.cache.abs.CacheAbs;
|
import com.guo.gateway.cache.abs.CacheAbs;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@ -16,7 +17,7 @@ import java.util.concurrent.TimeUnit;
|
||||||
@Component
|
@Component
|
||||||
public class NodeReduced extends CacheAbs<String> {
|
public class NodeReduced extends CacheAbs<String> {
|
||||||
|
|
||||||
private final static int Expiratiotime = 50;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getPre() {
|
public String getPre() {
|
||||||
|
@ -30,7 +31,7 @@ public class NodeReduced extends CacheAbs<String> {
|
||||||
public void put(String nodeId){
|
public void put(String nodeId){
|
||||||
Set<String> thresholeSet = new HashSet<>();
|
Set<String> thresholeSet = new HashSet<>();
|
||||||
thresholeSet.add(nodeId);
|
thresholeSet.add(nodeId);
|
||||||
redisService.setCacheSetEndTime(encode(nodeId),thresholeSet, TimeUnit.MINUTES,Expiratiotime);
|
redisService.setCacheSetEndTime(encode(nodeId),thresholeSet, TimeUnit.MINUTES, CacheConstants.EXPIRATIOTIME);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,10 +1,16 @@
|
||||||
package com.guo.gateway.cache;
|
package com.guo.gateway.cache;
|
||||||
|
|
||||||
|
import com.guo.common.constant.CacheConstants;
|
||||||
import com.guo.gateway.cache.abs.CacheAbs;
|
import com.guo.gateway.cache.abs.CacheAbs;
|
||||||
import com.guo.gateway.model.NodeJoin;
|
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 org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author gxb
|
* @author gxb
|
||||||
|
@ -14,18 +20,27 @@ import java.util.List;
|
||||||
@Component
|
@Component
|
||||||
public class NodeScoreCache extends CacheAbs<String> {
|
public class NodeScoreCache extends CacheAbs<String> {
|
||||||
|
|
||||||
private final static String gatewayNodeScoreCache = "score";
|
|
||||||
@Override
|
@Override
|
||||||
public String getPre() {
|
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及连接数
|
* 存入节点ID及连接数
|
||||||
* @param nodeJoin
|
* @param nodeJoin
|
||||||
*/
|
*/
|
||||||
public void save(NodeJoin 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
|
* @return
|
||||||
*/
|
*/
|
||||||
public List<String> get(){
|
public List<String> get(){
|
||||||
return redisService.getCacheObject(encode(gatewayNodeScoreCache));
|
return redisService.getCacheObject(encode(CacheConstants.GATEWAY_NODE_SCORE_CACHE));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.guo.gateway.cache;
|
package com.guo.gateway.cache;
|
||||||
|
|
||||||
|
import com.guo.common.constant.CacheConstants;
|
||||||
import com.guo.gateway.cache.abs.CacheAbs;
|
import com.guo.gateway.cache.abs.CacheAbs;
|
||||||
import com.guo.gateway.model.NodeVehicle;
|
import com.guo.gateway.model.NodeVehicle;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
@ -14,7 +15,7 @@ public class NodeSetVinCache extends CacheAbs<String> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getPre() {
|
public String getPre() {
|
||||||
return "gateway:vehicle:";
|
return CacheConstants.GATEWAY_VEHICLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package com.guo.gateway.cache;
|
package com.guo.gateway.cache;
|
||||||
|
|
||||||
import com.alibaba.fastjson2.JSON;
|
import com.alibaba.fastjson2.JSON;
|
||||||
|
import com.guo.common.constant.CacheConstants;
|
||||||
import com.guo.gateway.cache.abs.CacheAbs;
|
import com.guo.gateway.cache.abs.CacheAbs;
|
||||||
import com.guo.gateway.model.NodeVehicle;
|
import com.guo.gateway.model.NodeVehicle;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
@ -21,7 +22,7 @@ public class VehicleLineNodeCache extends CacheAbs<String> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getPre() {
|
public String getPre() {
|
||||||
return "gateway:vehicleLine:";
|
return CacheConstants.GATEWAY_VEHICLE_LINE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
|
@ -13,4 +13,9 @@ public interface GateWayLoadService {
|
||||||
*/
|
*/
|
||||||
String loadNode();
|
String loadNode();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 刷新负载
|
||||||
|
*/
|
||||||
|
void refreshLoad();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,14 +1,19 @@
|
||||||
package com.guo.service.impl;
|
package com.guo.service.impl;
|
||||||
|
|
||||||
import com.alibaba.fastjson2.JSONObject;
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
|
import com.guo.common.constant.LoadConstants;
|
||||||
import com.guo.gateway.cache.*;
|
import com.guo.gateway.cache.*;
|
||||||
import com.guo.gateway.model.NodeInfo;
|
import com.guo.gateway.model.NodeInfo;
|
||||||
import com.guo.gateway.model.NodeJoin;
|
import com.guo.gateway.model.NodeJoin;
|
||||||
|
import com.guo.gateway.model.WorkGatewayNode;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import lombok.ToString;
|
import lombok.ToString;
|
||||||
import lombok.extern.log4j.Log4j2;
|
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 org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -16,6 +21,7 @@ import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -28,11 +34,6 @@ import java.util.concurrent.atomic.AtomicInteger;
|
||||||
@Log4j2
|
@Log4j2
|
||||||
public class GateWayLoadServicelmpl implements GateWayLoadService {
|
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 VehicleLineNodeCache vehicleLineNodeCache;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分布式锁
|
||||||
|
*/
|
||||||
|
//private final RedissonClient redissonClient;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取负载节点
|
* 获取负载节点
|
||||||
|
@ -71,109 +77,121 @@ public class GateWayLoadServicelmpl implements GateWayLoadService {
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String loadNode() {
|
public String loadNode() {
|
||||||
//初始化序列
|
//去刷新负载
|
||||||
loadSeriesCache.reset();
|
refreshLoad();
|
||||||
|
|
||||||
//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()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
List<String> loadNodeList = new ArrayList<>();
|
|
||||||
|
|
||||||
int count = nodeIdList.stream().mapToInt(WorkGatewayNode::getWeight).sum();
|
|
||||||
|
|
||||||
if (count < 100) {
|
|
||||||
List<WorkGatewayNode> list = nodeIdList.stream().sorted((o1, o2) -> o2.getWeight() - o1.getWeight()).toList();
|
|
||||||
|
|
||||||
int countWeight = 0;
|
|
||||||
for (long i = count; i < 100; i++) {
|
|
||||||
WorkGatewayNode workGatewayNode = list.get(countWeight++ % list.size());
|
|
||||||
workGatewayNode.setWeight(workGatewayNode.getWeight() + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
whFor:
|
|
||||||
while (true) {
|
|
||||||
for (WorkGatewayNode workGatewayNode : nodeIdList) {
|
|
||||||
int weight = workGatewayNode.getWeight();
|
|
||||||
if (weight > 0) {
|
|
||||||
loadNodeList.add(
|
|
||||||
workGatewayNode.getNodeId()
|
|
||||||
);
|
|
||||||
workGatewayNode.setWeight(weight - 1);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
int sum = nodeIdList.stream().
|
|
||||||
mapToInt(WorkGatewayNode::getWeight).sum();
|
|
||||||
if (sum <= 0) {
|
|
||||||
break whFor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//打印负载节点信息
|
|
||||||
log.info(loadNodeList);
|
|
||||||
//存负载集合
|
|
||||||
loadNodeCache.put(loadNodeList);
|
|
||||||
|
|
||||||
//获取自增序列值
|
//获取自增序列值
|
||||||
Long seriesLoad = loadSeriesCache.incrementAndGet(); //获取自增序列值
|
Long seriesLoad = loadSeriesCache.incrementAndGet(); //获取自增序列值
|
||||||
Long seriesLoadIndex = seriesLoad % nodeLength;
|
Long seriesLoadIndex = seriesLoad % LoadConstants.NODE_LENGTH;
|
||||||
//获取负载下标
|
//获取负载下标
|
||||||
String loadNodeId = loadNodeCache.getFindByIndex(seriesLoadIndex);
|
String loadNodeId = loadNodeCache.getFindByIndex(seriesLoadIndex);
|
||||||
//通过获取节点ID
|
//通过获取节点ID
|
||||||
NodeInfo nodeInfo = nodeCache.get(loadNodeId);
|
NodeInfo nodeInfo = nodeCache.get(loadNodeId);
|
||||||
//获取缓存内节点的公网/内网信息
|
//获取缓存内节点的公网/内网信息 返回公网IP
|
||||||
return nodeInfo.getPublicIdAddress();
|
return nodeInfo.getPublicIdAddress();
|
||||||
//返回公网IP
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 刷新负载 实现动态负载
|
||||||
|
*/
|
||||||
|
@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 = workGatewayNodeWeight.stream().mapToInt(WorkGatewayNode::getWeight).sum();
|
||||||
|
|
||||||
|
if (count < 100) {
|
||||||
|
List<WorkGatewayNode> list = workGatewayNodeWeight.stream().sorted((o1, o2) -> o2.getWeight() - o1.getWeight()).toList();
|
||||||
|
|
||||||
|
int countWeight = 0;
|
||||||
|
for (long i = count; i < 100; i++) {
|
||||||
|
WorkGatewayNode workGatewayNode = list.get(countWeight++ % list.size());
|
||||||
|
workGatewayNode.setWeight(workGatewayNode.getWeight() + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
whFor:
|
||||||
|
while (true) {
|
||||||
|
for (WorkGatewayNode workGatewayNode : workGatewayNodeWeight) {
|
||||||
|
int weight = workGatewayNode.getWeight();
|
||||||
|
if (weight > 0) {
|
||||||
|
loadNodeList.add(
|
||||||
|
workGatewayNode.getNodeId()
|
||||||
|
);
|
||||||
|
workGatewayNode.setWeight(weight - 1);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
int sum = workGatewayNodeWeight.stream().
|
||||||
|
mapToInt(WorkGatewayNode::getWeight).sum();
|
||||||
|
if (sum <= 0) {
|
||||||
|
break whFor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//重置
|
||||||
|
loadSeriesCache.reset();
|
||||||
|
//存入负载集合
|
||||||
|
loadNodeCache.put(loadNodeList);
|
||||||
|
}
|
||||||
|
//} catch (InterruptedException e) {
|
||||||
|
// Thread.currentThread().interrupt();
|
||||||
|
// 处理中断异常
|
||||||
|
//} finally {
|
||||||
|
// 释放锁
|
||||||
|
// if (refreshLoadLock.isHeldByCurrentThread()) {
|
||||||
|
// refreshLoadLock.unlock();
|
||||||
|
//}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 统计
|
* 统计
|
||||||
*/
|
*/
|
||||||
class StiNode {
|
//class StiNode {
|
||||||
// 使用 ConcurrentHashMap 保证线程安全
|
// // 使用 ConcurrentHashMap 保证线程安全
|
||||||
private static final Map<String, AtomicInteger> stiNodeMap = new ConcurrentHashMap<>();
|
// private static final Map<String, AtomicInteger> stiNodeMap = new ConcurrentHashMap<>();
|
||||||
|
//
|
||||||
public static void sti(String nodeId) {
|
// public static void sti(String nodeId) {
|
||||||
// 使用 computeIfAbsent 方法确保原子性操作
|
// // 使用 computeIfAbsent 方法确保原子性操作
|
||||||
stiNodeMap.computeIfAbsent(nodeId, key -> new AtomicInteger()).incrementAndGet();
|
// stiNodeMap.computeIfAbsent(nodeId, key -> new AtomicInteger()).incrementAndGet();
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
public static Map<String, Long> show() {
|
// public static Map<String, Long> show() {
|
||||||
Map<String, Long> resultMap = new HashMap<>();
|
// Map<String, Long> resultMap = new HashMap<>();
|
||||||
stiNodeMap.forEach((key, val) -> {
|
// stiNodeMap.forEach((key, val) -> {
|
||||||
resultMap.put(key, (long) val.get());
|
// resultMap.put(key, (long) val.get());
|
||||||
System.out.println(key + "▷◁▷◁▷◁▷◁▷◁▷◁▷▷◁▷◁▷◁☛☛" + val.get());
|
// System.out.println(key + "--------------" + val.get());
|
||||||
});
|
// });
|
||||||
return resultMap;
|
// return resultMap;
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 节点ID 、 权重
|
|
||||||
*/
|
|
||||||
@Data
|
|
||||||
@AllArgsConstructor
|
|
||||||
@NoArgsConstructor
|
|
||||||
@ToString
|
|
||||||
class WorkGatewayNode {
|
|
||||||
|
|
||||||
private String nodeId;
|
|
||||||
private int weight;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -34,11 +34,6 @@ import java.util.List;
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public class Collection {
|
public class Collection {
|
||||||
|
|
||||||
/**
|
|
||||||
* 负载的长度
|
|
||||||
*/
|
|
||||||
private final Long nodeLength = 100L;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 网关负载节点缓存
|
* 网关负载节点缓存
|
||||||
*/
|
*/
|
||||||
|
@ -83,6 +78,9 @@ public class Collection {
|
||||||
@Autowired
|
@Autowired
|
||||||
private ALYunEcsService alYunEcsService;
|
private ALYunEcsService alYunEcsService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 定时扫描节点信息
|
||||||
|
*/
|
||||||
@Scheduled(cron = "0/10 * * * * ?")
|
@Scheduled(cron = "0/10 * * * * ?")
|
||||||
public void scheduledEcsCompanding() {
|
public void scheduledEcsCompanding() {
|
||||||
|
|
||||||
|
@ -177,7 +175,5 @@ public class Collection {
|
||||||
//调用扩容方法去判断是否需要扩缩容
|
//调用扩容方法去判断是否需要扩缩容
|
||||||
contractionVolume.contractionVolume(totalNumber);
|
contractionVolume.contractionVolume(totalNumber);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package com.guo.task.Contraction;
|
package com.guo.task.Contraction;
|
||||||
|
|
||||||
import com.guo.aly.ALYunEcsService;
|
import com.guo.aly.ALYunEcsService;
|
||||||
|
import com.guo.common.constant.LoadConstants;
|
||||||
import com.guo.common.model.TotalNumber;
|
import com.guo.common.model.TotalNumber;
|
||||||
import com.guo.gateway.cache.NodeReduced;
|
import com.guo.gateway.cache.NodeReduced;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
|
@ -20,17 +21,6 @@ import java.util.concurrent.TimeUnit;
|
||||||
@Log4j2
|
@Log4j2
|
||||||
public class ContractionVolume {
|
public class ContractionVolume {
|
||||||
|
|
||||||
/**
|
|
||||||
* 每个节点最大连接数
|
|
||||||
*/
|
|
||||||
private final static Long Maxnumber = 100L;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 60%与80%阈值
|
|
||||||
*/
|
|
||||||
private final static Long Intermediate = 60L;
|
|
||||||
private final static Long Maximum = 80L;
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private ALYunEcsService alYunEcsService;
|
private ALYunEcsService alYunEcsService;
|
||||||
|
|
||||||
|
@ -58,6 +48,7 @@ public class ContractionVolume {
|
||||||
//比较 剩余时间 小于5分钟
|
//比较 剩余时间 小于5分钟
|
||||||
if (expire < fiveMinutesSeconds){
|
if (expire < fiveMinutesSeconds){
|
||||||
//数据迁移 释放节点
|
//数据迁移 释放节点
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//记录
|
//记录
|
||||||
|
@ -73,11 +64,11 @@ public class ContractionVolume {
|
||||||
public void contractionVolume(TotalNumber totalNumber){
|
public void contractionVolume(TotalNumber totalNumber){
|
||||||
//特殊情况 无节点
|
//特殊情况 无节点
|
||||||
if (totalNumber.getNodeNumber() == 0L){
|
if (totalNumber.getNodeNumber() == 0L){
|
||||||
//无则创建两台实力
|
// 无 则创建两台实力
|
||||||
log.error("当前未存在节点信息");
|
log.error("当前未存在节点信息");
|
||||||
try {
|
try {
|
||||||
//创建实例方法 【2台】
|
//创建实例方法 【2台】
|
||||||
alYunEcsService.createAnServers();
|
// alYunEcsService.createAnServer(LoadConstants.IS_NULL);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("扩容失败!!!!!");
|
log.error("扩容失败!!!!!");
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
@ -88,24 +79,24 @@ public class ContractionVolume {
|
||||||
//调用计算
|
//调用计算
|
||||||
Long value = this.percentage(totalNumber);
|
Long value = this.percentage(totalNumber);
|
||||||
//判断达到60%
|
//判断达到60%
|
||||||
if (value >= Intermediate && value < Maximum){
|
if (value >= LoadConstants.INTERMEDIATE && value < LoadConstants.MAXIMUM){
|
||||||
//当节点负载达到 60%时,调用扩容一台方法
|
//当节点负载达到 60%时,调用扩容一台方法
|
||||||
log.info("Node 节点负载达到 :" + value + "%,达到扩容一台的条件☑");
|
log.info("Node 节点负载达到 :" + value + "%,达到扩容一台的条件☑");
|
||||||
try {
|
try {
|
||||||
//创建实例方法 【1台】
|
//创建实例方法 【1台】
|
||||||
alYunEcsService.createAnServer();
|
alYunEcsService.createAnServer(null);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("扩容失败!!!!!");
|
log.error("扩容失败!!!!!");
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//判断达到80%
|
//判断达到80%
|
||||||
if (value >= Maximum){
|
if (value >= LoadConstants.MAXIMUM){
|
||||||
//当节点负载达到 80%时,调用扩容一台方法
|
//当节点负载达到 80%时,调用扩容一台方法
|
||||||
log.info("Node 节点负载达到 :" + value + "%,达到扩容一台的条件☑");
|
log.info("Node 节点负载达到 :" + value + "%,达到扩容两台的条件☑");
|
||||||
try {
|
try {
|
||||||
//创建实例方法 【2台】
|
//创建实例方法 【2台】
|
||||||
alYunEcsService.createAnServers();
|
alYunEcsService.createAnServer(LoadConstants.IS_NULL);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("扩容失败!!!!!");
|
log.error("扩容失败!!!!!");
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
@ -121,13 +112,15 @@ public class ContractionVolume {
|
||||||
//获取节点数量
|
//获取节点数量
|
||||||
Long nodeNumber = totalNumber.getNodeNumber();
|
Long nodeNumber = totalNumber.getNodeNumber();
|
||||||
//根据nodeNumber去获取最大节点数 默认 100
|
//根据nodeNumber去获取最大节点数 默认 100
|
||||||
Long sumNodeNumber = nodeNumber * Maxnumber;
|
Long sumNodeNumber = nodeNumber * LoadConstants.MAX_NUMBER;
|
||||||
//获取节点连接总数
|
//获取节点连接总数
|
||||||
Long connectionTotal = totalNumber.getConnectionTotal();
|
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;
|
return roundLoadPercentage;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue