From 1d9b29975370d18e5be913c50429e7082ddaea9e Mon Sep 17 00:00:00 2001
From: lijiayao <13831655+xiao-yao-charge-forward@user.noreply.gitee.com>
Date: Thu, 18 Apr 2024 19:13:05 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BC=A0=E5=85=A5=E4=B8=BB=E5=88=86=E6=94=AF?=
=?UTF-8?q?=EF=BC=8C=E5=9C=A8=E5=88=86=E6=94=AF=E4=B8=8A=E4=BF=AE=E6=94=B9?=
=?UTF-8?q?=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.gitignore | 2 +-
pom.xml | 6 +-
.../com/yao/common/aliy/AliYunEcsService.java | 257 ++++++++++++++++++
.../yao/common/aliy/model/EcsSelectModel.java | 24 ++
.../common/config/AlyConfigProperties.java | 79 ++++++
.../java/com/yao/common/config/Alyconfig.java | 9 -
.../com/yao/common/config/ClientService.java | 30 --
.../common/config/GetInstanceProperties.java | 148 ----------
.../com/yao/common/domain/ApifoxModel.java | 55 ----
.../java/com/yao/common/domain/CPUInfo.java | 30 --
.../java/com/yao/common/domain/FlowInfo.java | 28 --
.../java/com/yao/common/domain/JVMInfo.java | 58 ----
.../java/com/yao/common/domain/MqttInfo.java | 62 -----
.../domain/{ => aliy}/InstanceInfo.java | 43 ++-
.../domain/{ => aliy}/InstanceRequest.java | 6 +-
.../yao/common/mqtt/MqttConnectService.java | 55 ++++
.../common/redis/configure/RedisConfig.java | 1 -
.../common/redis/service/RedisService.java | 12 +
.../yao/gateWay/cache/GateWayNodeInfo.java | 32 +++
.../gateWay/cache/GatewayLoadNodeCache.java | 48 ++++
.../gateWay/cache/GatewayLoadSeriesCache.java | 50 ++++
.../yao/gateWay/cache/GatewayNodeCache.java | 44 +++
.../gateWay/cache/GatewayNodeScoreCache.java | 19 ++
.../gateWay/cache/GatewayNodeSetVinCache.java | 13 +
.../cache/GatewayVehicleLineNodeCache.java | 9 +
.../cache/abs/GatewayNodeAbstract.java | 21 ++
src/main/java/com/yao/server/add/Sample.java | 114 --------
.../server/controller/GatewayController.java | 29 ++
.../com/yao/server/delete/DeleteSample.java | 78 ------
.../server/service/GatewayLoadService.java | 16 ++
.../service/impl/GatewayLoadServiceImpl.java | 42 +++
.../server/service/impl/LoadServiceImpl.java | 64 ++---
.../java/com/yao/server/test/QueryIp.java | 40 ++-
src/main/java/com/yao/server/test/Test.java | 5 +-
src/main/java/com/yao/server/timer/Timer.java | 139 +++++-----
src/main/resources/application.yml | 23 ++
36 files changed, 936 insertions(+), 755 deletions(-)
create mode 100644 src/main/java/com/yao/common/aliy/AliYunEcsService.java
create mode 100644 src/main/java/com/yao/common/aliy/model/EcsSelectModel.java
create mode 100644 src/main/java/com/yao/common/config/AlyConfigProperties.java
delete mode 100644 src/main/java/com/yao/common/config/Alyconfig.java
delete mode 100644 src/main/java/com/yao/common/config/ClientService.java
delete mode 100644 src/main/java/com/yao/common/config/GetInstanceProperties.java
delete mode 100644 src/main/java/com/yao/common/domain/ApifoxModel.java
delete mode 100644 src/main/java/com/yao/common/domain/CPUInfo.java
delete mode 100644 src/main/java/com/yao/common/domain/FlowInfo.java
delete mode 100644 src/main/java/com/yao/common/domain/JVMInfo.java
delete mode 100644 src/main/java/com/yao/common/domain/MqttInfo.java
rename src/main/java/com/yao/common/domain/{ => aliy}/InstanceInfo.java (56%)
rename src/main/java/com/yao/common/domain/{ => aliy}/InstanceRequest.java (83%)
create mode 100644 src/main/java/com/yao/common/mqtt/MqttConnectService.java
create mode 100644 src/main/java/com/yao/gateWay/cache/GateWayNodeInfo.java
create mode 100644 src/main/java/com/yao/gateWay/cache/GatewayLoadNodeCache.java
create mode 100644 src/main/java/com/yao/gateWay/cache/GatewayLoadSeriesCache.java
create mode 100644 src/main/java/com/yao/gateWay/cache/GatewayNodeCache.java
create mode 100644 src/main/java/com/yao/gateWay/cache/GatewayNodeScoreCache.java
create mode 100644 src/main/java/com/yao/gateWay/cache/GatewayNodeSetVinCache.java
create mode 100644 src/main/java/com/yao/gateWay/cache/GatewayVehicleLineNodeCache.java
create mode 100644 src/main/java/com/yao/gateWay/cache/abs/GatewayNodeAbstract.java
delete mode 100644 src/main/java/com/yao/server/add/Sample.java
create mode 100644 src/main/java/com/yao/server/controller/GatewayController.java
delete mode 100644 src/main/java/com/yao/server/delete/DeleteSample.java
create mode 100644 src/main/java/com/yao/server/service/GatewayLoadService.java
create mode 100644 src/main/java/com/yao/server/service/impl/GatewayLoadServiceImpl.java
diff --git a/.gitignore b/.gitignore
index b987916..645b107 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,7 +4,7 @@ target/
!**/src/test/**/target/
### IntelliJ IDEA ###
-/.idea
+.idea/
*.iws
*.iml
*.ipr
diff --git a/pom.xml b/pom.xml
index eaf1a59..5d69450 100644
--- a/pom.xml
+++ b/pom.xml
@@ -59,8 +59,10 @@
2.0.47
-
-
+
+ org.apache.commons
+ commons-pool2
+
diff --git a/src/main/java/com/yao/common/aliy/AliYunEcsService.java b/src/main/java/com/yao/common/aliy/AliYunEcsService.java
new file mode 100644
index 0000000..8366f9c
--- /dev/null
+++ b/src/main/java/com/yao/common/aliy/AliYunEcsService.java
@@ -0,0 +1,257 @@
+package com.yao.common.aliy;
+
+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.yao.common.aliy.model.EcsSelectModel;
+import com.yao.common.config.AlyConfigProperties;
+import com.yao.common.domain.aliy.InstanceInfo;
+import com.yao.common.domain.aliy.InstanceRequest;
+import com.yao.common.redis.service.RedisService;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Author: LiJiaYao
+ * @Date: 2024/4/16
+ * @Description: 阿里云ECS服务器openAPI调用
+ */
+@Component
+@Log4j2
+public class AliYunEcsService {
+
+ @Autowired
+ private RedisService redisService;
+ private final AlyConfigProperties alyConfigProperties;
+ private final Client client;
+
+ public AliYunEcsService(AlyConfigProperties alyConfigProperties, Client client) {
+ this.alyConfigProperties = alyConfigProperties;
+ this.client = client;
+ }
+
+ //todo----------------------------------------------------以下是查询代码--------------------------------------------
+
+ /**
+ * @param
+ * @return
+ * @throws Exception
+ * @Description: 根据id和name查询内容
+ */
+ public List selectList(EcsSelectModel ecsSelectModel) throws Exception {
+ DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest()
+ .setRegionId(alyConfigProperties.getRegionId());
+ if (ecsSelectModel.getInstanceNameList() == null || ecsSelectModel.getInstanceNameList().isEmpty()) {
+ 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()));
+ }
+ describeInstancesRequest.setPageSize(10);
+
+ RuntimeOptions runtime = new RuntimeOptions();
+
+ //初始化返回值
+ List instanceList = null;
+
+ try {
+ // 复制代码运行请自行打印 API 的返回值
+ DescribeInstancesResponse describeInstancesResponse = client.describeInstancesWithOptions(describeInstancesRequest, runtime);
+ DescribeInstancesResponseBody body = describeInstancesResponse.getBody();
+ DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstances instances = body.getInstances();
+ //能返回的值
+ instanceList = instances.getInstance();
+ if (instanceList == null || instanceList.isEmpty()) {
+ return new ArrayList<>();
+ }
+ return instanceList.stream()
+ .map(instance -> {
+ return InstanceInfo.builder()
+ .instanceId(instance.getInstanceId())
+ .instanceName(instance.getInstanceName())
+ .status(instance.getStatus())
+ .publicIpAddress(instance.getPublicIpAddress().getIpAddress().toString())
+ .privateIpAddress(instance.getVpcAttributes().getPrivateIpAddress().ipAddress.toString())
+ .recyclable(instance.getRecyclable())
+ .creationTime(instance.creationTime)
+ .build();
+
+ }).toList();
+ } catch (TeaException error) {
+ // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
+ // 错误 message
+ log.error("状态码是:[{}],信息是:[{}],返回的结果是:[{}]", error.getCode(), error.getMessage(), error);
+ } catch (Exception _error) {
+ TeaException error = new TeaException();
+ log.error("code:[{}],信息是:[{}],返回的结果是:[{}]",error.getCode(), error.getMessage(), error);
+ }
+
+ return new ArrayList<>();
+ }
+
+ //todo----------------------------------------------------以下是新增代码--------------------------------------------
+
+ /**
+ * 新增实列
+ */
+ /**
+ * initialization 初始化公共请求参数
+ */
+ public List startCreate() throws Exception {
+ // 公网出带宽最大值,单位为 Mbit/s。取值范围:0~100。 默认值:0。
+ Integer internetMaxBandwidthOut = com.aliyun.darabonbanumber.Client.parseInt("5");
+ // 批量创建实例
+ List s = RunInstances(
+ client, alyConfigProperties.getRegionId(), alyConfigProperties.getImageId(), alyConfigProperties.getInstanceType(),
+ alyConfigProperties.getSecurityGroupId(), alyConfigProperties.getVSwitchId(), internetMaxBandwidthOut,
+ alyConfigProperties.getInternetChargeType(), alyConfigProperties.getSize(), alyConfigProperties.getCategory(),
+ alyConfigProperties.getInstanceChargeType());
+ //切割成一个string类型的数据
+// String id = s.substring(2, s.length()-2).replace("\"", "");
+ EcsSelectModel ecsSelectModel = new EcsSelectModel();
+ ecsSelectModel.setInstanceIdList(s);
+ List list = selectList(ecsSelectModel);
+ list.forEach(
+ item -> {
+ String publicIP = item.getPublicIpAddress().substring(1, item.getPublicIpAddress().length() - 1);
+ item.setPublicIpAddress(publicIP);
+ redisService.setCacheSet("new:real:column", item);
+ log.info("公网IP:" + item.getPublicIpAddress());
+ }
+ );
+ return s;
+ }
+
+ /**
+ * RunInstances 通过备选实例规格创建ECS实例最佳实践
+ * 该场景中,在调用RunInstances创建ECS实例时判断是否发生库存不足等错误,如果发生错误,将调用DescribeRecommendInstanceType查询备选实例,然后通过备选实例规格重新创建ECS实例。
+ */
+ public List 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 {
+ RunInstancesResponse responces =null;
+ int i = 0;
+ RunInstancesRequest request1 = new RunInstancesRequest()
+ .setRegionId(regionId)
+ .setImageId(imageId)
+ .setInstanceType(instanceType)
+ .setSecurityGroupId(securityGroupId)
+ .setVSwitchId(vSwitchId)
+ .setInstanceName("MyFirstEcsInstance")
+ .setDescription("MyFirstEcsInstance")
+ .setInternetMaxBandwidthOut(internetMaxBandwidthOut)
+ .setInternetChargeType(internetChargeType)
+ .setInstanceChargeType(instanceChargeType)
+ // 批量创建五台ECS实例,如果不设置该参数,默认创建一台ECS实例。
+ // amount = 5,
+ // 如果缺少库存可以接受的最低创建数量。
+ // minAmount = 2,
+ // 打开预检参数功能,不会实际创建ECS实例,只检查参数正确性、用户权限或者ECS库存等问题。
+ // 实际情况下,设置了DryRun参数后,Amount必须为1,MinAmount必须为空,您可以根据实际需求修改代码。
+ .setDryRun(false)
+ .setSystemDisk(new RunInstancesRequest.RunInstancesRequestSystemDisk()
+ .setSize(size)
+ .setCategory(category));
+ try {
+ com.aliyun.teaconsole.Client.log("--------------------批量创建实例开始--------------------");
+ responces = client.runInstances(request1);
+ com.aliyun.teaconsole.Client.log("--------------------创建实例成功,实例ID:" + (responces.body.instanceIdSets.instanceIdSet) + "--------------------");
+ i++;
+ } catch (TeaException error) {
+ com.aliyun.teaconsole.Client.log("--------------------创建实例失败:" + Common.toJSONString(error.message) + "--------------------");
+ } catch (Exception _error) {
+ TeaException error = new TeaException(_error.getMessage(), _error);
+ com.aliyun.teaconsole.Client.log("--------------------创建实例失败:" + Common.toJSONString(error.message) + "--------------------");
+ }
+ return responces.body.instanceIdSets.instanceIdSet;
+ }
+ //todo----------------------------------------------------以下是删除代码----------------------------------------------
+ /**
+ * 删除
+ */
+ public DescribeInstancesResponse describeInstances(Client client,String regionId,String instanceIds,String instanceName) {
+ DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest()
+ .setRegionId(regionId)
+ .setInstanceName(instanceName);
+ if (!Common.empty(instanceIds)){
+ describeInstancesRequest.instanceIds = Common.toJSONString(com.aliyun.darabonbastring.Client.split(instanceIds, ",", 50));
+ }
+ DescribeInstancesResponse resq = null;
+ try {
+ resq = client.describeInstances(describeInstancesRequest);
+ com.aliyun.teaconsole.Client.log("--------------------查询需要删除的实例--------------------");
+ return resq;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+
+ }
+
+ public void modifyInstanceAttribute(Client client,String instatnceId) {
+ ModifyInstanceAttributeRequest req = new ModifyInstanceAttributeRequest()
+ .setInstanceId(instatnceId)
+ .setDeletionProtection(false)
+ ;
+ try {
+ client.modifyInstanceAttribute(req);
+ com.aliyun.teaconsole.Client.log("--------------------"+instatnceId+"释放保护成功--------------------");
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public void deleteInstances(Client client, String regionId, String instanceIds, String force) {
+ DeleteInstancesRequest req = new DeleteInstancesRequest()
+ .setRegionId(regionId)
+ .setInstanceId(com.aliyun.darabonbastring.Client.split(instanceIds, ",", 50))
+ .setForce(Common.equalString(force, "true"));
+ DeleteInstancesResponse resp = null;
+ try {
+ resp = client.deleteInstances(req);
+ com.aliyun.teaconsole.Client.log("--------------------实例释放成功--------------------");
+ com.aliyun.teaconsole.Client.log(Common.toJSONString(Common.toMap(resp)));
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+
+ }
+
+ public String delete (String instanceIds) {
+ //实例名称
+ String instanceName = "MyFirstEcsInstance";
+ //强制删除有删除保护的机器
+ String deleteProtected = "true";
+ //强制删除运行中的机器
+ String force = "true";
+
+ if (Common.equalString(deleteProtected,"true")){
+ DescribeInstancesResponse describeInstances = describeInstances(client, alyConfigProperties.getRegionId(), instanceIds, instanceName);
+ instanceIds="";
+ for (DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstance instance : describeInstances.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)){
+ try {
+ com.aliyun.teaconsole.Client.log("--------------------无有效实例可删除--------------------");
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ deleteInstances(client,alyConfigProperties.getRegionId(),instanceIds,force);
+ return instanceIds;
+ }
+}
diff --git a/src/main/java/com/yao/common/aliy/model/EcsSelectModel.java b/src/main/java/com/yao/common/aliy/model/EcsSelectModel.java
new file mode 100644
index 0000000..84ab61f
--- /dev/null
+++ b/src/main/java/com/yao/common/aliy/model/EcsSelectModel.java
@@ -0,0 +1,24 @@
+package com.yao.common.aliy.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @Author: LiJiaYao
+ * @Date: 2024/4/16
+ * @Description: 查询模型
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class EcsSelectModel {
+
+ private List instanceIdList;
+ private List instanceNameList;
+
+}
diff --git a/src/main/java/com/yao/common/config/AlyConfigProperties.java b/src/main/java/com/yao/common/config/AlyConfigProperties.java
new file mode 100644
index 0000000..ae3b645
--- /dev/null
+++ b/src/main/java/com/yao/common/config/AlyConfigProperties.java
@@ -0,0 +1,79 @@
+package com.yao.common.config;
+
+import com.aliyun.ecs20140526.Client;
+import com.aliyun.teaopenapi.models.Config;
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @Author: LiJiaYao
+ * @Date: 2024/4/16
+ * @Description: 阿里云配置
+ */
+@Configuration
+@ConfigurationProperties(prefix = "config.aly")
+@Data
+public class AlyConfigProperties {
+
+ private String accessKeyId;
+ private String accessKeySecret;
+ /**
+ * 地域id
+ */
+ private String regionId;
+ private String imageId;
+
+ /*
+ 实列规格
+ */
+ private String instanceType;
+ /**
+ * 安全组
+ */
+ private String securityGroupId;
+ /**
+ * 虚拟交换机
+ */
+ private String vSwitchId;
+
+ /**
+ * 网络计费类型
+ */
+ private String internetChargeType;
+ /**
+ * 系统盘大小
+ */
+ private String size;
+ /**
+ * 系统盘的云盘种类
+ */
+ private String category;
+ //ECS实例的计费方式
+ private String instanceChargeType;
+
+ /**
+ * @param alyConfig
+ * @return
+ * @throws Exception
+ * @Description: 创建一个单例
+ */
+ @Bean
+ public Client createEcsClient(AlyConfigProperties alyConfig) throws Exception {
+ Config config = new Config()
+ // 您的AccessKey ID
+ .setAccessKeyId(alyConfig.getAccessKeyId())
+ // 您的AccessKey Secret
+ .setAccessKeySecret(alyConfig.getAccessKeySecret())
+ // 您的可用区ID
+ .setRegionId(alyConfig.getRegionId());
+ return new Client(config);
+ }
+
+
+
+
+
+
+}
diff --git a/src/main/java/com/yao/common/config/Alyconfig.java b/src/main/java/com/yao/common/config/Alyconfig.java
deleted file mode 100644
index 4091cbc..0000000
--- a/src/main/java/com/yao/common/config/Alyconfig.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.yao.common.config;
-
-/**
- * @Author: LiJiaYao
- * @Date: 2024/4/16
- * @Description: 阿里云配置
- */
-public class Alyconfig {
-}
diff --git a/src/main/java/com/yao/common/config/ClientService.java b/src/main/java/com/yao/common/config/ClientService.java
deleted file mode 100644
index 80f20d9..0000000
--- a/src/main/java/com/yao/common/config/ClientService.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.yao.common.config;
-
-import com.aliyun.teaopenapi.models.Config;
-
-/**
- * @Author: LiJiaYao
- * @Date: 2024/4/13
- * @Description:
- */
-public class ClientService {
- /*
- * @Author: LiuYunHu
- * @Date: 2024/4/13 9:52
- * @Description: 初始化公共请求参数
- * @Param:
- * @Return:
- **/
-
- public static com.aliyun.ecs20140526.Client createEcsClient(String regionId) throws Exception {
- Config config = new Config()
- // 您的AccessKey ID
- .setAccessKeyId("LTAI5t7kDVgLdPETn9TXjFaaW")
- // 您的AccessKey Secret
- .setAccessKeySecret("79UjUBiwoQgADVyJjrOXa9B4KVJn0lS")
- // 您的可用区ID
- .setRegionId(regionId);
- return new com.aliyun.ecs20140526.Client(config);
- }
-
-}
diff --git a/src/main/java/com/yao/common/config/GetInstanceProperties.java b/src/main/java/com/yao/common/config/GetInstanceProperties.java
deleted file mode 100644
index 0f205ed..0000000
--- a/src/main/java/com/yao/common/config/GetInstanceProperties.java
+++ /dev/null
@@ -1,148 +0,0 @@
-package com.yao.common.config;
-
-import com.aliyun.ecs20140526.Client;
-import com.aliyun.ecs20140526.models.DescribeInstancesRequest;
-import com.aliyun.ecs20140526.models.DescribeInstancesResponse;
-import com.aliyun.ecs20140526.models.DescribeInstancesResponseBody;
-import com.aliyun.tea.TeaException;
-import com.aliyun.teautil.Common;
-import com.aliyun.teautil.models.RuntimeOptions;
-import com.yao.common.domain.InstanceInfo;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @Author: LiJiaYao
- * @Date: 2024/4/13
- * @Description:
- */
-@Component
-public class GetInstanceProperties {
-
- static int i = 1;
-
- /*
- * @Author: LiuYunHu
- * @Date: 2024/4/13 11:01
- * @Description: 实例ID 用 英文逗号拼接
- * @Param: [instanceIds] i-uf6chlqotgoc9h173alu
- * @Return: void
- **/
- public static List startGet(String instanceIds) throws Exception {
- // 地域Id
- String regionId = "cn-shanghai";
-
- Client client = ClientService.createEcsClient(regionId);
- DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest()
- .setRegionId(regionId)
- .setInstanceName("*")
- .setInstanceIds(com.aliyun.teautil.Common.toJSONString(com.aliyun.darabonbastring.Client.split(instanceIds, ",", 50)))
- .setPageSize(10);
-
- RuntimeOptions runtime = new RuntimeOptions();
-
- //初始化返回值
- List instance = null;
-
- try {
- // 复制代码运行请自行打印 API 的返回值
- DescribeInstancesResponse describeInstancesResponse = client.describeInstancesWithOptions(describeInstancesRequest, runtime);
- DescribeInstancesResponseBody body = describeInstancesResponse.getBody();
- DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstances instances = body.getInstances();
- //能返回的值
- instance = instances.getInstance();
- instance.forEach(item -> {
- System.out.println("实例{" + i + "}的ID:" + item.getInstanceId());
- System.out.println("名称:" + item.getInstanceName());
- System.out.println("地域ID:" + item.getRegionId());
- System.out.println("状态:" + item.getStatus());
- System.out.println("类型:" + item.getInstanceType());
- System.out.println("CPU核心数:" + item.getCpu());
- System.out.println("内存大小:" + item.getMemory() + "MB");
- System.out.println("磁盘大小:" + item.getLocalStorageCapacity() + "G");
- System.out.println("操作系统:" + item.getOSName());
- System.out.println("网络类型:" + item.getInstanceNetworkType());
- System.out.println("公网出带宽值:" + item.getInternetMaxBandwidthOut() + "Mbit/s");
- System.out.println("公网入带宽值:" + item.getInternetMaxBandwidthIn() + "Mbit/s");
- System.out.println("公网IP:" + item.getPublicIpAddress().getIpAddress().toString());
- System.out.println("私网IP:" + item.getVpcAttributes().getPrivateIpAddress().ipAddress.toString());
- System.out.println("专有网络VPCID:" + item.getVpcAttributes().getVpcId());
-// System.out.println("安全组ID:" + UserUtil.removeBrackets(item.getSecurityGroupIds().getSecurityGroupId().toString()));
- System.out.println("创建时间:" + item.getCreationTime());
- System.out.println("到期时间:" + item.getExpiredTime());
- System.out.println("是否可以回收:" + (item.getRecyclable() ? "是" : "否") + "\n\n");
- System.out.println("---------------------");
- i++;
- });
- } catch (TeaException error) {
- // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
- // 错误 message
- System.out.println(error.getMessage());
- // 诊断地址
- System.out.println(error.getData().get("Recommend"));
- Common.assertAsString(error.message);
- } catch (Exception _error) {
- TeaException error = new TeaException(_error.getMessage(), _error);
- // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
- // 错误 message
- System.out.println(error.getMessage());
- // 诊断地址
- System.out.println(error.getData().get("Recommend"));
- Common.assertAsString(error.message);
- }
- return instance;
- }
-
-
- public static List selectECS(String instanceName) {
- Client client = null;
- List instanceInfos = new ArrayList<>(); // 用于存储查询到的实例信息
-
- try {
- client = ClientService.createEcsClient("cn-shanghai");
- com.aliyun.ecs20140526.models.DescribeInstancesRequest describeInstancesRequest = new com.aliyun.ecs20140526.models.DescribeInstancesRequest()
- .setRegionId("cn-shanghai")
- .setInstanceName(instanceName)
- .setPageSize(10);
-
- com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
-
-
- DescribeInstancesResponse describeInstancesResponse = client.describeInstancesWithOptions(describeInstancesRequest, runtime);
- DescribeInstancesResponseBody body = describeInstancesResponse.getBody();
- DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstances instances = body.getInstances();
- List instanceList = instances.getInstance();
-
- // 修改 selectECS 方法中 IP 地址的处理部分
- for (DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstance item : instanceList) {
- InstanceInfo instanceInfo = new InstanceInfo();
- instanceInfo.setInstanceId(item.getInstanceId());
- instanceInfo.setInstanceName(item.getInstanceName());
- // 将 IP 地址对象转换为字符串,并存储到 InstanceInfo 对象中
- // 在您的代码中将 IP 地址转换为字符串的部分可以改为以下方式
-
-
- String publicIpAddress = item.getPublicIpAddress().getIpAddress().toString();
-// 去掉方括号
- publicIpAddress = publicIpAddress.substring(1, publicIpAddress.length() - 1);
- instanceInfo.setPublicIpAddress(publicIpAddress);
-
- String privateIpAddress = item.getVpcAttributes().getPrivateIpAddress().ipAddress.toString();
-// 去掉方括号
- privateIpAddress = privateIpAddress.substring(1, privateIpAddress.length() - 1);
- instanceInfo.setPrivateIpAddress(privateIpAddress);
- instanceInfos.add(instanceInfo);
- }
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
-
-
- return instanceInfos;
- }
-
-
-}
-
diff --git a/src/main/java/com/yao/common/domain/ApifoxModel.java b/src/main/java/com/yao/common/domain/ApifoxModel.java
deleted file mode 100644
index e9b907f..0000000
--- a/src/main/java/com/yao/common/domain/ApifoxModel.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.yao.common.domain;
-
-import lombok.Data;
-
-@Data
-public class ApifoxModel {
- /**
- * 节点ID
- */
- private String clusterId;
- /**
- * CPU使用信息
- */
- private CPUInfo cpuInfo;
- /**
- * 节点状态
- */
- private FlowInfo flowInfo;
- /**
- * HTTP请求地址
- */
- private String httpUrl;
- /**
- * JVM使用信息
- */
- private JVMInfo jvmInfo;
- /**
- * MQTT事件信息
- */
- private MqttInfo mqttInfo;
- /**
- * MQTTS请求地址
- */
- private String mqttsUrl;
- /**
- * MQTT请求地址
- */
- private String mqttUrl;
- /**
- * 节点名称
- */
- private String nodeName;
- /**
- * 启动时间
- */
- private String startJvmTime;
- /**
- * 节点版本
- */
- private String version;
- /**
- * websocket请求地址
- */
- private String websocketUrl;
-}
diff --git a/src/main/java/com/yao/common/domain/CPUInfo.java b/src/main/java/com/yao/common/domain/CPUInfo.java
deleted file mode 100644
index 6189954..0000000
--- a/src/main/java/com/yao/common/domain/CPUInfo.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.yao.common.domain;
-
-import lombok.Data;
-
-/**
- * CPU使用信息
- */
-@Data
-public class CPUInfo {
- /**
- * CPU核数
- */
- private long cpuNum;
- /**
- * 内核态使用率
- */
- private String cSys;
- /**
- * 空闲率
- */
- private String idle;
- /**
- * I/O等待
- */
- private String iowait;
- /**
- * 用户态使用率
- */
- private String user;
-}
diff --git a/src/main/java/com/yao/common/domain/FlowInfo.java b/src/main/java/com/yao/common/domain/FlowInfo.java
deleted file mode 100644
index f90f2fd..0000000
--- a/src/main/java/com/yao/common/domain/FlowInfo.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.yao.common.domain;
-
-import lombok.Data; /**
- * 节点状态
- */
-@Data
-public class FlowInfo {
- /**
- * 上次读取吞吐量
- */
- private String lastReadThroughput;
- /**
- * 上次写入吞吐量
- */
- private String lastWriteThroughput;
- /**
- * 读取总吞吐量
- */
- private String readBytesHistory;
- /**
- * 实写字节
- */
- private String realWriteBytes;
- /**
- * 写入总吞吐量
- */
- private String writeBytesHistory;
-}
diff --git a/src/main/java/com/yao/common/domain/JVMInfo.java b/src/main/java/com/yao/common/domain/JVMInfo.java
deleted file mode 100644
index 49613a3..0000000
--- a/src/main/java/com/yao/common/domain/JVMInfo.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.yao.common.domain;
-
-import lombok.Data;
-
-/**
- * JVM使用信息
- */
-@Data
-public class JVMInfo {
- /**
- * 文件描述(句柄)
- */
- private String fileDescriptors;
- /**
- * 堆内存
- */
- private String heapCommit;
- /**
- * 堆初始化空间
- */
- private String heapInit;
- /**
- * 堆最大内存
- */
- private String heapMax;
- /**
- * 堆使用空间
- */
- private String heapUsed;
- /**
- * JAVA目录
- */
- private String jdkHome;
- /**
- * JDK版本
- */
- private String jdkVersion;
- /**
- * 非堆空间
- */
- private String noHeapCommit;
- /**
- * 非堆初始化空间
- */
- private String noHeapInit;
- /**
- * 非堆最大空间
- */
- private String noHeapMax;
- /**
- * 非堆使用空间
- */
- private String noHeapUsed;
- /**
- * 线程数量
- */
- private long threadCount;
-}
diff --git a/src/main/java/com/yao/common/domain/MqttInfo.java b/src/main/java/com/yao/common/domain/MqttInfo.java
deleted file mode 100644
index 7651c6f..0000000
--- a/src/main/java/com/yao/common/domain/MqttInfo.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package com.yao.common.domain;// ApifoxModel.java
-
-import lombok.Data;
-
-
-// JVMInfo.java
-
-
-// MqttInfo.java
-
-
-
-/**
- * MQTT事件信息
- */
-@Data
-public class MqttInfo {
- /**
- * 关闭事件数量
- */
- private long closeEventSize;
- /**
- * 连接事件数量
- */
- private long connectEventSize;
- /**
- * 链接总数
- */
- private long connectSize;
- /**
- * 断开链接数量
- */
- private long disconnectEventSize;
- /**
- * 推送数量
- */
- private long publishEventSize;
- /**
- * 发布重试事件数量
- */
- private long publishRetryEventSize;
- /**
- * 保留消息数量
- */
- private long retainSize;
- /**
- * 订阅事件数量
- */
- private long subscribeEventSize;
- /**
- * 订阅数量
- */
- private long subscribeSize;
- /**
- * 主题数量
- */
- private long topicSize;
- /**
- * 取消订阅数量
- */
- private long unSubscribeEventSize;
-}
diff --git a/src/main/java/com/yao/common/domain/InstanceInfo.java b/src/main/java/com/yao/common/domain/aliy/InstanceInfo.java
similarity index 56%
rename from src/main/java/com/yao/common/domain/InstanceInfo.java
rename to src/main/java/com/yao/common/domain/aliy/InstanceInfo.java
index 8fc6666..aac8109 100644
--- a/src/main/java/com/yao/common/domain/InstanceInfo.java
+++ b/src/main/java/com/yao/common/domain/aliy/InstanceInfo.java
@@ -1,24 +1,55 @@
-package com.yao.common.domain;
+package com.yao.common.domain.aliy;
import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author: LiJiaYao
* @Date: 2024/4/15
- * @Description:
+ * @Description: 阿里云服务器
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
+@Builder
public class InstanceInfo {
- private String instanceId;
- private String instanceName;
- private String publicIpAddress; // 将数据类型修改为字符串
- private String privateIpAddress; // 将数据类型修改为字符串
+ /**
+ * 实例id
+ */
+ private String instanceId;
+ /**
+ * 实例名称
+ */
+ private String instanceName;
+ /**
+ * 状态
+ */
+ private String status;
+ /**
+ * 公网IP
+ */
+ private String publicIpAddress; // 将数据类型修改为字符串
+ /**
+ * 私网IP
+ */
+ private String privateIpAddress; // 将数据类型修改为字符串
+ /**
+ * 创建时间
+ */
+ private String creationTime;
+ /*
+ 是否可以回收
+ */
+ private boolean recyclable;
+
+ /**
+ * 是否可以回收
+ * @param ipAddress
+ */
public void setPublicIpAddress(String ipAddress) {
this.publicIpAddress = ipAddress;
diff --git a/src/main/java/com/yao/common/domain/InstanceRequest.java b/src/main/java/com/yao/common/domain/aliy/InstanceRequest.java
similarity index 83%
rename from src/main/java/com/yao/common/domain/InstanceRequest.java
rename to src/main/java/com/yao/common/domain/aliy/InstanceRequest.java
index 88c7bc6..980d07a 100644
--- a/src/main/java/com/yao/common/domain/InstanceRequest.java
+++ b/src/main/java/com/yao/common/domain/aliy/InstanceRequest.java
@@ -1,6 +1,7 @@
-package com.yao.common.domain;
+package com.yao.common.domain.aliy;
import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@@ -12,8 +13,9 @@ import java.io.Serializable;
* @Description:
*/
@Data
-@NoArgsConstructor
@AllArgsConstructor
+@NoArgsConstructor
+@Builder
public class InstanceRequest implements Serializable {
private String publicIpAddress;
diff --git a/src/main/java/com/yao/common/mqtt/MqttConnectService.java b/src/main/java/com/yao/common/mqtt/MqttConnectService.java
new file mode 100644
index 0000000..09e7049
--- /dev/null
+++ b/src/main/java/com/yao/common/mqtt/MqttConnectService.java
@@ -0,0 +1,55 @@
+package com.yao.common.mqtt;
+
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.yao.common.redis.service.RedisService;
+import lombok.extern.log4j.Log4j2;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+
+/**
+ * @Author: LiJiaYao
+ * @Date: 2024/4/16
+ * @Description: 连接mqttx的配置类
+ */
+@Component
+@Log4j2
+public class MqttConnectService {
+
+ /**
+ * 调用redis分装好的方法
+ */
+ @Autowired
+ private RedisService redisService;
+
+ //todo-----------------------连接mqtt方法-------------------
+
+ /**
+ * 连接mqtt方法
+ */
+ public Integer connectMqtt(String ip) {
+ //请求路径
+ String URL = "http://" + ip + ":8080/public/cluster";
+ OkHttpClient client = new OkHttpClient();
+ Request request = new Request.Builder().url(URL).get().addHeader("User-Agent", "Apifox/1.0.0 (https://apifox.com)").addHeader("Accesstoken", "").build();
+ redisService.setCacheSet("ECS", ip);
+ Response response = null;
+ try {
+ response = client.newCall(request).execute();
+ log.info(response);
+ JSONArray jsonArray = JSONArray.parseArray(response.body().string());
+ JSONObject object = jsonArray.getJSONObject(0);
+ JSONObject mqttInfo = object.getJSONObject("mqttInfo");
+ int connectSize = mqttInfo.getIntValue("connectSize");
+ log.info(ip + " 的fluxmq连接数为:" + connectSize);
+ return connectSize;
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/src/main/java/com/yao/common/redis/configure/RedisConfig.java b/src/main/java/com/yao/common/redis/configure/RedisConfig.java
index a175692..1052bba 100644
--- a/src/main/java/com/yao/common/redis/configure/RedisConfig.java
+++ b/src/main/java/com/yao/common/redis/configure/RedisConfig.java
@@ -34,7 +34,6 @@ public class RedisConfig extends CachingConfigurerSupport {
// Hash的key也采用StringRedisSerializer的序列化方式
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(serializer);
-
template.afterPropertiesSet();
return template;
}
diff --git a/src/main/java/com/yao/common/redis/service/RedisService.java b/src/main/java/com/yao/common/redis/service/RedisService.java
index 089e6bb..69a5a1f 100644
--- a/src/main/java/com/yao/common/redis/service/RedisService.java
+++ b/src/main/java/com/yao/common/redis/service/RedisService.java
@@ -267,6 +267,17 @@ public class RedisService {
HashOperations opsForHash = redisTemplate.opsForHash();
return opsForHash.get(key, hKey);
}
+ /**
+ * 获取Hash中的数据
+ *
+ * @param key Redis键
+ * @param hKey Hash键
+ * @return Hash中的对象
+ */
+ public T getCacheListValue(final String key, final Long hKey) {
+ ListOperations opsForHash = redisTemplate.opsForList();
+ return (T) opsForHash.index(key,hKey);
+ }
/**
* 获取多个Hash中的数据
@@ -315,4 +326,5 @@ public class RedisService {
return redisTemplate.opsForValue().increment(cursor,l);
}
+
}
diff --git a/src/main/java/com/yao/gateWay/cache/GateWayNodeInfo.java b/src/main/java/com/yao/gateWay/cache/GateWayNodeInfo.java
new file mode 100644
index 0000000..5f83138
--- /dev/null
+++ b/src/main/java/com/yao/gateWay/cache/GateWayNodeInfo.java
@@ -0,0 +1,32 @@
+package com.yao.gateWay.cache;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @Author: LiJiaYao
+ * @Date: 2024/4/18
+ * @Description: 网关节点
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+public class GateWayNodeInfo {
+
+ /**
+ * 节点id
+ */
+ private String nodeId;
+ /***
+ * 外网
+ */
+ private String publicIdAddress;
+ /**
+ * 内网
+ */
+ private String privateIdAddress;
+
+}
diff --git a/src/main/java/com/yao/gateWay/cache/GatewayLoadNodeCache.java b/src/main/java/com/yao/gateWay/cache/GatewayLoadNodeCache.java
new file mode 100644
index 0000000..3f733ac
--- /dev/null
+++ b/src/main/java/com/yao/gateWay/cache/GatewayLoadNodeCache.java
@@ -0,0 +1,48 @@
+package com.yao.gateWay.cache;
+
+import com.yao.gateWay.cache.abs.GatewayNodeAbstract;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @Author: LiJiaYao
+ * @Date: 2024/4/18
+ * @Description: 网关负载节点缓存
+ */
+@Component
+public class GatewayLoadNodeCache extends GatewayNodeAbstract {
+
+
+ private final static String gateWayLoadNodeKey="gateway:load:node";
+
+ /**
+ * 存负载集合
+ * @param nodeList 节点权重集合
+ */
+ public void put(List nodeList){
+ redisService.deleteObject(gateWayLoadNodeKey);
+ redisService.setCacheList(gateWayLoadNodeKey,nodeList);
+ }
+
+ /**
+ * 获取所有负载节点
+ * @return 所有负载节点集合
+ */
+ public List get(){
+ return redisService.getCacheList(gateWayLoadNodeKey);
+ }
+
+ /**
+ * 根据下标查询内容
+ * @param index
+ * @return
+ */
+ public String getByIndex(Long index){
+ if (index == null || index > 100){
+ throw new RuntimeException("下标违法,0-100");
+ }
+ return redisService.getCacheListValue(gateWayLoadNodeKey,index);
+ }
+
+}
diff --git a/src/main/java/com/yao/gateWay/cache/GatewayLoadSeriesCache.java b/src/main/java/com/yao/gateWay/cache/GatewayLoadSeriesCache.java
new file mode 100644
index 0000000..0b4fc95
--- /dev/null
+++ b/src/main/java/com/yao/gateWay/cache/GatewayLoadSeriesCache.java
@@ -0,0 +1,50 @@
+package com.yao.gateWay.cache;
+
+import com.yao.gateWay.cache.abs.GatewayNodeAbstract;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+
+/**
+ * @Author: LiJiaYao
+ * @Date: 2024/4/18
+ * @Description: 网关负载序列
+ */
+@Component
+public class GatewayLoadSeriesCache extends GatewayNodeAbstract {
+
+ public static final String gatewayLoadSeriesKey = "gateway:load:series";
+
+ /**
+ * 初始化
+ * bean创建完成之后执行方法
+ */
+ @PostConstruct
+ public void init(){
+ redisService.setCacheObject(gatewayLoadSeriesKey,0L);
+ }
+
+ /**
+ * 获取当前序列值
+ * @return 序列值
+ */
+ public Long get(){
+ return redisService.getCacheObject(gatewayLoadSeriesKey);
+ }
+
+ /**
+ * 获取自增序列值
+ * @return 自增后的值
+ */
+ public Long incrementAndGet(){
+ return redisService.increment(gatewayLoadSeriesKey,1L);
+ }
+
+ /**
+ * 重置 刷新
+ */
+ public void refresh(){
+ this.init();
+ }
+
+}
diff --git a/src/main/java/com/yao/gateWay/cache/GatewayNodeCache.java b/src/main/java/com/yao/gateWay/cache/GatewayNodeCache.java
new file mode 100644
index 0000000..4b6bf5f
--- /dev/null
+++ b/src/main/java/com/yao/gateWay/cache/GatewayNodeCache.java
@@ -0,0 +1,44 @@
+package com.yao.gateWay.cache;
+
+import com.yao.gateWay.cache.abs.GatewayNodeAbstract;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Author: LiJiaYao
+ * @Date: 2024/4/18
+ * @Description: 网关节点缓存
+ */
+@Component
+public class GatewayNodeCache extends GatewayNodeAbstract {
+
+ private final static String nodePre= "gateway:node:info:";
+ public String encode (String nodeId){
+ return nodePre+nodeId;
+ }
+
+ /**
+ * 增加缓存信息
+ * @param gateWayNodeInfo 节点信息
+ */
+ public void add(GateWayNodeInfo gateWayNodeInfo){
+ redisService.setCacheObject(encode(gateWayNodeInfo.getNodeId()),gateWayNodeInfo);
+ }
+
+ /**
+ * 获取节点信息
+ * @param nodeId 缓存名称
+ * @return GateWayNodeInfo 节点信息
+ */
+ public GateWayNodeInfo get(String nodeId){
+ return redisService.getCacheObject(encode(nodeId));
+ }
+
+ /**
+ * 删除节点信息
+ * @param nodeId 节点id
+ */
+ public void remove(String nodeId){
+ redisService.deleteObject(encode(nodeId));
+ }
+
+}
diff --git a/src/main/java/com/yao/gateWay/cache/GatewayNodeScoreCache.java b/src/main/java/com/yao/gateWay/cache/GatewayNodeScoreCache.java
new file mode 100644
index 0000000..35b8170
--- /dev/null
+++ b/src/main/java/com/yao/gateWay/cache/GatewayNodeScoreCache.java
@@ -0,0 +1,19 @@
+package com.yao.gateWay.cache;
+
+import com.yao.gateWay.cache.abs.GatewayNodeAbstract;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Author: LiJiaYao
+ * @Date: 2024/4/18
+ * @Description: 网关节点分数
+ */
+@Component
+public class GatewayNodeScoreCache extends GatewayNodeAbstract {
+
+
+
+
+
+
+}
diff --git a/src/main/java/com/yao/gateWay/cache/GatewayNodeSetVinCache.java b/src/main/java/com/yao/gateWay/cache/GatewayNodeSetVinCache.java
new file mode 100644
index 0000000..ea9df4f
--- /dev/null
+++ b/src/main/java/com/yao/gateWay/cache/GatewayNodeSetVinCache.java
@@ -0,0 +1,13 @@
+package com.yao.gateWay.cache;
+
+import org.springframework.stereotype.Component;
+
+/**
+ * @Author: LiJiaYao
+ * @Date: 2024/4/18
+ * @Description: 网关节点存储vin详情
+ */
+@Component
+public class GatewayNodeSetVinCache {
+
+}
diff --git a/src/main/java/com/yao/gateWay/cache/GatewayVehicleLineNodeCache.java b/src/main/java/com/yao/gateWay/cache/GatewayVehicleLineNodeCache.java
new file mode 100644
index 0000000..48a07b0
--- /dev/null
+++ b/src/main/java/com/yao/gateWay/cache/GatewayVehicleLineNodeCache.java
@@ -0,0 +1,9 @@
+package com.yao.gateWay.cache;
+
+/**
+ * @Author: LiJiaYao
+ * @Date: 2024/4/18
+ * @Description: 网关连接车俩
+ */
+public class GatewayVehicleLineNodeCache {
+}
diff --git a/src/main/java/com/yao/gateWay/cache/abs/GatewayNodeAbstract.java b/src/main/java/com/yao/gateWay/cache/abs/GatewayNodeAbstract.java
new file mode 100644
index 0000000..e7ac836
--- /dev/null
+++ b/src/main/java/com/yao/gateWay/cache/abs/GatewayNodeAbstract.java
@@ -0,0 +1,21 @@
+package com.yao.gateWay.cache.abs;
+
+import com.yao.common.redis.service.RedisService;
+
+/**
+ * @Author: LiJiaYao
+ * @Date: 2024/4/18
+ * @Description: 缓存抽象
+ */
+public abstract class GatewayNodeAbstract {
+
+ /**
+ * redis工具类
+ */
+ public RedisService redisService;
+
+
+
+
+
+}
diff --git a/src/main/java/com/yao/server/add/Sample.java b/src/main/java/com/yao/server/add/Sample.java
deleted file mode 100644
index c445320..0000000
--- a/src/main/java/com/yao/server/add/Sample.java
+++ /dev/null
@@ -1,114 +0,0 @@
-package com.yao.server.add;
-
-import com.aliyun.ecs20140526.Client;
-import com.aliyun.ecs20140526.models.DescribeInstancesResponseBody;
-import com.aliyun.ecs20140526.models.RunInstancesRequest;
-import com.aliyun.ecs20140526.models.RunInstancesResponse;
-import com.aliyun.tea.TeaException;
-import com.aliyun.teautil.Common;
-import com.yao.common.config.ClientService;
-import com.yao.common.config.GetInstanceProperties;
-import com.yao.common.domain.InstanceInfo;
-import com.yao.common.domain.InstanceRequest;
-import com.yao.common.redis.service.RedisService;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import java.util.List;
-
-/**
- * @Author: LiJiaYao
- * @Date: 2024/4/12
- * @Description:
- */
-public class Sample {
-
-
- private static RedisService redisService;
- static int i = 1;
- /**
- * initialization 初始化公共请求参数
- */
-
- public static String startCreate() throws Exception {
- // 地域Id
- String regionId = "cn-shanghai";
- // 镜像 ID,启动实例时选择的镜像资源。
- String imageId = "m-uf6ii43j71vmvcc84cb9";
- // 实例规格
- String instanceType = "ecs.e-c1m1.large";
- // 新创建实例所属于的安全组 ID。
- String securityGroupId = "sg-uf61d7chl7g03zmc4rrj";
- // 虚拟交换机 ID。
- String vSwitchId = "vsw-uf6w1g7dugq9i83omkes2";
- // 公网出带宽最大值,单位为 Mbit/s。取值范围:0~100。 默认值:0。
- Integer internetMaxBandwidthOut = com.aliyun.darabonbanumber.Client.parseInt("5");
- // 网络计费类型。取值范围:
- // PayByBandwidth: 按固定带宽计费。
- // PayByTraffic: 按使用流量计费。
- // 默认值:PayByTraffic。
- String internetChargeType = "PayByTraffic";
- // 系统盘大小
- String size = "20";
- // 系统盘的云盘种类
- String category = "cloud_essd";
- // ECS实例的计费方式
- // PrePaid:包年包月
- // PostPaid:按量付费
- String instanceChargeType = "PostPaid";
- Client client = ClientService.createEcsClient(regionId);
- // 批量创建实例
- String s = Sample.RunInstances(client, regionId, imageId, instanceType, securityGroupId, vSwitchId, internetMaxBandwidthOut, internetChargeType, size, category, instanceChargeType);
- return s;
- }
-
- /**
- * RunInstances 通过备选实例规格创建ECS实例最佳实践
- * 该场景中,在调用RunInstances创建ECS实例时判断是否发生库存不足等错误,如果发生错误,将调用DescribeRecommendInstanceType查询备选实例,然后通过备选实例规格重新创建ECS实例。
- */
- public static String RunInstances(com.aliyun.ecs20140526.Client client, String regionId, String imageId, String instanceType, String securityGroupId, String vSwitchId, Integer internetMaxBandwidthOut, String internetChargeType, String size, String category, String instanceChargeType) throws Exception {
- RunInstancesResponse responces =null;
- RunInstancesRequest request1 = new RunInstancesRequest()
- .setRegionId(regionId)
- .setImageId(imageId)
- .setInstanceType(instanceType)
- .setSecurityGroupId(securityGroupId)
- .setVSwitchId(vSwitchId)
- .setInstanceName("MyFirstEcsInstance")
- .setDescription("MyFirstEcsInstance")
- .setInternetMaxBandwidthOut(internetMaxBandwidthOut)
- .setInternetChargeType(internetChargeType)
- .setInstanceChargeType(instanceChargeType)
- // 批量创建五台ECS实例,如果不设置该参数,默认创建一台ECS实例。
- // amount = 5,
- // 如果缺少库存可以接受的最低创建数量。
- // minAmount = 2,
- // 打开预检参数功能,不会实际创建ECS实例,只检查参数正确性、用户权限或者ECS库存等问题。
- // 实际情况下,设置了DryRun参数后,Amount必须为1,MinAmount必须为空,您可以根据实际需求修改代码。
- .setDryRun(false)
- .setSystemDisk(new RunInstancesRequest.RunInstancesRequestSystemDisk()
- .setSize(size)
- .setCategory(category));
- try {
- com.aliyun.teaconsole.Client.log("--------------------批量创建实例开始--------------------");
- responces = client.runInstances(request1);
- com.aliyun.teaconsole.Client.log("--------------------创建实例成功,实例ID:" + (responces.body.instanceIdSets.instanceIdSet) + "--------------------");
- List list =
- GetInstanceProperties.startGet(Common.toJSONString(responces.body.instanceIdSets.instanceIdSet));
- list.forEach(
- item -> {
- String so = item.getPublicIpAddress().toString();
- String instanceId = item.getInstanceId();
- InstanceRequest instanceRequest = new InstanceRequest(so, instanceId);
- redisService.setCacheSet("new:real:column", instanceRequest);
- System.out.println("公网IP:" + item.getPublicIpAddress().getIpAddress().toString());
- }
- );
- } catch (TeaException error) {
- com.aliyun.teaconsole.Client.log("--------------------创建实例失败:" + com.aliyun.teautil.Common.toJSONString(error.message) + "--------------------");
- } catch (Exception _error) {
- TeaException error = new TeaException(_error.getMessage(), _error);
- com.aliyun.teaconsole.Client.log("--------------------创建实例失败:" + com.aliyun.teautil.Common.toJSONString(error.message) + "--------------------");
- }
- return com.aliyun.teautil.Common.toJSONString(responces.body.instanceIdSets.instanceIdSet);
- }
-}
diff --git a/src/main/java/com/yao/server/controller/GatewayController.java b/src/main/java/com/yao/server/controller/GatewayController.java
new file mode 100644
index 0000000..8259b60
--- /dev/null
+++ b/src/main/java/com/yao/server/controller/GatewayController.java
@@ -0,0 +1,29 @@
+package com.yao.server.controller;
+
+import com.yao.common.config.Result;
+import com.yao.server.service.GatewayLoadService;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Author: LiJiaYao
+ * @Date: 2024/4/18
+ * @Description: 网关控制层
+ */
+@RestController("/gateway")
+@Log4j2
+public class GatewayController {
+
+ @Autowired
+ private GatewayLoadService gatewayLoadService;
+
+ @GetMapping("/load/node")
+ public Result loadNode(){
+ return Result.success(gatewayLoadService.loadNode());
+ }
+
+
+
+}
diff --git a/src/main/java/com/yao/server/delete/DeleteSample.java b/src/main/java/com/yao/server/delete/DeleteSample.java
deleted file mode 100644
index b600d3e..0000000
--- a/src/main/java/com/yao/server/delete/DeleteSample.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package com.yao.server.delete;
-
-
-import com.aliyun.ecs20140526.Client;
-import com.aliyun.ecs20140526.models.*;
-import com.aliyun.teaopenapi.models.Config;
-import com.aliyun.teautil.Common;
-import com.yao.common.config.ClientService;
-
-
-/**
- * @Author: LiJiaYao
- * @Date: 2024/4/12
- * @Description:
- */
-public class DeleteSample {
-
- public static DescribeInstancesResponse describeInstances(Client client,String regionId,String instanceIds,String instanceName) throws Exception {
- DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest()
- .setRegionId(regionId)
- .setInstanceName(instanceName);
- if (!Common.empty(instanceIds)){
- describeInstancesRequest.instanceIds = com.aliyun.teautil.Common.toJSONString(com.aliyun.darabonbastring.Client.split(instanceIds, ",", 50));
- }
- DescribeInstancesResponse resq = client.describeInstances(describeInstancesRequest);
- com.aliyun.teaconsole.Client.log("--------------------查询需要删除的实例--------------------");
- return resq;
- }
-
- public static void modifyInstanceAttribute(Client client,String instatnceId) throws Exception {
- ModifyInstanceAttributeRequest req = new ModifyInstanceAttributeRequest()
- .setInstanceId(instatnceId)
- .setDeletionProtection(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(com.aliyun.teautil.Common.equalString(force, "true"));
- DeleteInstancesResponse resp = client.deleteInstances(req);
- com.aliyun.teaconsole.Client.log("--------------------实例释放成功--------------------");
- com.aliyun.teaconsole.Client.log(com.aliyun.teautil.Common.toJSONString(com.aliyun.teautil.Common.toMap(resp)));
- }
-
- public static String delete (String instanceIds) throws Exception {
- //区域id
- String regionId = "cn-shanghai";
- //多个实例id,用英文逗号分割
- //实例名称
- String instanceName = "MyFirstEcsInstance";
- //强制删除有删除保护的机器
- String deleteProtected = "true";
- //强制删除运行中的机器
- String force = "true";
- com.aliyun.ecs20140526.Client client = ClientService.createEcsClient(regionId);
-
- if (Common.equalString(deleteProtected,"true")){
- DescribeInstancesResponse describeInstances = DeleteSample.describeInstances(client, regionId, instanceIds, instanceName);
- instanceIds="";
- for (DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstance instance : describeInstances.body.instances.instance) {
- instanceIds = "" + instance.instanceId + "," + instanceIds + "";
- if (instance.deletionProtection) {
- DeleteSample.modifyInstanceAttribute(client, instance.instanceId);
- }
- }
- instanceIds = com.aliyun.darabonbastring.Client.subString(instanceIds, 0, -1);
- }
- if (Common.empty(instanceIds)){
- com.aliyun.teaconsole.Client.log("--------------------无有效实例可删除--------------------");
- }
- DeleteSample.deleteInstances(client,regionId,instanceIds,force);
- return instanceIds;
- }
-}
diff --git a/src/main/java/com/yao/server/service/GatewayLoadService.java b/src/main/java/com/yao/server/service/GatewayLoadService.java
new file mode 100644
index 0000000..fa7979c
--- /dev/null
+++ b/src/main/java/com/yao/server/service/GatewayLoadService.java
@@ -0,0 +1,16 @@
+package com.yao.server.service;
+
+/**
+ * @Author: LiJiaYao
+ * @Date: 2024/4/18
+ * @Description: 网关实现接口
+ */
+public interface GatewayLoadService {
+ /**
+ * 负载节点
+ * @return 负载节点
+ */
+ String loadNode();
+
+
+}
diff --git a/src/main/java/com/yao/server/service/impl/GatewayLoadServiceImpl.java b/src/main/java/com/yao/server/service/impl/GatewayLoadServiceImpl.java
new file mode 100644
index 0000000..c222d10
--- /dev/null
+++ b/src/main/java/com/yao/server/service/impl/GatewayLoadServiceImpl.java
@@ -0,0 +1,42 @@
+package com.yao.server.service.impl;
+
+import com.yao.gateWay.cache.GateWayNodeInfo;
+import com.yao.gateWay.cache.GatewayLoadNodeCache;
+import com.yao.gateWay.cache.GatewayLoadSeriesCache;
+import com.yao.gateWay.cache.GatewayNodeCache;
+import com.yao.server.service.GatewayLoadService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Author: LiJiaYao
+ * @Date: 2024/4/18
+ * @Description: 网关实现层
+ */
+@Service
+@AllArgsConstructor
+public class GatewayLoadServiceImpl implements GatewayLoadService {
+
+ private final Long nodeLength = 100L;
+
+ //网关负载节点缓存
+ private final GatewayLoadNodeCache gatewayLoadNodeCache;
+ //网关负载序列
+ private final GatewayLoadSeriesCache gatewayLoadSeriesCache;
+ //网关节点缓存
+ private final GatewayNodeCache gatewayNodeCache;
+
+
+ @Override
+ public String loadNode() {
+ //序列负载下标
+ Long series = gatewayLoadSeriesCache.incrementAndGet();
+ Long seriesLoadIndex = series % nodeLength;
+ //获取对应下表的节点
+ String loadNodeId = gatewayLoadNodeCache.getByIndex(seriesLoadIndex);
+ //获取节点信息
+ GateWayNodeInfo gateWayNodeInfo = gatewayNodeCache.get(loadNodeId);
+ //获取外网ip
+ return gateWayNodeInfo.getPublicIdAddress();
+ }
+}
diff --git a/src/main/java/com/yao/server/service/impl/LoadServiceImpl.java b/src/main/java/com/yao/server/service/impl/LoadServiceImpl.java
index 7ae3dbd..af39abb 100644
--- a/src/main/java/com/yao/server/service/impl/LoadServiceImpl.java
+++ b/src/main/java/com/yao/server/service/impl/LoadServiceImpl.java
@@ -1,19 +1,14 @@
package com.yao.server.service.impl;
-import com.alibaba.fastjson2.JSONArray;
-import com.alibaba.fastjson2.JSONObject;
import com.yao.common.config.Constants;
import com.yao.common.domain.WorkGateWayNode;
+import com.yao.common.mqtt.MqttConnectService;
import com.yao.common.redis.service.RedisService;
import com.yao.server.service.LoadService;
import lombok.extern.log4j.Log4j2;
-import okhttp3.OkHttpClient;
-import okhttp3.Request;
-import okhttp3.Response;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
-import java.io.IOException;
import java.util.*;
import java.util.concurrent.CountDownLatch;
@@ -30,6 +25,12 @@ public class LoadServiceImpl implements LoadService {
@Autowired
private RedisService redisService;
+ private MqttConnectService mqttConnectService;
+
+ public LoadServiceImpl(MqttConnectService mqttConnectService) {
+ this.mqttConnectService = mqttConnectService;
+ }
+
@Override
public String load() {
//初始化序列
@@ -49,7 +50,8 @@ public class LoadServiceImpl implements LoadService {
}
}
- work:while (true) {
+ work:
+ while (true) {
for (WorkGateWayNode workGateWayNode : nodeIdList) {
Integer nodeWeight = workGateWayNode.getWeight();
if (nodeWeight > 0) {
@@ -69,7 +71,7 @@ public class LoadServiceImpl implements LoadService {
redisService.deleteObject("work:node:gateway");
redisService.setCacheList("work:node:gateway", loadNodeList);
CountDownLatch countDownLatch = new CountDownLatch(300);
- new Thread(()->{
+ new Thread(() -> {
for (int i = 0; i < Constants.SUM; i++) {
long cursor = redisService.increment("cursor", 1L);
String cacheList = redisService.getCacheList("work:node:gateway", cursor % 100);
@@ -79,7 +81,7 @@ public class LoadServiceImpl implements LoadService {
}
}).start();
- new Thread(()->{
+ new Thread(() -> {
for (int i = 0; i < Constants.SUM; i++) {
long cursor = redisService.increment("cursor", 1L);
String cacheList = redisService.getCacheList("work:node:gateway", cursor % 100);
@@ -89,7 +91,7 @@ public class LoadServiceImpl implements LoadService {
}
}).start();
- new Thread(()-> {
+ new Thread(() -> {
for (int i = 0; i < Constants.SUM; i++) {
Long cursor = redisService.increment("cursor", 1L);
String cacheList = redisService.getCacheList("work:node:gateway", cursor % 100);
@@ -117,41 +119,18 @@ public class LoadServiceImpl implements LoadService {
} else {
System.out.println("HashMap 为空!");
}
-
return key;
}
- public ArrayList carWorkGatewayNode(){
+
+ public ArrayList carWorkGatewayNode() {
Set ip = redisService.getCacheSet("ECS");
ArrayList list = new ArrayList<>();
for (String s : ip) {
-
- String ips = s;
- //请求路径
- String URL = "http://" + ips + ":8080/public/cluster";
- OkHttpClient client = new OkHttpClient();
- Request request = new Request.Builder()
- .url(URL)
- .get()
- .addHeader("User-Agent", "Apifox/1.0.0 (https://apifox.com)")
- .addHeader("Accesstoken", "")
- .build();
- Response response = null;
- try {
- response = client.newCall(request).execute();
- log.info(response);
- JSONArray jsonArray = JSONArray.parseArray(response.body().string());
- JSONObject object = jsonArray.getJSONObject(0);
- JSONObject mqttInfo = object.getJSONObject("mqttInfo");
- Integer connectSize = mqttInfo.getIntValue("connectSize");
- log.info(ips + " 的fluxmq连接数为:" + connectSize);
- WorkGateWayNode workGateWayNode = new WorkGateWayNode();
- workGateWayNode.setWeight(connectSize);
- workGateWayNode.setNodeId(ips);
- list.add(workGateWayNode);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
-
+ Integer connectSize = mqttConnectService.connectMqtt(s);
+ WorkGateWayNode workGateWayNode = new WorkGateWayNode();
+ workGateWayNode.setWeight(connectSize);
+ workGateWayNode.setNodeId(s);
+ list.add(workGateWayNode);
}
return list;
@@ -171,7 +150,6 @@ public class LoadServiceImpl implements LoadService {
}
-
//计数
@Log4j2
class SitNode {
@@ -183,8 +161,8 @@ class SitNode {
sitNodeMap.put(nodeId, orDefault + 1);
}
- public static HashMap show() {
- HashMap map = new HashMap<>();
+ public static HashMap show() {
+ HashMap map = new HashMap<>();
sitNodeMap.forEach((key, val) -> {
map.put(key, val);
log.info(key + "-------" + val);
diff --git a/src/main/java/com/yao/server/test/QueryIp.java b/src/main/java/com/yao/server/test/QueryIp.java
index bff91da..ce762a6 100644
--- a/src/main/java/com/yao/server/test/QueryIp.java
+++ b/src/main/java/com/yao/server/test/QueryIp.java
@@ -5,8 +5,6 @@ import com.aliyun.ecs20140526.models.DescribeInstancesResponse;
import com.aliyun.ecs20140526.models.DescribeInstancesResponseBody;
import com.aliyun.tea.TeaException;
import com.aliyun.teautil.models.RuntimeOptions;
-import com.yao.common.config.ClientService;
-import com.yao.common.config.GetInstanceProperties;
import org.springframework.stereotype.Component;
import java.util.List;
@@ -22,28 +20,28 @@ public class QueryIp {
public static void main(String[] args_) throws Exception {
- Client ecsClient = ClientService.createEcsClient("cn-shanghai");
- com.aliyun.ecs20140526.models.DescribeInstancesRequest describeInstancesRequest = new com.aliyun.ecs20140526.models.DescribeInstancesRequest()
- .setRegionId(ecsClient._regionId);
+// Client ecsClient = ClientService.createEcsClient("cn-shanghai");
+// com.aliyun.ecs20140526.models.DescribeInstancesRequest describeInstancesRequest = new com.aliyun.ecs20140526.models.DescribeInstancesRequest()
+// .setRegionId(ecsClient._regionId);
RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
- DescribeInstancesResponse resp = ecsClient.describeInstancesWithOptions(describeInstancesRequest, runtime);
- DescribeInstancesResponseBody body = resp.getBody();
- DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstances instances = body.getInstances();
- com.aliyun.teaconsole.Client.log(com.aliyun.teautil.Common.toJSONString(instances));
- List instance = instances.getInstance();
-
- instance.forEach(i->{
- try {
- System.out.println("实列id:"+i.getInstanceId());
- List list = GetInstanceProperties.startGet(i.getInstanceId());
- DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstance instancesInstance = list.get(0);
- System.out.println(instancesInstance.getPublicIpAddress().ipAddress);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- });
+// DescribeInstancesResponse resp = ecsClient.describeInstancesWithOptions(describeInstancesRequest, runtime);
+// DescribeInstancesResponseBody body = resp.getBody();
+// DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstances instances = body.getInstances();
+// com.aliyun.teaconsole.Client.log(com.aliyun.teautil.Common.toJSONString(instances));
+// List instance = instances.getInstance();
+//
+// instance.forEach(i->{
+// try {
+// System.out.println("实列id:"+i.getInstanceId());
+// List list = GetInstanceProperties.startGet(i.getInstanceId());
+// DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstance instancesInstance = list.get(0);
+// System.out.println(instancesInstance.getPublicIpAddress().ipAddress);
+// } catch (Exception e) {
+// throw new RuntimeException(e);
+// }
+// });
} catch (TeaException error) {
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
diff --git a/src/main/java/com/yao/server/test/Test.java b/src/main/java/com/yao/server/test/Test.java
index 80e204c..a0b5132 100644
--- a/src/main/java/com/yao/server/test/Test.java
+++ b/src/main/java/com/yao/server/test/Test.java
@@ -6,7 +6,6 @@ import com.aliyun.ecs20140526.models.DescribeAvailableResourceResponse;
import com.aliyun.tea.TeaException;
import com.aliyun.tea.TeaModel;
import com.aliyun.teaopenapi.models.Config;
-import com.yao.common.config.ClientService;
/**
* @Author: LiJiaYao
@@ -33,9 +32,9 @@ public class Test {
String ioOptimized = "optimized";
// 实例规格
String instanceType = "ecs.e-c1m1.large";
- Client client = ClientService.createEcsClient(regionId);
+// Client client = ClientService.createEcsClient(regionId);
// 查询指定地域下所有可用区的库存供应情况
- Test.describeAvailableResource(client, regionId, destinationResource, ioOptimized, instanceType);
+// Test.describeAvailableResource(client, regionId, destinationResource, ioOptimized, instanceType);
}
/**
diff --git a/src/main/java/com/yao/server/timer/Timer.java b/src/main/java/com/yao/server/timer/Timer.java
index b2254f4..8a526fb 100644
--- a/src/main/java/com/yao/server/timer/Timer.java
+++ b/src/main/java/com/yao/server/timer/Timer.java
@@ -1,24 +1,19 @@
package com.yao.server.timer;
-import com.alibaba.fastjson2.JSONArray;
-import com.alibaba.fastjson2.JSONObject;
-import com.yao.common.config.GetInstanceProperties;
-import com.yao.common.domain.InstanceInfo;
-import com.yao.common.domain.InstanceRequest;
-import com.yao.common.domain.WorkGateWayNode;
+import com.aliyun.teautil.Common;
+import com.yao.common.aliy.AliYunEcsService;
+import com.yao.common.aliy.model.EcsSelectModel;
+import com.yao.common.domain.aliy.InstanceInfo;
+import com.yao.common.domain.aliy.InstanceRequest;
+import com.yao.common.mqtt.MqttConnectService;
import com.yao.common.redis.service.RedisService;
-import com.yao.server.add.Sample;
-import com.yao.server.delete.DeleteSample;
-import io.netty.util.internal.StringUtil;
import lombok.extern.log4j.Log4j2;
-import okhttp3.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
-import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
@@ -35,56 +30,49 @@ public class Timer {
@Autowired
private RedisService redisService;
+ private AliYunEcsService aliYunEcsService;
+ private MqttConnectService mqttConnectService;
+
+ public Timer(AliYunEcsService aliYunEcsService, MqttConnectService mqttConnectService) {
+ this.aliYunEcsService = aliYunEcsService;
+ this.mqttConnectService = mqttConnectService;
+ }
@Async
- @Scheduled(cron = "0/10 * * * * ?")
+ @Scheduled(cron = "0/20 * * * * ?")
public void timer() {
- redisService.deleteObject("new:real:column");
- List myFirstEcsInstance = GetInstanceProperties.selectECS("MyFirstEcsInstance");
- for (InstanceInfo instanceInfo : myFirstEcsInstance) {
- String publicIpAddress = instanceInfo.getPublicIpAddress();
- String instanceId = instanceInfo.getInstanceId();
- InstanceRequest instanceRequest = new InstanceRequest(publicIpAddress, instanceId);
- redisService.setCacheSet("new:real:column", instanceRequest);
- }
-// Set instance = redisService.getCacheSet("new:real:column");
- if (myFirstEcsInstance.isEmpty()) {
- if (myFirstEcsInstance.isEmpty()) {
- try {
- Sample.startCreate();
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
+ long startTime = System.currentTimeMillis(); // 记录开始时间
+ long endTime = startTime + 10 * 60 * 1000; // 设置结束时间为10分钟后
+// redisService.deleteObject("new:real:column");
+ Set instance = redisService.getCacheSet("new:real:column");
+// List myFirstEcsInstance = null;
+// try {
+// myFirstEcsInstance = aliYunEcsService.selectList(ecsSelectModelName("MyFirstEcsInstance"));
+// for (InstanceInfo instanceInfo : myFirstEcsInstance) {
+// String publicIpAddress = instanceInfo.getPublicIpAddress();
+// String instanceId = instanceInfo.getInstanceId();
+// InstanceRequest instanceRequest = new InstanceRequest(publicIpAddress, instanceId);
+// redisService.setCacheSet("new:real:column", instanceRequest);
+// }
+ if (instance.isEmpty()) {
+// if (myFirstEcsInstance.isEmpty()) {
+ try {
+ aliYunEcsService.startCreate();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+// }
}
- }
- for (InstanceInfo s : myFirstEcsInstance) {
- String ip = s.getPublicIpAddress();
- //请求路径
- String URL = "http://" + ip + ":8080/public/cluster";
- OkHttpClient client = new OkHttpClient();
- Request request = new Request.Builder()
- .url(URL)
- .get()
- .addHeader("User-Agent", "Apifox/1.0.0 (https://apifox.com)")
- .addHeader("Accesstoken", "")
- .build();
- redisService.setCacheSet("ecsIp", ip);
- try {
- Response response = client.newCall(request).execute();
- log.info(response);
- JSONArray jsonArray = JSONArray.parseArray(response.body().string());
- JSONObject object = jsonArray.getJSONObject(0);
- JSONObject mqttInfo = object.getJSONObject("mqttInfo");
- int connectSize = mqttInfo.getIntValue("connectSize");
- log.info(ip + " 的fluxmq连接数为:" + connectSize);
- String instanceId = null;
+ for (InstanceInfo s : instance) {
+ Integer connectSize = mqttConnectService.connectMqtt(s.getPublicIpAddress());
+ List instanceId = null;
String deleteInstanceId = null;
- if (connectSize >= 10) {
+ if (connectSize >= 80) {
//执行节点扩容
//返回实例的ID
if (!instanceId.isEmpty()) {
try {
- instanceId = Sample.startCreate();
+ instanceId = aliYunEcsService.startCreate();
log.info("扩容成功!");
log.info("扩容的节点id为:" + instanceId);
} catch (Exception e) {
@@ -92,20 +80,43 @@ public class Timer {
}
}
}
- if (connectSize <= 5) {
+ if (connectSize <= 20 && System.currentTimeMillis() < endTime) {
// if (!deleteInstanceId.isEmpty()) {
- try {
- deleteInstanceId = DeleteSample.delete(s.getInstanceId());
- log.info("缩容成功!");
- log.info("锁容的节点id为:" + deleteInstanceId);
- } catch (Exception e) {
- throw new RuntimeException(e);
-// }
- }
+ aliYunEcsService.delete(s.getInstanceId());
+ //删除实列以后再去把redis的值删除 再去通知重新上线
+ redisService.deleteCacheMapValue("new:real:column", Common.toJSONString(s));
+ redisService.setCacheSet("reconnectCar",s.getPublicIpAddress());
+ log.info("缩容成功!");
+ log.info("锁容的节点id为:" + deleteInstanceId);
}
- } catch (IOException e) {
- throw new RuntimeException(e);
}
+// } catch (Exception e) {
+// throw new RuntimeException(e);
}
+
}
-}
+
+ /**
+ * 查出来数据以后把值返回给要查的数据
+ *
+ * @param instance
+ * @return
+ */
+// public EcsSelectModel ecsSelectModel(Set instance) {
+// List instanceIdList = new ArrayList<>();
+// for (InstanceInfo req : instance) {
+// instanceIdList.add(req.getInstanceId());
+// }
+// EcsSelectModel ecsSelectModel = new EcsSelectModel();
+// ecsSelectModel.setInstanceIdList(instanceIdList);
+// return ecsSelectModel;
+// }
+// public EcsSelectModel ecsSelectModelName(String instanceName) {
+// List instanceIdList = new ArrayList<>();
+// instanceIdList.add(instanceName);
+// EcsSelectModel ecsSelectModel = new EcsSelectModel();
+// ecsSelectModel.setInstanceIdList(instanceIdList);
+// return ecsSelectModel;
+// }
+
+//}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 260d7f6..0956ee9 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -23,3 +23,26 @@ spring:
# 共享配置
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
+config:
+ aly:
+ access-key-id: LTAI5t7kDVgLdPETn9TXjFaW
+ access-key-secret: 79UjUBiwoQgADVyJjrOX9B4KVJn0lS
+ # 区域
+ region-id: cn-shanghai
+# 镜像
+ image-id: m-uf6ii43j71vmvcc84cb9
+ # 实例规格
+ instance-type: ecs.e-c1m1.large
+ # 安全组
+ security-group-id: sg-uf61d7chl7g03zmc4rrj
+ # 虚拟
+ v-switch-id: vsw-uf6w1g7dugq9i83omkes2
+# 网络计费类型
+ internet-charge-type: PayByTraffic
+ #系统大小
+ size: 20
+ # 系统盘的云盘种类
+ category: cloud_essd
+ # ECS实例的计费方式
+ instance-charge-type: PostPaid
+