From b12705e6c521f4c00f1fc6537d4d38aac886d697 Mon Sep 17 00:00:00 2001 From: Su ZeJing <3039179835@qq.com> Date: Fri, 19 Apr 2024 20:20:29 +0800 Subject: [PATCH] N --- .../{ => common/aliyun}/config/AliConfig.java | 26 +- .../aliyun/config}/Result.java | 2 +- .../aliyun/model}/InstanceConfig.java | 9 +- .../aliyun/service/AliYunEcsService.java | 261 ++++++++++++++++++ .../FastJson2JsonRedisSerializer.java | 2 +- .../redis/configure}/RedisConfig.java | 2 +- .../redis/configure/RedisListenerConfig.java | 31 +++ .../redis/service}/RedisService.java | 18 +- .../aliyun/common/utils/MqttUtil.java | 55 ++++ .../aliyun/{ => common}/utils/UserUtil.java | 6 +- .../{ => common}/utils/uuid/IdUtils.java | 2 +- .../aliyun/{ => common}/utils/uuid/UUID.java | 2 +- .../aliyun/controller/GatewayController.java | 8 +- .../controller/WorkGatewayNodeController.java | 4 +- .../gateway/cache/GatewayNodeCache.java | 2 +- .../cache/abs/GatewayNodeCacheAbs.java | 2 +- .../aliyun/gateway/model/NodeLoadNum.java | 23 ++ .../aliyun/gateway/model/NodeLoadWeight.java | 25 ++ .../{utils => job}/LoadCenterController.java | 6 +- .../aliyun/service/AliYunEcsService.java | 187 ------------- .../aliyun/service/GatewayLoadService.java | 5 + .../service/impl/GatewayLoadServiceImpl.java | 14 +- .../aliyun/vehicle/VehicleOnLine.java | 2 +- ...ot.autoconfigure.AutoConfiguration.imports | 2 + src/main/resources/application.yml | 1 - src/test/java/Test1.java | 2 +- 26 files changed, 480 insertions(+), 219 deletions(-) rename src/main/java/com/loadCenter/aliyun/{ => common/aliyun}/config/AliConfig.java (56%) rename src/main/java/com/loadCenter/aliyun/{domain => common/aliyun/config}/Result.java (97%) rename src/main/java/com/loadCenter/aliyun/{config => common/aliyun/model}/InstanceConfig.java (95%) create mode 100644 src/main/java/com/loadCenter/aliyun/common/aliyun/service/AliYunEcsService.java rename src/main/java/com/loadCenter/aliyun/{config => common/redis/configure}/FastJson2JsonRedisSerializer.java (96%) rename src/main/java/com/loadCenter/aliyun/{config => common/redis/configure}/RedisConfig.java (96%) create mode 100644 src/main/java/com/loadCenter/aliyun/common/redis/configure/RedisListenerConfig.java rename src/main/java/com/loadCenter/aliyun/{utils/redis => common/redis/service}/RedisService.java (93%) create mode 100644 src/main/java/com/loadCenter/aliyun/common/utils/MqttUtil.java rename src/main/java/com/loadCenter/aliyun/{ => common}/utils/UserUtil.java (83%) rename src/main/java/com/loadCenter/aliyun/{ => common}/utils/uuid/IdUtils.java (94%) rename src/main/java/com/loadCenter/aliyun/{ => common}/utils/uuid/UUID.java (99%) create mode 100644 src/main/java/com/loadCenter/aliyun/gateway/model/NodeLoadNum.java create mode 100644 src/main/java/com/loadCenter/aliyun/gateway/model/NodeLoadWeight.java rename src/main/java/com/loadCenter/aliyun/{utils => job}/LoadCenterController.java (94%) delete mode 100644 src/main/java/com/loadCenter/aliyun/service/AliYunEcsService.java create mode 100644 src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports diff --git a/src/main/java/com/loadCenter/aliyun/config/AliConfig.java b/src/main/java/com/loadCenter/aliyun/common/aliyun/config/AliConfig.java similarity index 56% rename from src/main/java/com/loadCenter/aliyun/config/AliConfig.java rename to src/main/java/com/loadCenter/aliyun/common/aliyun/config/AliConfig.java index 98cd6b8..046c3a3 100644 --- a/src/main/java/com/loadCenter/aliyun/config/AliConfig.java +++ b/src/main/java/com/loadCenter/aliyun/common/aliyun/config/AliConfig.java @@ -1,9 +1,14 @@ -package com.loadCenter.aliyun.config; +package com.loadCenter.aliyun.common.aliyun.config; import com.aliyun.ecs20140526.Client; import com.aliyun.teaopenapi.models.Config; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; +import lombok.experimental.SuperBuilder; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** @@ -12,15 +17,30 @@ import org.springframework.context.annotation.Configuration; * @Author ZeJinG.Su */ @Configuration -@ConfigurationProperties(prefix = "aliyun") +@ConfigurationProperties(prefix = "config.aliyun") @Data +@AllArgsConstructor +@NoArgsConstructor +@ToString +@SuperBuilder public class AliConfig { + /** + * 阿里云access-key-id + */ private String accessKetId; + /** + * 阿里云access-key-secret + */ private String accessKeySecret; + /** + * 地域ID + */ private String regionId; - public static Client createEcsClient(AliConfig aliConfig) throws Exception { + + @Bean + public Client createEcsClient(AliConfig aliConfig) throws Exception { Config config = new Config() .setAccessKeyId(aliConfig.getAccessKetId()) .setAccessKeySecret(aliConfig.getAccessKeySecret()) diff --git a/src/main/java/com/loadCenter/aliyun/domain/Result.java b/src/main/java/com/loadCenter/aliyun/common/aliyun/config/Result.java similarity index 97% rename from src/main/java/com/loadCenter/aliyun/domain/Result.java rename to src/main/java/com/loadCenter/aliyun/common/aliyun/config/Result.java index 76e30c7..8423f99 100644 --- a/src/main/java/com/loadCenter/aliyun/domain/Result.java +++ b/src/main/java/com/loadCenter/aliyun/common/aliyun/config/Result.java @@ -1,4 +1,4 @@ -package com.loadCenter.aliyun.domain; +package com.loadCenter.aliyun.common.aliyun.config; diff --git a/src/main/java/com/loadCenter/aliyun/config/InstanceConfig.java b/src/main/java/com/loadCenter/aliyun/common/aliyun/model/InstanceConfig.java similarity index 95% rename from src/main/java/com/loadCenter/aliyun/config/InstanceConfig.java rename to src/main/java/com/loadCenter/aliyun/common/aliyun/model/InstanceConfig.java index 3265ef1..3812457 100644 --- a/src/main/java/com/loadCenter/aliyun/config/InstanceConfig.java +++ b/src/main/java/com/loadCenter/aliyun/common/aliyun/model/InstanceConfig.java @@ -1,4 +1,4 @@ -package com.loadCenter.aliyun.config; +package com.loadCenter.aliyun.common.aliyun.model; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; @@ -53,10 +53,5 @@ public class InstanceConfig { */ private String internetChargeType; - - - - - - } + diff --git a/src/main/java/com/loadCenter/aliyun/common/aliyun/service/AliYunEcsService.java b/src/main/java/com/loadCenter/aliyun/common/aliyun/service/AliYunEcsService.java new file mode 100644 index 0000000..9c71cf1 --- /dev/null +++ b/src/main/java/com/loadCenter/aliyun/common/aliyun/service/AliYunEcsService.java @@ -0,0 +1,261 @@ +package com.loadCenter.aliyun.common.aliyun.service; + +import com.alibaba.fastjson2.JSON; +import com.aliyun.ecs20140526.Client; +import com.aliyun.ecs20140526.models.*; +import com.aliyun.tea.TeaException; +import com.aliyun.teautil.Common; +import com.aliyun.teautil.models.RuntimeOptions; +import com.loadCenter.aliyun.common.aliyun.config.AliConfig; +import com.loadCenter.aliyun.common.aliyun.model.InstanceConfig; +import com.loadCenter.aliyun.common.utils.UserUtil; +import lombok.extern.log4j.Log4j2; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @ClassName AliYunEcsService + * @Description 阿里云ECS实例OPENAPI接口调用封装 + * @Author ZeJinG.Su + * @Date 16:54 2024/4/19 + */ +@Log4j2 +@Component +public class AliYunEcsService { + + @Autowired + private InstanceConfig instanceConfig; + + + private final AliConfig aliConfig; + private final Client client; + + public AliYunEcsService(AliConfig aliConfig, Client client) { + this.aliConfig = aliConfig; + this.client = client; + } + + + //区域实例集合 + public List getIDList() throws Exception { + + List regionIds = com.aliyun.darabonbastring.Client.split(aliConfig.getRegionId(), ",", 50); + + String regionId = regionIds.get(0); + + DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest() + .setPageSize(100) + .setRegionId(regionId); + DescribeInstancesResponse resp = this.client.describeInstances(describeInstancesRequest); + List instances = resp.body.instances.instance; + + ArrayList result = new ArrayList<>(); + for (DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstance instance : instances) { + result.add(instance.instanceId); + } + + log.info(JSON.toJSONString(result)); + + return result; + } + + //释放实例 + public void releaseInstances(String instanceIds) throws Exception { + + // 实例名称,支持使用通配符*进行模糊搜索 + String instanceName = "*"; + // 强制删除有删除保护的机器 + String deleteProtected = "true"; + // 强制删除运行中的机器 + String force = "true"; + + //判断是否为强制删除 + if (Common.equalString(deleteProtected, "true")) { + DescribeInstancesResponse describeInstancesResp = DescribeInstances(client, aliConfig.getRegionId(), instanceIds, instanceName); + instanceIds = ""; + for (DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstance instance : describeInstancesResp.body.instances.instance) { + instanceIds = instance.instanceId + "," + instanceIds; + if (instance.deletionProtection) { + ModifyInstanceAttribute(client, instance.instanceId); + } + + } + instanceIds = com.aliyun.darabonbastring.Client.subString(instanceIds, 0, -1); + } + + //如果入参为空 + if (Common.empty(instanceIds)) { + com.aliyun.teaconsole.Client.log("--------------------无有效实例可删除--------------------"); + return; + } + + DeleteInstances(client, aliConfig.getRegionId(), instanceIds, force); + } + + //查询需要删除实例 + public static DescribeInstancesResponse DescribeInstances(Client client, String regionId, String instanceIds, String instanceName) throws Exception { + DescribeInstancesRequest req = new DescribeInstancesRequest() + .setRegionId(regionId) + .setInstanceName(instanceName); + if (!Common.empty(instanceIds)) { + req.instanceIds = Common.toJSONString(com.aliyun.darabonbastring.Client.split(instanceIds, ",", 50)); + } + + DescribeInstancesResponse resp = client.describeInstances(req); + com.aliyun.teaconsole.Client.log("--------------------查询需要删除的实例--------------------"); + return resp; + } + + //修改实例删除保护 + public static void ModifyInstanceAttribute(Client client, String instatnceId) throws Exception { + ModifyInstanceAttributeRequest req = new ModifyInstanceAttributeRequest() + .setInstanceId(instatnceId) + .setDeletionProtection(false);//设置删除保护为false + client.modifyInstanceAttribute(req); + com.aliyun.teaconsole.Client.log("--------------------" + instatnceId + "释放保护取消成功--------------------"); + } + + //执行释放实例 + public static void DeleteInstances(Client client, String regionId, String instanceIds, String force) throws Exception { + DeleteInstancesRequest req = new DeleteInstancesRequest() + .setRegionId(regionId) + .setInstanceId(com.aliyun.darabonbastring.Client.split(instanceIds, ",", 50)) + .setForce(Common.equalString(force, "true")); + DeleteInstancesResponse resp = client.deleteInstances(req); + com.aliyun.teaconsole.Client.log("--------------------实例释放成功--------------------"); + com.aliyun.teaconsole.Client.log(Common.toJSONString(Common.toMap(resp))); + } + + + //创建实例(创建成功后自启动) + public String createAndRunInstance() throws Exception { + + //获取实例规格 + // 地域Id + String regionId = aliConfig.getRegionId(); + // 镜像 ID,启动实例时选择的镜像资源。 + String imageId = instanceConfig.getImageId(); + // 实例规格 + String instanceType = instanceConfig.getInstanceType(); + // 新创建实例所属于的安全组 ID。 + String securityGroupId = instanceConfig.getSecurityGroupId(); + // 虚拟交换机 ID。 + String vSwitchId = instanceConfig.getVSwitchId(); + // 公网出带宽最大值,单位为 Mbit/s。取值范围:0~100。 默认值:0。 + Integer internetMaxBandwidthOut = com.aliyun.darabonbanumber.Client.parseInt(instanceConfig.getInternetMaxBandwidthOut()); + // 网络计费类型。取值范围: + // PayByBandwidth: 按固定带宽计费。 + // PayByTraffic: 按使用流量计费。 + // 默认值:PayByTraffic。 + String internetChargeType = instanceConfig.getInternetChargeType(); + // 系统盘大小 + String size = instanceConfig.getSize(); + // 系统盘的云盘种类 + String category = instanceConfig.getCategory(); + // ECS实例的计费方式 + // PrePaid:包年包月 + // PostPaid:按量付费 + String instanceChargeType = instanceConfig.getInstanceChargeType(); + + + // 批量创建实例 + return RunInstances(client, regionId, imageId, instanceType, securityGroupId, vSwitchId, internetMaxBandwidthOut, internetChargeType, size, category, instanceChargeType); + } + + /** + * RunInstances 通过备选实例规格创建ECS实例最佳实践 + * 该场景中,在调用RunInstances创建ECS实例时判断是否发生库存不足等错误,如果发生错误,将调用DescribeRecommendInstanceType查询备选实例,然后通过备选实例规格重新创建ECS实例。 + */ + public static String RunInstances(Client client, String regionId, String imageId, String instanceType, String securityGroupId, String vSwitchId, Integer internetMaxBandwidthOut, String internetChargeType, String size, String category, String instanceChargeType) throws Exception { + RunInstancesRequest request = new RunInstancesRequest() + .setRegionId(regionId) + .setImageId(imageId) + .setInstanceType(instanceType) + .setSecurityGroupId(securityGroupId) + .setVSwitchId(vSwitchId) + .setInstanceName("自动创建的实例节点") + .setDescription(new Date().toLocaleString() + " 创建的实例节点") + .setInternetMaxBandwidthOut(internetMaxBandwidthOut) + .setInternetChargeType(internetChargeType) + .setInstanceChargeType(instanceChargeType) + // 批量创建五台ECS实例,如果不设置该参数,默认创建一台ECS实例。 + // amount = 5, + // 如果缺少库存可以接受的最低创建数量。 + // minAmount = 2, + // 打开预检参数功能,不会实际创建ECS实例,只检查参数正确性、用户权限或者ECS库存等问题。 + // 实际情况下,设置了DryRun参数后,Amount必须为1,MinAmount必须为空,您可以根据实际需求修改代码。 +// .setDryRun(true) + .setDryRun(false) + .setSystemDisk(new RunInstancesRequest.RunInstancesRequestSystemDisk() + .setSize(size) + .setCategory(category)); + + + String result = ""; + try { + com.aliyun.teaconsole.Client.log("--------------------批量创建实例开始--------------------"); + RunInstancesResponse responces = client.runInstances(request); + com.aliyun.teaconsole.Client.log("--------------------创建实例成功,实例ID:" + Common.toJSONString(responces.body.instanceIdSets.instanceIdSet) + "--------------------"); + //返回实例ID + result = responces.body.instanceIdSets.instanceIdSet + "";//前后带 [] + result = UserUtil.removeBrackets(result);//前后不带[] + } catch (TeaException error) { + com.aliyun.teaconsole.Client.log("--------------------创建实例失败:" + Common.toJSONString(error.code) + "--------------------" + error.message); + } catch (Exception _error) { + TeaException error = new TeaException(_error.getMessage(), _error); + com.aliyun.teaconsole.Client.log("--------------------创建实例失败:" + Common.toJSONString(error.code) + "--------------------" + error.message); + } + return result; + } + + + //查询实例信息 + public List queryInstancesInformation(String instanceIds) { + + DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest() + .setRegionId(aliConfig.getRegionId()) + .setInstanceName("*") + .setInstanceIds(Common.toJSONString(com.aliyun.darabonbastring.Client.split(instanceIds, ",", 50))) + .setPageSize(10); + + + RuntimeOptions runtime = new RuntimeOptions(); + + + //初始化返回值 + List instances = null; + + try { + // 复制代码运行请自行打印 API 的返回值 + DescribeInstancesResponse describeInstancesResponse = client.describeInstancesWithOptions(describeInstancesRequest, runtime); + DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstances bodyInstances = describeInstancesResponse.getBody().getInstances(); + + // + instances = bodyInstances.getInstance(); + + + } catch (TeaException error) { + // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。 + // 错误 message + log.error(error.getMessage()); + // 诊断地址 + log.error(error.getData().get("Recommend").toString()); + Common.assertAsString(error.message); + } catch (Exception _error) { + TeaException error = new TeaException(_error.getMessage(), _error); + // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。 + // 错误 message + log.error(error.getMessage()); + // 诊断地址 + log.error(error.getData().get("Recommend").toString()); + Common.assertAsString(error.message); + } + return instances; + } + + +} diff --git a/src/main/java/com/loadCenter/aliyun/config/FastJson2JsonRedisSerializer.java b/src/main/java/com/loadCenter/aliyun/common/redis/configure/FastJson2JsonRedisSerializer.java similarity index 96% rename from src/main/java/com/loadCenter/aliyun/config/FastJson2JsonRedisSerializer.java rename to src/main/java/com/loadCenter/aliyun/common/redis/configure/FastJson2JsonRedisSerializer.java index 0a6bf3f..1cac045 100644 --- a/src/main/java/com/loadCenter/aliyun/config/FastJson2JsonRedisSerializer.java +++ b/src/main/java/com/loadCenter/aliyun/common/redis/configure/FastJson2JsonRedisSerializer.java @@ -1,4 +1,4 @@ -package com.loadCenter.aliyun.config; +package com.loadCenter.aliyun.common.redis.configure; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONReader; diff --git a/src/main/java/com/loadCenter/aliyun/config/RedisConfig.java b/src/main/java/com/loadCenter/aliyun/common/redis/configure/RedisConfig.java similarity index 96% rename from src/main/java/com/loadCenter/aliyun/config/RedisConfig.java rename to src/main/java/com/loadCenter/aliyun/common/redis/configure/RedisConfig.java index de3fac1..9ca9111 100644 --- a/src/main/java/com/loadCenter/aliyun/config/RedisConfig.java +++ b/src/main/java/com/loadCenter/aliyun/common/redis/configure/RedisConfig.java @@ -1,4 +1,4 @@ -package com.loadCenter.aliyun.config; +package com.loadCenter.aliyun.common.redis.configure; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; diff --git a/src/main/java/com/loadCenter/aliyun/common/redis/configure/RedisListenerConfig.java b/src/main/java/com/loadCenter/aliyun/common/redis/configure/RedisListenerConfig.java new file mode 100644 index 0000000..ed9407a --- /dev/null +++ b/src/main/java/com/loadCenter/aliyun/common/redis/configure/RedisListenerConfig.java @@ -0,0 +1,31 @@ +package com.loadCenter.aliyun.common.redis.configure; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.listener.KeyExpirationEventMessageListener; +import org.springframework.data.redis.listener.RedisMessageListenerContainer; + +/** + * @ClassName RedisListenerConfig + * @Description redis监听配置类 + * @Author ZeJinG.Su + * @Date 16:08 2024/4/19 + */ +@Configuration +public class RedisListenerConfig { + + @Bean + RedisMessageListenerContainer listenerContainer(RedisConnectionFactory redisConnectionFactory){ + RedisMessageListenerContainer container = new RedisMessageListenerContainer(); + + container.setConnectionFactory(redisConnectionFactory); + + return container; + } + + @Bean + KeyExpirationEventMessageListener redisKeyExpirationListener(RedisMessageListenerContainer listenerContainer){ + return new KeyExpirationEventMessageListener(listenerContainer); + } +} diff --git a/src/main/java/com/loadCenter/aliyun/utils/redis/RedisService.java b/src/main/java/com/loadCenter/aliyun/common/redis/service/RedisService.java similarity index 93% rename from src/main/java/com/loadCenter/aliyun/utils/redis/RedisService.java rename to src/main/java/com/loadCenter/aliyun/common/redis/service/RedisService.java index 09abed8..7ac7203 100644 --- a/src/main/java/com/loadCenter/aliyun/utils/redis/RedisService.java +++ b/src/main/java/com/loadCenter/aliyun/common/redis/service/RedisService.java @@ -1,4 +1,4 @@ -package com.loadCenter.aliyun.utils.redis; +package com.loadCenter.aliyun.common.redis.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.*; @@ -244,12 +244,26 @@ public class RedisService return redisTemplate.keys(pattern); } /** - * 获得缓存的基本对象列表 + * @ClassName RedisService + * @Description 增加序列值 + * @Author ZeJinG.Su + * @Date 16:14 2024/4/19 */ public Long increment(final String key,Long number) { return redisTemplate.opsForValue().increment(key,number); } + + /** + * @ClassName RedisService + * @Description 减少序列值 + * @Author ZeJinG.Su + * @Date 16:16 2024/4/19 + */ + public Long decrement(final String key,Long number){ + return redisTemplate.opsForValue().decrement(key,number); + } + public void deleteCacheObject(String cursor) { redisTemplate.delete(cursor); } diff --git a/src/main/java/com/loadCenter/aliyun/common/utils/MqttUtil.java b/src/main/java/com/loadCenter/aliyun/common/utils/MqttUtil.java new file mode 100644 index 0000000..4358f3a --- /dev/null +++ b/src/main/java/com/loadCenter/aliyun/common/utils/MqttUtil.java @@ -0,0 +1,55 @@ +package com.loadCenter.aliyun.common.utils; + +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.loadCenter.aliyun.gateway.model.NodeLoadNum; +import lombok.extern.java.Log; +import lombok.extern.log4j.Log4j2; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import org.springframework.stereotype.Component; + +/** + * @ClassName MqttUtil + * @Description mqtt工具类 + * @Author ZeJinG.Su + * @Date 17:04 2024/4/19 + */ +@Log4j2 +@Component +public class MqttUtil { + + public NodeLoadNum getFetchLoad(String ipName){ + Long result = 0L; + + String url = "http://"+ipName+":8080/public/cluster"; + + OkHttpClient client = new OkHttpClient(); + + Request build = new Request.Builder() + .url(url).get(). + addHeader("User-Agent","Apifox/1.0.0 (https://apifox.com)") + .addHeader("Accesstoken","").build(); + + try { + Response execute = client.newCall(build).execute(); + + JSONArray jsonArray = JSONArray.parseArray(execute.body().string()); + + JSONObject jsonObject = jsonArray.getJSONObject(0); + + JSONObject mqttInfo = jsonObject.getJSONObject("mqttInfo"); + + Integer connectSize = mqttInfo.getIntValue("connectSize"); + + result = connectSize.longValue(); + + log.info(ipName + "中连接数为:" + result); + } catch (Exception e) { + log.error(e.getMessage()); + } + + return new NodeLoadNum(ipName, result); + } +} diff --git a/src/main/java/com/loadCenter/aliyun/utils/UserUtil.java b/src/main/java/com/loadCenter/aliyun/common/utils/UserUtil.java similarity index 83% rename from src/main/java/com/loadCenter/aliyun/utils/UserUtil.java rename to src/main/java/com/loadCenter/aliyun/common/utils/UserUtil.java index f9f8f00..ea0de38 100644 --- a/src/main/java/com/loadCenter/aliyun/utils/UserUtil.java +++ b/src/main/java/com/loadCenter/aliyun/common/utils/UserUtil.java @@ -1,8 +1,8 @@ -package com.loadCenter.aliyun.utils; +package com.loadCenter.aliyun.common.utils; -import com.loadCenter.aliyun.utils.redis.RedisService; -import com.loadCenter.aliyun.utils.uuid.IdUtils; +import com.loadCenter.aliyun.common.redis.service.RedisService; +import com.loadCenter.aliyun.common.utils.uuid.IdUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; diff --git a/src/main/java/com/loadCenter/aliyun/utils/uuid/IdUtils.java b/src/main/java/com/loadCenter/aliyun/common/utils/uuid/IdUtils.java similarity index 94% rename from src/main/java/com/loadCenter/aliyun/utils/uuid/IdUtils.java rename to src/main/java/com/loadCenter/aliyun/common/utils/uuid/IdUtils.java index 4c06437..baff647 100644 --- a/src/main/java/com/loadCenter/aliyun/utils/uuid/IdUtils.java +++ b/src/main/java/com/loadCenter/aliyun/common/utils/uuid/IdUtils.java @@ -1,4 +1,4 @@ -package com.loadCenter.aliyun.utils.uuid; +package com.loadCenter.aliyun.common.utils.uuid; /** * ID生成器工具类 diff --git a/src/main/java/com/loadCenter/aliyun/utils/uuid/UUID.java b/src/main/java/com/loadCenter/aliyun/common/utils/uuid/UUID.java similarity index 99% rename from src/main/java/com/loadCenter/aliyun/utils/uuid/UUID.java rename to src/main/java/com/loadCenter/aliyun/common/utils/uuid/UUID.java index 04b6728..4605c6f 100644 --- a/src/main/java/com/loadCenter/aliyun/utils/uuid/UUID.java +++ b/src/main/java/com/loadCenter/aliyun/common/utils/uuid/UUID.java @@ -1,4 +1,4 @@ -package com.loadCenter.aliyun.utils.uuid; +package com.loadCenter.aliyun.common.utils.uuid; import java.security.MessageDigest; diff --git a/src/main/java/com/loadCenter/aliyun/controller/GatewayController.java b/src/main/java/com/loadCenter/aliyun/controller/GatewayController.java index c5cf7f1..729e7b8 100644 --- a/src/main/java/com/loadCenter/aliyun/controller/GatewayController.java +++ b/src/main/java/com/loadCenter/aliyun/controller/GatewayController.java @@ -1,9 +1,10 @@ package com.loadCenter.aliyun.controller; -import com.loadCenter.aliyun.domain.Result; +import com.loadCenter.aliyun.common.aliyun.config.Result; import com.loadCenter.aliyun.service.GatewayLoadService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -24,4 +25,9 @@ public class GatewayController { public Result loadNode(){ return Result.success(service.loadNode()); } + + @PostMapping("/getAssignedServer") + public Result getAssignedServer(){ + return service.getAssignedServer(); + } } diff --git a/src/main/java/com/loadCenter/aliyun/controller/WorkGatewayNodeController.java b/src/main/java/com/loadCenter/aliyun/controller/WorkGatewayNodeController.java index a02a60e..4c5343f 100644 --- a/src/main/java/com/loadCenter/aliyun/controller/WorkGatewayNodeController.java +++ b/src/main/java/com/loadCenter/aliyun/controller/WorkGatewayNodeController.java @@ -1,8 +1,8 @@ package com.loadCenter.aliyun.controller; -import com.loadCenter.aliyun.domain.Result; +import com.loadCenter.aliyun.common.aliyun.config.Result; import com.loadCenter.aliyun.domain.WorkGatewayNode; -import com.loadCenter.aliyun.utils.redis.RedisService; +import com.loadCenter.aliyun.common.redis.service.RedisService; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; diff --git a/src/main/java/com/loadCenter/aliyun/gateway/cache/GatewayNodeCache.java b/src/main/java/com/loadCenter/aliyun/gateway/cache/GatewayNodeCache.java index 30f4bcc..d5db210 100644 --- a/src/main/java/com/loadCenter/aliyun/gateway/cache/GatewayNodeCache.java +++ b/src/main/java/com/loadCenter/aliyun/gateway/cache/GatewayNodeCache.java @@ -19,7 +19,7 @@ public class GatewayNodeCache extends GatewayNodeCacheAbs { } /** - * 增加混村数据 + * 增加缓存数据 * @param gatewayNodeInfo 节点信息 */ public void put(GatewayNodeInfo gatewayNodeInfo){ diff --git a/src/main/java/com/loadCenter/aliyun/gateway/cache/abs/GatewayNodeCacheAbs.java b/src/main/java/com/loadCenter/aliyun/gateway/cache/abs/GatewayNodeCacheAbs.java index 3ca786f..b59aaf2 100644 --- a/src/main/java/com/loadCenter/aliyun/gateway/cache/abs/GatewayNodeCacheAbs.java +++ b/src/main/java/com/loadCenter/aliyun/gateway/cache/abs/GatewayNodeCacheAbs.java @@ -1,6 +1,6 @@ package com.loadCenter.aliyun.gateway.cache.abs; -import com.loadCenter.aliyun.utils.redis.RedisService; +import com.loadCenter.aliyun.common.redis.service.RedisService; import org.springframework.beans.factory.annotation.Autowired; public abstract class GatewayNodeCacheAbs { diff --git a/src/main/java/com/loadCenter/aliyun/gateway/model/NodeLoadNum.java b/src/main/java/com/loadCenter/aliyun/gateway/model/NodeLoadNum.java new file mode 100644 index 0000000..781ca19 --- /dev/null +++ b/src/main/java/com/loadCenter/aliyun/gateway/model/NodeLoadNum.java @@ -0,0 +1,23 @@ +package com.loadCenter.aliyun.gateway.model; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; +import lombok.experimental.SuperBuilder; +/** + * @ClassName NodeLoadNum + * @Description 负载值对象 + * @Author ZeJinG.Su + * @Date 17:08 2024/4/19 + */ +@Data +@ToString +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +public class NodeLoadNum { + private String ipName;//IP地址 + + private Long loadNum;//负载值 +} diff --git a/src/main/java/com/loadCenter/aliyun/gateway/model/NodeLoadWeight.java b/src/main/java/com/loadCenter/aliyun/gateway/model/NodeLoadWeight.java new file mode 100644 index 0000000..5801b8b --- /dev/null +++ b/src/main/java/com/loadCenter/aliyun/gateway/model/NodeLoadWeight.java @@ -0,0 +1,25 @@ +package com.loadCenter.aliyun.gateway.model; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; +import lombok.experimental.SuperBuilder; + +/** + * @ClassName NodeLoadWeight + * @Description IP权重 + * @Author ZeJinG.Su + * @Date 17:08 2024/4/19 + */ +@Data +@ToString +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +public class NodeLoadWeight { + + private String IpName;//IP地址 + + private Long weight;//权重值 +} diff --git a/src/main/java/com/loadCenter/aliyun/utils/LoadCenterController.java b/src/main/java/com/loadCenter/aliyun/job/LoadCenterController.java similarity index 94% rename from src/main/java/com/loadCenter/aliyun/utils/LoadCenterController.java rename to src/main/java/com/loadCenter/aliyun/job/LoadCenterController.java index 8f644d4..daa017c 100644 --- a/src/main/java/com/loadCenter/aliyun/utils/LoadCenterController.java +++ b/src/main/java/com/loadCenter/aliyun/job/LoadCenterController.java @@ -1,8 +1,8 @@ -package com.loadCenter.aliyun.utils; +package com.loadCenter.aliyun.job; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; -import com.loadCenter.aliyun.service.AliYunEcsService; +import com.loadCenter.aliyun.common.aliyun.service.AliYunEcsService; import lombok.extern.log4j.Log4j2; import okhttp3.OkHttpClient; import okhttp3.Request; @@ -11,7 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; -import com.loadCenter.aliyun.utils.redis.RedisService; +import com.loadCenter.aliyun.common.redis.service.RedisService; import java.util.Set; diff --git a/src/main/java/com/loadCenter/aliyun/service/AliYunEcsService.java b/src/main/java/com/loadCenter/aliyun/service/AliYunEcsService.java deleted file mode 100644 index 37f18ce..0000000 --- a/src/main/java/com/loadCenter/aliyun/service/AliYunEcsService.java +++ /dev/null @@ -1,187 +0,0 @@ -package com.loadCenter.aliyun.service; - -import com.aliyun.ecs20140526.Client; -import com.aliyun.ecs20140526.models.*; -import com.aliyun.tea.TeaException; -import com.aliyun.teautil.models.RuntimeOptions; -import com.loadCenter.aliyun.config.AliConfig; - -import com.loadCenter.aliyun.utils.UserUtil; -import com.loadCenter.aliyun.domain.EcsInstanceInfo; -import com.loadCenter.aliyun.config.InstanceConfig; -import lombok.extern.log4j.Log4j2; -import org.springframework.stereotype.Service; - -import java.util.Date; -import java.util.List; - - - -/** - * @ClassName AliYunEcsService - * @Description 阿里云实现类OpenApi调用 - * @Author ZeJinG.Su - */ -@Log4j2 -@Service -public class AliYunEcsService { - - private final AliConfig aliConfig; - private final InstanceConfig instanceConfig; - private final Client client; - - public AliYunEcsService(AliConfig aliConfig, InstanceConfig instanceConfig, Client client) { - this.aliConfig = aliConfig; - this.instanceConfig = instanceConfig; - this.client = client; - } - - - /** - * RunInstances 通过备选实例规格创建ECS实例最佳实践 - */ - public String runInstances() throws Exception { - - RunInstancesRequest request = new RunInstancesRequest() - .setRegionId(aliConfig.getRegionId()) - .setImageId(instanceConfig.getImageId()) - .setInstanceType(instanceConfig.getInstanceType()) - .setSecurityGroupId(instanceConfig.getSecurityGroupId()) - .setVSwitchId(instanceConfig.getVSwitchId()) - .setInstanceName("gateway:node") - .setDescription(new Date().toLocaleString() + " 创建的实例节点") - .setInternetMaxBandwidthOut(Integer.valueOf(instanceConfig.getInternetMaxBandwidthOut())) - .setInternetChargeType(instanceConfig.getInternetChargeType()) - .setInstanceChargeType(instanceConfig.getInstanceChargeType()) - // 批量创建五台ECS实例,如果不设置该参数,默认创建一台ECS实例。 - // amount = 5, - // 如果缺少库存可以接受的最低创建数量。 - // minAmount = 2, - // 打开预检参数功能,不会实际创建ECS实例,只检查参数正确性、用户权限或者ECS库存等问题。 - // 实际情况下,设置了DryRun参数后,Amount必须为1,MinAmount必须为空,您可以根据实际需求修改代码。 - // .setDryRun(true) - .setDryRun(false) - .setSystemDisk(new RunInstancesRequest.RunInstancesRequestSystemDisk() - .setSize(instanceConfig.getSize()) - .setCategory(instanceConfig.getCategory())); - - - String result = ""; - try { - com.aliyun.teaconsole.Client.log("--------------------批量创建实例开始--------------------"); - RunInstancesResponse responces = client.runInstances(request); - com.aliyun.teaconsole.Client.log("--------------------创建实例成功,实例ID:" + com.aliyun.teautil.Common.toJSONString(responces.body.instanceIdSets.instanceIdSet) + "--------------------"); - //返回实例ID - result = responces.body.instanceIdSets.instanceIdSet + "";//前后带 [] - result = UserUtil.removeBrackets(result);//前后不带[] - } catch (TeaException error) { - com.aliyun.teaconsole.Client.log("--------------------创建实例失败:" + com.aliyun.teautil.Common.toJSONString(error.code) + "--------------------" + error.message); - } catch (Exception _error) { - TeaException error = new TeaException(_error.getMessage(), _error); - com.aliyun.teaconsole.Client.log("--------------------创建实例失败:" + com.aliyun.teautil.Common.toJSONString(error.code) + "--------------------" + error.message); - } - return result; - } - - - /** - * 传入实例ID - */ - public EcsInstanceInfo selectList(String instanceId) throws Exception { - - DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest() - .setRegionId(aliConfig.getRegionId()) - .setInstanceName("*") - .setInstanceIds(com.aliyun.teautil.Common.toJSONString(com.aliyun.darabonbastring.Client.split(instanceId, ",", 50))) - .setPageSize(10); - - - //初始化返回值 - List instanceList = null; - - - try { - - // 复制代码运行请自行打印 API 的返回值 - DescribeInstancesResponse describeInstancesResponse = client.describeInstancesWithOptions(describeInstancesRequest, new RuntimeOptions()); - DescribeInstancesResponseBody body = describeInstancesResponse.getBody(); - DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstances instances = body.getInstances(); - - instanceList = instances.getInstance(); - - if (instanceList == null || instanceList.isEmpty()){ - return new EcsInstanceInfo(); - } - - - EcsInstanceInfo ecsInstanceInfo = new EcsInstanceInfo(); - instanceList.forEach(item -> { - - ecsInstanceInfo.setInstanceName(item.getInstanceName()); - - ecsInstanceInfo.setInstanceId(item.getInstanceId()); - - ecsInstanceInfo.setStatus(item.status); - - ecsInstanceInfo.setPublicIpAddress(UserUtil.removeBrackets(item.getPublicIpAddress().getIpAddress().toString())); - - ecsInstanceInfo.setRecyclable(item.getRecyclable()); - - ecsInstanceInfo.setPrivateIpAddress(item.getVpcAttributes().getPrivateIpAddress().ipAddress.toString()); - - }); - return ecsInstanceInfo; - - } catch (TeaException error) { - log.error("code:[{}], message: [{}],data: [{}]",error.getCode(),error.getMessage(),error.getData()); - // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。 - // 错误 message - System.out.println(error.getMessage()); - // 诊断地址 - System.out.println(error.getData().get("Recommend")); - com.aliyun.teautil.Common.assertAsString(error.message); - } catch (Exception _error) { - TeaException error = new TeaException(_error.getMessage(), _error); - - log.error("message: [{}]",_error.getMessage(),_error); - // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。 - // 错误 message - System.out.println(error.getMessage()); - // 诊断地址 - System.out.println(error.getData().get("Recommend")); - com.aliyun.teautil.Common.assertAsString(error.message); - } - - return new EcsInstanceInfo(); - } - - /** - * 删除实例 - */ - - public void deleteEcs(String instanceId) throws Exception { - - DeleteInstancesRequest deleteInstancesRequest = new DeleteInstancesRequest() - .setRegionId(aliConfig.getRegionId()) - .setDryRun(false) - .setForce(true) - .setTerminateSubscription(false) - .setInstanceId(java.util.Arrays.asList( instanceId)); - - try { - // 复制代码运行请自行打印 API 的返回值 - client.deleteInstancesWithOptions(deleteInstancesRequest, new RuntimeOptions()); - } catch (TeaException error) { - log.error("code:[{}], message: [{}],data: [{}]",error.getCode(),error.getMessage(),error.getData()); - log.info(error); - log.info(error.getData().get("Recommend")); - com.aliyun.teautil.Common.assertAsString(error); - } catch (Exception _error) { - TeaException error = new TeaException(_error.getMessage(), _error); - log.error("message: [{}]",_error.getMessage()); - } - } - - - -} diff --git a/src/main/java/com/loadCenter/aliyun/service/GatewayLoadService.java b/src/main/java/com/loadCenter/aliyun/service/GatewayLoadService.java index f349e42..417c95f 100644 --- a/src/main/java/com/loadCenter/aliyun/service/GatewayLoadService.java +++ b/src/main/java/com/loadCenter/aliyun/service/GatewayLoadService.java @@ -1,4 +1,7 @@ package com.loadCenter.aliyun.service; + +import com.loadCenter.aliyun.common.aliyun.config.Result; + /** * @ClassName GatewayLoadService * @Description 网关负载业务 @@ -12,4 +15,6 @@ public interface GatewayLoadService { */ String loadNode(); + Result getAssignedServer(); + } diff --git a/src/main/java/com/loadCenter/aliyun/service/impl/GatewayLoadServiceImpl.java b/src/main/java/com/loadCenter/aliyun/service/impl/GatewayLoadServiceImpl.java index 00aec66..35d1bb6 100644 --- a/src/main/java/com/loadCenter/aliyun/service/impl/GatewayLoadServiceImpl.java +++ b/src/main/java/com/loadCenter/aliyun/service/impl/GatewayLoadServiceImpl.java @@ -1,6 +1,7 @@ package com.loadCenter.aliyun.service.impl; +import com.loadCenter.aliyun.common.aliyun.config.Result; import com.loadCenter.aliyun.gateway.cache.GatewayLoadNodeCache; import com.loadCenter.aliyun.gateway.cache.GatewayLoadSeriesCache; import com.loadCenter.aliyun.gateway.cache.GatewayNodeCache; @@ -30,6 +31,10 @@ public class GatewayLoadServiceImpl implements GatewayLoadService { */ private final GatewayNodeCache gatewayNodeCache; + /** + * 获得负载节点外网地址 + * @return + */ @Override public String loadNode() { Long seriesLoad = gatewayLoadSeriesCache.incrementAndGet(); @@ -40,7 +45,14 @@ public class GatewayLoadServiceImpl implements GatewayLoadService { GatewayNodeInfo gatewayNodeInfo = gatewayNodeCache.get(loadNodeId); - + //返回外网节点 return gatewayNodeInfo.getPublicIdAddress(); } + + @Override + public Result getAssignedServer() { + + + return null; + } } diff --git a/src/main/java/com/loadCenter/aliyun/vehicle/VehicleOnLine.java b/src/main/java/com/loadCenter/aliyun/vehicle/VehicleOnLine.java index 360cf45..b9b9d99 100644 --- a/src/main/java/com/loadCenter/aliyun/vehicle/VehicleOnLine.java +++ b/src/main/java/com/loadCenter/aliyun/vehicle/VehicleOnLine.java @@ -2,7 +2,7 @@ package com.loadCenter.aliyun.vehicle; import com.loadCenter.aliyun.domain.WorkGatewayNode; -import com.loadCenter.aliyun.utils.redis.RedisService; +import com.loadCenter.aliyun.common.redis.service.RedisService; import java.util.ArrayList; import java.util.List; diff --git a/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..8192759 --- /dev/null +++ b/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1,2 @@ +com.loadCenter.aliyun.common.redis.configure.RedisConfig +com.loadCenter.aliyun.common.redis.service.RedisService diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 2d8c688..e1391fb 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -8,7 +8,6 @@ Spring: port: 6379 password: fffdev - config: ali: access-key-id: LTAI5tK42WuqUEhmHLitVHt1 diff --git a/src/test/java/Test1.java b/src/test/java/Test1.java index aeabc42..9e52a39 100644 --- a/src/test/java/Test1.java +++ b/src/test/java/Test1.java @@ -1,6 +1,6 @@ import com.loadCenter.aliyun.LoadCenterApplication; import com.loadCenter.aliyun.domain.WorkGatewayNode; -import com.loadCenter.aliyun.utils.redis.RedisService; +import com.loadCenter.aliyun.common.redis.service.RedisService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest;