From ddf4ede8295b532586921a64532cdeca98ce6fec Mon Sep 17 00:00:00 2001
From: SuiXxx <1752599835@qq.com>
Date: Mon, 30 Sep 2024 09:28:12 +0800
Subject: [PATCH] =?UTF-8?q?feat():=E6=9F=A5=E8=AF=A2ESC=E4=BF=A1=E6=81=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../cloud-modules-vehiclegateway/pom.xml | 5 +
.../java/com/muyu/vehicle/ManageInstance.java | 173 ++++++++++++++++++
.../com/muyu/vehicle/domain/InstanceInfo.java | 18 ++
.../vehicle/{ => service}/CloseInstance.java | 2 +-
.../vehicle/{ => service}/OpenInstance.java | 29 +--
.../muyu/vehicle/service/SelectInstance.java | 66 +++++++
.../src/main/resources/bootstrap.yml | 2 +
7 files changed, 280 insertions(+), 15 deletions(-)
create mode 100644 cloud-modules/cloud-modules-vehiclegateway/src/main/java/com/muyu/vehicle/ManageInstance.java
create mode 100644 cloud-modules/cloud-modules-vehiclegateway/src/main/java/com/muyu/vehicle/domain/InstanceInfo.java
rename cloud-modules/cloud-modules-vehiclegateway/src/main/java/com/muyu/vehicle/{ => service}/CloseInstance.java (99%)
rename cloud-modules/cloud-modules-vehiclegateway/src/main/java/com/muyu/vehicle/{ => service}/OpenInstance.java (84%)
create mode 100644 cloud-modules/cloud-modules-vehiclegateway/src/main/java/com/muyu/vehicle/service/SelectInstance.java
diff --git a/cloud-modules/cloud-modules-vehiclegateway/pom.xml b/cloud-modules/cloud-modules-vehiclegateway/pom.xml
index 7cfc3f5..34448dd 100644
--- a/cloud-modules/cloud-modules-vehiclegateway/pom.xml
+++ b/cloud-modules/cloud-modules-vehiclegateway/pom.xml
@@ -125,6 +125,11 @@
tea-util
0.2.21
+
+ com.aliyun
+ aliyun-java-sdk-ecs
+ 4.2.0
+
diff --git a/cloud-modules/cloud-modules-vehiclegateway/src/main/java/com/muyu/vehicle/ManageInstance.java b/cloud-modules/cloud-modules-vehiclegateway/src/main/java/com/muyu/vehicle/ManageInstance.java
new file mode 100644
index 0000000..272ab93
--- /dev/null
+++ b/cloud-modules/cloud-modules-vehiclegateway/src/main/java/com/muyu/vehicle/ManageInstance.java
@@ -0,0 +1,173 @@
+package com.muyu.vehicle;
+
+
+import com.aliyun.ecs20140526.Client;
+import com.aliyun.ecs20140526.models.*;
+import com.aliyun.tea.TeaException;
+import com.aliyun.teaopenapi.models.Config;
+import com.aliyun.teautil.Common;
+import com.aliyun.teautil.models.RuntimeOptions;
+import com.muyu.vehicle.domain.InstanceInfo;
+import com.muyu.vehicle.service.OpenInstance;
+import com.muyu.vehicle.service.SelectInstance;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Component
+@Log4j2
+public class ManageInstance implements ApplicationRunner {
+
+ /**
+ * ACCESS_KEY_ID
+ */
+ public static final String ALIBABA_CLOUD_ACCESS_KEY_ID="LTAI5tGabdxedjfCh2uXHNrw";
+
+ /**
+ *ACCESS_KEY_SECRET
+ */
+ public static final String ACCESS_KEY_SECRET="NHb7wHVpesLW6Axc0bFBs6ThhuNR10";
+
+
+ /**
+ * 镜像ID
+ */
+ public static final String IMAGE_ID="m-uf6agr9i6g27gj23om34";
+
+ /**
+ * 实例类型
+ */
+ public static final String INSTANCE_TYPE="ecs.e-c1m1.large";
+
+ /**
+ * 安全组ID
+ */
+ public static final String SECURITY_GROUP_ID="sg-uf6glo8c4k17szhxu7sk";
+
+ /**
+ *交换机ID
+ */
+ public static final String V_SWITCH_ID="vsw-uf6xy4rbt9ggcz93t6oib";
+
+
+ /**
+ * 实例付费类型
+ */
+ public static final String INSTANCE_CHARGE_TY="PostPaid";
+
+
+
+ /**
+ * 使用AK&SK初始化账号Client
+ * @return Client
+ * @throws Exception
+ */
+
+ public static Client createClient() throws Exception {
+ // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
+ Config config = new Config()
+ // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
+ .setAccessKeyId(ALIBABA_CLOUD_ACCESS_KEY_ID)
+ // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
+ .setAccessKeySecret(ACCESS_KEY_SECRET);
+ // Endpoint 请参考 https://api.aliyun.com/product/Ecs
+ config.endpoint = "ecs-cn-hangzhou.aliyuncs.com";
+ return new com.aliyun.ecs20140526.Client(config);
+ }
+
+
+ public static void generateInstance() throws Exception {
+ // 创建阿里云ECS客户端
+ Client client = ManageInstance.createClient();
+ // 配置系统盘参数
+ RunInstancesRequest.RunInstancesRequestSystemDisk systemDisk=
+ new RunInstancesRequest.RunInstancesRequestSystemDisk()
+ .setSize("40")
+ .setCategory("cloud_essd");
+
+ // 创建创建实例请求对象并设置参数
+
+ RunInstancesRequest runInstancesRequest = new RunInstancesRequest()
+ .setRegionId("cn-shanghai") // 设置地域ID
+ .setImageId(IMAGE_ID) // 设置镜像ID
+ .setInstanceType(INSTANCE_TYPE) // 设置实例类型
+ .setSecurityGroupId(SECURITY_GROUP_ID) // 设置安全组ID
+ .setVSwitchId(V_SWITCH_ID) // 设置虚拟交换机ID
+ .setInstanceName("cloud-MQTT") // 设置实例名称
+ .setInstanceChargeType(INSTANCE_CHARGE_TY) // 设置实例付费类型为后付费按量付费
+ .setSystemDisk(systemDisk) // 设置系统盘配置
+ .setHostName("root") // 设置主机名
+ .setPassword("2112A-four") // 设置实例密码
+ .setAmount(2) // 设置创建实例的数量
+ .setInternetChargeType("PayByTraffic")
+ .setInternetMaxBandwidthOut(1);
+
+
+ //创建运行时选择对象
+ RuntimeOptions runTime=
+ new RuntimeOptions();
+ // 尝试执行创建实例请求
+ try {
+ ArrayList list = new ArrayList<>();
+ // 复制代码运行请自行打印 API 的返回值
+ RunInstancesResponse runInstancesResponse = client.runInstancesWithOptions(runInstancesRequest, runTime);
+ RunInstancesResponseBody body = runInstancesResponse.getBody();
+ for (String instance : body.getInstanceIdSets().getInstanceIdSet()) {
+ list.add(instance);
+ }
+ log.info("ESC创建成功,实例ID为:" + list);
+ } catch (TeaException error) {
+ // 错误 message
+ log.info(error.getMessage());
+ // 诊断地址
+ log.info(error.getData().get("Recommend"));
+ Common.assertAsString(error.message);
+ } catch (Exception _error) {
+ TeaException error = new TeaException(_error.getMessage(), _error);
+ // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
+ // 错误 message
+ log.info("实例创建失败:"+error.getMessage());
+ }
+ }
+
+ private static List selectInstance() throws Exception {
+ Client client = ManageInstance.createClient();
+ ArrayList instanceInfos = new ArrayList<>();// 实例基础信息
+ DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest()
+ .setRegionId("cn-shanghai")
+ .setInternetChargeType("PayByTraffic")
+ .setInstanceChargeType("PostPaid")
+ .setInstanceName("cloud-MQTT") // 设置实例名称
+ ;
+ // 创建运行时选项对象
+ RuntimeOptions runtime = new RuntimeOptions();
+ //实例ID Instances.Instance.InstanceId
+ //实例IP Instances.Instance.PublicIpAddress.IpAddress
+ //状态 Instances.Instance.Status
+ DescribeInstancesResponse resp =client.describeInstancesWithOptions(describeInstancesRequest, runtime);
+ DescribeInstancesResponseBody body = resp.getBody();
+
+ for (DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstance instance : body.getInstances().getInstance()){
+ InstanceInfo instanceInfo = new InstanceInfo();
+ instanceInfo.setInstanceId(instance.getInstanceId());
+ instanceInfo.setIpAddress(String.valueOf(instance.getPublicIpAddress().getIpAddress()));
+ instanceInfo.setStatus(instance.getStatus());
+ instanceInfos.add(instanceInfo);
+
+ }
+ log.info("实例信息为:"+Common.toJSONString(instanceInfos));
+ return instanceInfos;
+ }
+
+ @Override
+ public void run(ApplicationArguments args) throws Exception {
+ generateInstance();
+ selectInstance();
+ }
+}
+
diff --git a/cloud-modules/cloud-modules-vehiclegateway/src/main/java/com/muyu/vehicle/domain/InstanceInfo.java b/cloud-modules/cloud-modules-vehiclegateway/src/main/java/com/muyu/vehicle/domain/InstanceInfo.java
new file mode 100644
index 0000000..2b4a528
--- /dev/null
+++ b/cloud-modules/cloud-modules-vehiclegateway/src/main/java/com/muyu/vehicle/domain/InstanceInfo.java
@@ -0,0 +1,18 @@
+package com.muyu.vehicle.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class InstanceInfo {
+
+ //实例ID
+ private String InstanceId;
+
+ private String IpAddress;
+
+ private String status;
+}
diff --git a/cloud-modules/cloud-modules-vehiclegateway/src/main/java/com/muyu/vehicle/CloseInstance.java b/cloud-modules/cloud-modules-vehiclegateway/src/main/java/com/muyu/vehicle/service/CloseInstance.java
similarity index 99%
rename from cloud-modules/cloud-modules-vehiclegateway/src/main/java/com/muyu/vehicle/CloseInstance.java
rename to cloud-modules/cloud-modules-vehiclegateway/src/main/java/com/muyu/vehicle/service/CloseInstance.java
index 4e51133..8843c7c 100644
--- a/cloud-modules/cloud-modules-vehiclegateway/src/main/java/com/muyu/vehicle/CloseInstance.java
+++ b/cloud-modules/cloud-modules-vehiclegateway/src/main/java/com/muyu/vehicle/service/CloseInstance.java
@@ -1,4 +1,4 @@
-package com.muyu.vehicle;
+package com.muyu.vehicle.service;
import com.aliyun.ecs20140526.Client;
diff --git a/cloud-modules/cloud-modules-vehiclegateway/src/main/java/com/muyu/vehicle/OpenInstance.java b/cloud-modules/cloud-modules-vehiclegateway/src/main/java/com/muyu/vehicle/service/OpenInstance.java
similarity index 84%
rename from cloud-modules/cloud-modules-vehiclegateway/src/main/java/com/muyu/vehicle/OpenInstance.java
rename to cloud-modules/cloud-modules-vehiclegateway/src/main/java/com/muyu/vehicle/service/OpenInstance.java
index 0d21148..2a6cb6e 100644
--- a/cloud-modules/cloud-modules-vehiclegateway/src/main/java/com/muyu/vehicle/OpenInstance.java
+++ b/cloud-modules/cloud-modules-vehiclegateway/src/main/java/com/muyu/vehicle/service/OpenInstance.java
@@ -1,20 +1,20 @@
-package com.muyu.vehicle;
+package com.muyu.vehicle.service;
import com.aliyun.ecs20140526.Client;
import com.aliyun.ecs20140526.models.RunInstancesRequest;
+import com.aliyun.ecs20140526.models.RunInstancesResponse;
+import com.aliyun.ecs20140526.models.RunInstancesResponseBody;
import com.aliyun.tea.TeaException;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.Common;
import com.aliyun.teautil.models.RuntimeOptions;
+import com.muyu.vehicle.ManageInstance;
import lombok.extern.log4j.Log4j2;
-import org.springframework.boot.ApplicationArguments;
-import org.springframework.boot.ApplicationRunner;
-import org.springframework.stereotype.Component;
-@Component
+import java.util.ArrayList;
+
@Log4j2
-public class OpenInstance implements ApplicationRunner {
-
+public class OpenInstance {
/**
* ACCESS_KEY_ID
*/
@@ -95,7 +95,7 @@ public class OpenInstance implements ApplicationRunner {
.setSystemDisk(systemDisk) // 设置系统盘配置
.setHostName("root") // 设置主机名
.setPassword("2112A-four") // 设置实例密码
- .setAmount(1) // 设置创建实例的数量
+ .setAmount(2) // 设置创建实例的数量
.setInternetChargeType("PayByTraffic")
.setInternetMaxBandwidthOut(1);
@@ -105,9 +105,14 @@ public class OpenInstance implements ApplicationRunner {
new RuntimeOptions();
// 尝试执行创建实例请求
try {
+ ArrayList list = new ArrayList<>();
// 复制代码运行请自行打印 API 的返回值
- client.runInstancesWithOptions(runInstancesRequest, runTime);
- log.info("实例创建成功");
+ RunInstancesResponse runInstancesResponse = client.runInstancesWithOptions(runInstancesRequest, runTime);
+ RunInstancesResponseBody body = runInstancesResponse.getBody();
+ for (String instance : body.getInstanceIdSets().getInstanceIdSet()) {
+ list.add(instance);
+ log.info("ESC创建成功,实例ID为:" + list);
+ }
} catch (TeaException error) {
// 错误 message
log.info(error.getMessage());
@@ -121,8 +126,4 @@ public class OpenInstance implements ApplicationRunner {
log.info("实例创建失败:"+error.getMessage());
}
}
- @Override
- public void run(ApplicationArguments args) throws Exception {
- generateInstance();
- }
}
diff --git a/cloud-modules/cloud-modules-vehiclegateway/src/main/java/com/muyu/vehicle/service/SelectInstance.java b/cloud-modules/cloud-modules-vehiclegateway/src/main/java/com/muyu/vehicle/service/SelectInstance.java
new file mode 100644
index 0000000..6340b52
--- /dev/null
+++ b/cloud-modules/cloud-modules-vehiclegateway/src/main/java/com/muyu/vehicle/service/SelectInstance.java
@@ -0,0 +1,66 @@
+package com.muyu.vehicle.service;
+
+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.teaopenapi.models.Config;
+import com.aliyun.teautil.Common;
+import com.aliyun.teautil.models.RuntimeOptions;
+import com.muyu.vehicle.domain.InstanceInfo;
+import lombok.extern.log4j.Log4j2;
+
+import java.util.ArrayList;
+
+@Log4j2
+public class SelectInstance {
+ /**
+ * ACCESS_KEY_ID
+ */
+ public static final String ALIBABA_CLOUD_ACCESS_KEY_ID="LTAI5tGabdxedjfCh2uXHNrw";
+
+ /**
+ *ACCESS_KEY_SECRET
+ */
+ public static final String ACCESS_KEY_SECRET="NHb7wHVpesLW6Axc0bFBs6ThhuNR10";
+
+ public static Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
+ Config config = new com.aliyun.teaopenapi.models.Config()
+ // 必填,您的 AccessKey ID
+ .setAccessKeyId(ALIBABA_CLOUD_ACCESS_KEY_ID)
+ // 必填,您的 AccessKey Secret
+ .setAccessKeySecret(ACCESS_KEY_SECRET);
+ // 访问的域名
+ config.endpoint = "ecs-cn-hangzhou.aliyuncs.com";
+ return new Client(config);
+ }
+
+ public static void main(String[] args_) throws Exception {
+ java.util.List args = java.util.Arrays.asList(args_);
+ // 请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
+ // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议使用更安全的 STS 方式
+ Client client = SelectInstance.createClient(ALIBABA_CLOUD_ACCESS_KEY_ID, ACCESS_KEY_SECRET);
+ DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest()
+ .setRegionId("cn-shanghai")
+ .setInternetChargeType("PayByTraffic")
+ .setInstanceChargeType("PostPaid")
+ .setInstanceName("cloud-MQTT") // 设置实例名称
+ ;
+ //实例ID Instances.Instance.InstanceId
+ //实例IP Instances.Instance.PublicIpAddress.IpAddress
+ //状态 Instances.Instance.Status
+ RuntimeOptions runtime = new RuntimeOptions();
+ DescribeInstancesResponse resp = client.describeInstancesWithOptions(describeInstancesRequest, runtime);
+ DescribeInstancesResponseBody body = resp.getBody();
+ ArrayList instanceInfos = new ArrayList<>();// 实例基础信息
+ for (DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstance instance : body.getInstances().getInstance()){
+
+ InstanceInfo instanceInfo = new InstanceInfo();
+ instanceInfo.setInstanceId(instance.getInstanceId());
+ instanceInfo.setIpAddress(String.valueOf(instance.getPublicIpAddress().getIpAddress()));
+ instanceInfo.setStatus(instance.getStatus());
+ instanceInfos.add(instanceInfo);
+ }
+ log.info(Common.toJSONString(instanceInfos));
+ }
+}
diff --git a/cloud-modules/cloud-modules-vehiclegateway/src/main/resources/bootstrap.yml b/cloud-modules/cloud-modules-vehiclegateway/src/main/resources/bootstrap.yml
index 9ab2537..8ac2666 100644
--- a/cloud-modules/cloud-modules-vehiclegateway/src/main/resources/bootstrap.yml
+++ b/cloud-modules/cloud-modules-vehiclegateway/src/main/resources/bootstrap.yml
@@ -54,3 +54,5 @@ logging:
level:
com.muyu.system.mapper: DEBUG
+
+