commit 43295537c99a8bb77433e02beb24e594ba26d622
Author: Yan Nan <255809923@qq.com>
Date: Wed Apr 17 11:51:17 2024 +0800
yn
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..0f996d3
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,231 @@
+
+
+ 4.0.0
+ com.muyu
+ mqtt
+ 0.0.1-SNAPSHOT
+ mqtt
+ Demo project for Spring Boot
+
+ 1.8
+ UTF-8
+ UTF-8
+ 2.6.13
+
+
+
+
+
+
+
+ com.aliyun
+ darabonba-string
+ 0.0.3
+
+
+ com.aliyun
+ tea
+ [1.0.3, 2.0.0)
+
+
+
+ com.aliyun
+ ecs20140526
+ 3.1.2
+
+
+ com.aliyun
+ tea-openapi
+ 0.3.2
+
+
+ com.aliyun
+ tea-util
+ 0.2.21
+
+
+ com.aliyun
+ tea-console
+ 0.0.1
+
+
+ com.aliyun
+ darabonba-env
+ 0.1.1
+
+
+ com.aliyun
+ tea
+ 1.1.14
+
+
+
+
+ com.aliyun
+ credentials-java
+ LATEST
+
+
+ com.aliyun
+ tea-openapi
+ 0.2.8
+
+
+ com.aliyun
+ dysmsapi20170525
+ 2.0.24
+
+
+
+ com.aliyun
+ ecs20140526
+ 3.1.12
+
+
+
+ com.aliyun
+ aliyun-java-sdk-core
+ 4.6.3
+
+
+ com.aliyun
+ aliyun-java-sdk-ecs
+ 4.24.59
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.projectlombok
+ lombok
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+
+ org.eclipse.paho
+ org.eclipse.paho.client.mqttv3
+ 1.2.5
+
+
+
+ com.alibaba.fastjson2
+ fastjson2
+ 2.0.47
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.springframework
+ spring-tx
+ 5.3.31
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ ${spring-boot.version}
+ pom
+ import
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.6.1
+
+ 16
+ 16
+
+
+
+ org.sonatype.plugins
+ nexus-staging-maven-plugin
+ 1.6.3
+ true
+
+ sonatype-nexus-staging
+ https://s01.oss.sonatype.org/
+ true
+
+
+
+ org.apache.maven.plugins
+ maven-javadoc-plugin
+ 3.1.1
+
+ UTF-8
+ none
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 2.22.1
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+ 2.4.1
+
+
+ jar-with-dependencies
+
+
+
+ true
+ com.aliyun.sample.Sample
+
+
+
+
+
+ make-assembly
+ package
+
+ single
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/java/com/muyu/Ynpplication.java b/src/main/java/com/muyu/Ynpplication.java
new file mode 100644
index 0000000..fe6860d
--- /dev/null
+++ b/src/main/java/com/muyu/Ynpplication.java
@@ -0,0 +1,15 @@
+package com.muyu;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+@EnableScheduling
+@SpringBootApplication
+public class Ynpplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Ynpplication.class, args);
+ }
+
+}
diff --git a/src/main/java/com/muyu/common/aly/AliYunRcsService.java b/src/main/java/com/muyu/common/aly/AliYunRcsService.java
new file mode 100644
index 0000000..cd074e6
--- /dev/null
+++ b/src/main/java/com/muyu/common/aly/AliYunRcsService.java
@@ -0,0 +1,88 @@
+package com.muyu.common.aly;
+
+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.muyu.common.config.AliConfig;
+import com.muyu.common.domain.InstanceInfo;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @ClassName AliYunRcsService //类名称
+ * @Author: yannan //作者
+ * @CreateDate: 2024/4/16 20:49 //创建时间
+ * 阿里云ECS服务器OpenAPI调出
+ */
+@Service
+public class AliYunRcsService {
+
+
+ private final AliConfig aliConfig;
+
+ private final Client client;
+
+
+
+ public AliYunRcsService(AliConfig aliConfig, Client client){
+ this.aliConfig = aliConfig;
+ this.client=client;
+ }
+
+
+
+ public List selectECS(String instanceName) throws Exception {
+ DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest()
+ .setRegionId(aliConfig.getRegionId())
+ .setInstanceName(instanceName)
+ .setPageSize(10);
+
+ com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
+
+ List instanceInfos = new ArrayList<>(); // 用于存储查询到的实例信息
+
+ try {
+ 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 (TeaException error) {
+ error.printStackTrace();
+ // 异常处理
+ } catch (Exception _error) {
+ _error.printStackTrace();
+ // 异常处理
+ }
+
+ return instanceInfos;
+ }
+
+
+
+}
diff --git a/src/main/java/com/muyu/common/config/AliConfig.java b/src/main/java/com/muyu/common/config/AliConfig.java
new file mode 100644
index 0000000..6802ae3
--- /dev/null
+++ b/src/main/java/com/muyu/common/config/AliConfig.java
@@ -0,0 +1,55 @@
+package com.muyu.common.config;
+
+import com.aliyun.ecs20140526.Client;
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @ClassName AliConfig //类名称
+ * @Author: yn //作者
+ * @CreateDate: 2024-4-16 20:41 //创建时间
+ */
+@Configuration
+@ConfigurationProperties(prefix = "config.aly")
+@Data
+public class AliConfig {
+
+
+ /**
+ * access-key-id
+ */
+ private String accessKeyId;
+
+ /**
+ *access-key-secret
+ */
+ private String accessKeySecret;
+
+
+ /**
+ * 地域ID
+ */
+ private String regionId;
+
+
+
+ @Bean
+ public static Client createClient(AliConfig aliConfig) throws Exception {
+ // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
+ // 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html。
+ com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
+ // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
+ .setAccessKeyId(aliConfig.accessKeyId)
+ // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
+ .setAccessKeySecret(aliConfig.getAccessKeySecret());
+ // Endpoint 请参考 https://api.aliyun.com/product/Ecs
+ config.endpoint = "ecs.cn-shanghai.aliyuncs.com";
+ return new Client(config);
+ }
+
+
+
+
+}
diff --git a/src/main/java/com/muyu/common/config/ClientConfig.java b/src/main/java/com/muyu/common/config/ClientConfig.java
new file mode 100644
index 0000000..724bf0e
--- /dev/null
+++ b/src/main/java/com/muyu/common/config/ClientConfig.java
@@ -0,0 +1,27 @@
+package com.muyu.common.config;
+
+import com.aliyun.ecs20140526.Client;
+
+/**
+ * @author yn
+ * @description TODO
+ * @date 2024-04-13 12:40
+ */
+public class ClientConfig {
+
+
+
+ public static Client createClient() throws Exception {
+ // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
+ // 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html。
+ com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
+ // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
+ .setAccessKeyId("LTAI5tPDLpTbAX9bUSrTSrPH")
+ // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
+ .setAccessKeySecret("rbLG6bh8ZSttUPMxUspk9j8XLzvLU0");
+ // Endpoint 请参考 https://api.aliyun.com/product/Ecs
+ config.endpoint = "ecs.cn-shanghai.aliyuncs.com";
+ return new Client(config);
+ }
+
+}
diff --git a/src/main/java/com/muyu/common/config/CreateAnConfig.java b/src/main/java/com/muyu/common/config/CreateAnConfig.java
new file mode 100644
index 0000000..f811fa6
--- /dev/null
+++ b/src/main/java/com/muyu/common/config/CreateAnConfig.java
@@ -0,0 +1,329 @@
+package com.muyu.common.config;
+
+import com.aliyun.ecs20140526.Client;
+import com.aliyun.ecs20140526.models.*;
+import com.aliyun.tea.TeaException;
+import com.aliyun.tea.TeaModel;
+import com.aliyun.teaopenapi.models.Config;
+
+import com.muyu.common.contents.CreateContents;
+import com.muyu.common.domain.CreateVo;
+import com.muyu.common.domain.DeleteServer;
+import com.muyu.common.domain.Icreate;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @author yn
+ * @description 实例创建-查询-删除
+ * @date 2024-04-12 15:10
+ */
+@Component
+public class CreateAnConfig {
+
+
+ /**
+ * Initialization 初始化公共请求参数
+ */
+ public static Client Initialization(String regionId) throws Exception {
+ Config config = new Config();
+ // 您的AccessKey ID
+ config.accessKeyId = CreateContents.ACCESSKEYIDDATA;
+ // 您的AccessKey Secret
+ config.accessKeySecret = CreateContents.ACCESSKEYSECRETDATA;
+ // 您的可用区ID
+ config.regionId = regionId;
+ return new Client(config);
+ }
+
+
+
+ static int i = 1;
+
+ public static void main(String[] args_) throws Exception {
+ System.setOut(new java.io.PrintStream(System.out, true, "UTF-8"));
+ List args = java.util.Arrays.asList(args_);
+ Client client = ClientConfig.createClient();
+ DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest()
+ .setRegionId("cn-shanghai")
+ .setInstanceName("Test-server")
+ .setPageSize(10);
+
+ com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
+
+ try {
+ // 复制代码运行请自行打印 API 的返回值
+ DescribeInstancesResponse describeInstancesResponse = client.describeInstancesWithOptions(describeInstancesRequest, runtime);
+ DescribeInstancesResponseBody body = describeInstancesResponse.getBody();
+ DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstances instances = body.getInstances();
+ List instance = instances.getInstance();
+ instance.stream().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());
+ System.out.println("私网IP:" + item.getVpcAttributes().getPrivateIpAddress().ipAddress);
+ System.out.println("专有网络VPCID:" + item.getVpcAttributes().getVpcId());
+ System.out.println("安全组ID:" + item.getSecurityGroupIds().getSecurityGroupId());
+ System.out.println("创建时间:" + item.getCreationTime());
+ System.out.println("到期时间:" + item.getExpiredTime());
+ System.out.println("是否可以回收:" + (item.getRecyclable()?"是":"否") + "\n\n");
+ i++;
+
+ });
+ } catch (TeaException error) {
+ // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
+ // 错误 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);
+ // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
+ // 错误 message
+ System.out.println(error.getMessage());
+ // 诊断地址
+ System.out.println(error.getData().get("Recommend"));
+ com.aliyun.teautil.Common.assertAsString(error.message);
+ }
+ }
+
+
+
+ /**
+ * 查询实例方法
+ * @throws Exception
+ */
+ public static void findByCreate(CreateVo createVo) throws Exception {
+ //java.util.List args = java.util.Arrays.asList(args_);
+ // 地域Id
+ //String regionId = "cn-shanghai";
+ String regionId = createVo.getRedionId();
+ // 要查询的资源类型。取值范围:
+ // Zone:可用区。
+ // IoOptimized:I/O 优化。
+ // InstanceType:实例规格。
+ // SystemDisk:系统盘。
+ // DataDisk:数据盘。
+ // Network:网络类型。
+ // ddh:专有宿主机。
+ //String destinationResource = "InstanceType";
+ String destinationResource = createVo.getDestinationResource();
+ // 是否为I/O优化实例
+ // optimized:I/O优化
+ // none:非IO优化
+ //String ioOptimized = "optimized";
+ String ioOptimized = createVo.getIoOptimized();
+ // 实例规格
+ //说明: 如果您指定了InstanceType,则无法指定Cores或者Memory。
+ //String instanceType = "ecs.u1-c1m1.large";
+ String instanceType = createVo.getInstanceType();
+ Client client = CreateAnConfig.Initialization(regionId);
+ // 查询指定地域下所有可用区的库存供应情况
+ CreateAnConfig.DescribeAvailableResource(client, regionId, destinationResource, ioOptimized, instanceType);
+ }
+
+
+ /**
+ * DescribeAvailableResource 查询指定地域下所有可用区的库存供应情况
+ */
+ public static void DescribeAvailableResource(Client client, String regionId, String destinationResource, String ioOptimized, String instanceType) throws Exception {
+ System.setOut(new java.io.PrintStream(System.out, true, "UTF-8"));
+ DescribeAvailableResourceRequest request = new DescribeAvailableResourceRequest()
+ .setRegionId(regionId)
+ .setDestinationResource(destinationResource)
+ .setIoOptimized(ioOptimized)
+ .setInstanceType(instanceType);
+ try {
+ com.aliyun.teaconsole.Client.log("--------------------查询" + regionId + "地域下所有可用区的" + instanceType + "库存供应情况:--------------------");
+ DescribeAvailableResourceResponse responces = client.describeAvailableResource(request);
+ com.aliyun.teaconsole.Client.log("--------------------查询结果:" + com.aliyun.teautil.Common.toJSONString(TeaModel.buildMap(responces.body.availableZones)) + "--------------------");
+ } catch (TeaException error) {
+ com.aliyun.teaconsole.Client.log("--------------------查询失败:" + com.aliyun.teautil.Common.toJSONString(error.code) + "--------------------");
+
+ } catch (Exception _error) {
+ TeaException error = new TeaException(_error.getMessage(), _error);
+ com.aliyun.teaconsole.Client.log("--------------------查询失败:" + com.aliyun.teautil.Common.toJSONString(error.code) + "--------------------");
+
+ }
+ }
+
+
+ /**
+ * 创建实例方法
+ * @param icreate
+ * @throws Exception
+ */
+ public static String createAnServer(Icreate icreate) throws Exception {
+// java.util.List args = java.util.Arrays.asList(args_);
+ // 地域Id
+ //String regionId = "cn-shanghai";
+ String regionId = icreate.getRehionId();
+ // 镜像 ID,启动实例时选择的镜像资源。
+ // String imageId = "m-uf6elrscl3c9wk6o762l";
+ String imageId = icreate.getImageId();
+ // 实例规格
+ //String instanceType = "ecs.u1-c1m1.large";
+ String instanceType = icreate.getInstanceType();
+ // 新创建实例所属于的安全组 ID。
+ //String securityGroupId = "sg-uf6bj6vxp8ruhvffdsau";
+ String securityGroupId = icreate.getSecurityGroupId();
+ // 虚拟交换机 ID。
+ //String vSwitchId = "vsw-uf66jtgij0ptqxf1ix6l7 ";
+ String vSwitchId = icreate.getVSwitchId();
+ // 公网出带宽最大值,单位为 Mbit/s。取值范围:0~100。 默认值:0。
+ //Integer internetMaxBandwidthOut = Integer.parseInt("2");
+ Integer internetMaxBandwidthOut = Integer.parseInt(icreate.getInternetMaxBandwidthOut());
+ // 网络计费类型。取值范围:
+ // PayByBandwidth: 按固定带宽计费。
+ // PayByTraffic: 按使用流量计费。
+ // 默认值:PayByTraffic。
+ //String internetChargeType = "PayByTraffic";
+ String internetChargeType = icreate.getInternetChargeType();
+ // 系统盘大小
+ //String size = "20";
+ String size = icreate.getSize();
+ // 系统盘的云盘种类
+ //String category = "cloud_essd";
+ String category = icreate.getCategory();
+ // ECS实例的计费方式
+ // PrePaid:包年包月
+ // PostPaid:按量付费
+ //String instanceChargeType = "PostPaid";
+ String instanceChargeType = icreate.getInstanceChargeType();
+ Client client = CreateAnConfig.Initialization(regionId);
+ // 批量创建实例
+ String instances = CreateAnConfig.RunInstances(client, regionId, imageId, instanceType, securityGroupId, vSwitchId, internetMaxBandwidthOut, internetChargeType, size, category, instanceChargeType);
+
+ return instances;
+
+ }
+
+ /**
+ * 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 {
+ System.setOut(new java.io.PrintStream(System.out, true, "UTF-8"));
+ RunInstancesRequest request1 = new RunInstancesRequest()
+ .setRegionId(regionId)
+ .setImageId(imageId)
+ .setInstanceType(instanceType)
+ .setSecurityGroupId(securityGroupId)
+ .setVSwitchId(vSwitchId)
+ .setInstanceName("Myname")
+ .setDescription("Myprocure")
+ .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));
+ RunInstancesResponse responces = client.runInstances(request1);
+ try {
+ com.aliyun.teaconsole.Client.log("--------------------批量创建实例开始--------------------");
+
+ com.aliyun.teaconsole.Client.log("--------------------创建实例成功,实例ID:" + com.aliyun.teautil.Common.toJSONString(responces.body.instanceIdSets.instanceIdSet) + "--------------------");
+ } catch (TeaException error) {
+ com.aliyun.teaconsole.Client.log("--------------------创建实例失败:" + error+ "--------------------");
+ } catch (Exception _error) {
+ TeaException error = new TeaException(_error.getMessage(), _error);
+ com.aliyun.teaconsole.Client.log("--------------------创建实例失败:" +error + "--------------------");
+
+
+ }
+ return com.aliyun.teautil.Common.toJSONString(responces.body.instanceIdSets.instanceIdSet);
+ }
+
+ public static DescribeInstancesResponse DescribeInstances(Client client, String regionId, String instanceIds, String instanceName) throws Exception {
+ DescribeInstancesRequest req = new DescribeInstancesRequest()
+ .setRegionId(regionId)
+ .setInstanceName(instanceName);
+ if (!com.aliyun.teautil.Common.empty(instanceIds)) {
+ req.instanceIds = com.aliyun.teautil.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);
+ 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)));
+ }
+
+ /**
+ * 批量删除实力
+ * @param deleteServer
+ * @throws Exception
+ */
+ public static void DeleServerCreateAn(DeleteServer deleteServer) throws Exception {
+ // 区域ID
+ //String regionId = "cn-shanghai";
+ String regionId = deleteServer.getRegionId();
+ // 多个实例ID,用英文逗号分隔
+ //String instanceIds = "i-uf6h4s0jtpvobykd7vzc";
+ String instanceIds = deleteServer.getInstanceIds();
+ // 实例名称,支持使用通配符*进行模糊搜索
+ //String instanceName = "MyFirstEcsInstance";
+ String instanceName = deleteServer.getInstanceName();
+ // 强制删除有删除保护的机器
+ //String deleteProtected = "true";
+ String deleteProtected = deleteServer.getDeleteProtected();
+ // 强制删除运行中的机器
+ //String force = "true";
+ String force = deleteServer.getForce();
+ Client client = CreateAnConfig.Initialization(regionId);
+ if (com.aliyun.teautil.Common.equalString(deleteProtected, force)) {
+ DescribeInstancesResponse describeInstancesResp = CreateAnConfig.DescribeInstances(client, regionId, instanceIds, instanceName);
+ instanceIds = "";
+ for (DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstance instance : describeInstancesResp.body.instances.instance) {
+ instanceIds = "" + instance.instanceId + "," + instanceIds + "";
+ if (instance.deletionProtection) {
+ CreateAnConfig.ModifyInstanceAttribute(client, instance.instanceId);
+ }
+
+ }
+ instanceIds = com.aliyun.darabonbastring.Client.subString(instanceIds, 0, -1);
+ }
+
+ if (com.aliyun.teautil.Common.empty(instanceIds)) {
+ com.aliyun.teaconsole.Client.log("--------------------无有效实例可删除--------------------");
+ return ;
+ }
+
+ CreateAnConfig.DeleteInstances(client, regionId, instanceIds, force);
+ }
+}
diff --git a/src/main/java/com/muyu/common/config/FastJson2JsonRedisSerializer.java b/src/main/java/com/muyu/common/config/FastJson2JsonRedisSerializer.java
new file mode 100644
index 0000000..fb621d8
--- /dev/null
+++ b/src/main/java/com/muyu/common/config/FastJson2JsonRedisSerializer.java
@@ -0,0 +1,50 @@
+package com.muyu.common.config;
+
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONReader;
+import com.alibaba.fastjson2.JSONWriter;
+import com.alibaba.fastjson2.filter.Filter;
+import org.springframework.data.redis.serializer.RedisSerializer;
+import org.springframework.data.redis.serializer.SerializationException;
+
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * Redis使用FastJson序列化
+ *
+ * @author muyu
+ */
+public class FastJson2JsonRedisSerializer implements RedisSerializer {
+
+ public static final String[] JSON_WHITELIST_STR = {"org.springframework", "com.muyu"};
+ public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
+
+
+ static final Filter AUTO_TYPE_FILTER = JSONReader.autoTypeFilter(JSON_WHITELIST_STR);
+
+ private Class clazz;
+
+ public FastJson2JsonRedisSerializer (Class clazz) {
+ super();
+ this.clazz = clazz;
+ }
+
+ @Override
+ public byte[] serialize (T t) throws SerializationException {
+ if (t == null) {
+ return new byte[0];
+ }
+ return JSON.toJSONString(t, JSONWriter.Feature.WriteClassName).getBytes(DEFAULT_CHARSET);
+ }
+
+ @Override
+ public T deserialize (byte[] bytes) throws SerializationException {
+ if (bytes == null || bytes.length <= 0) {
+ return null;
+ }
+ String str = new String(bytes, DEFAULT_CHARSET);
+
+ return JSON.parseObject(str, clazz, AUTO_TYPE_FILTER);
+ }
+}
diff --git a/src/main/java/com/muyu/common/config/RedisConfig.java b/src/main/java/com/muyu/common/config/RedisConfig.java
new file mode 100644
index 0000000..2509d30
--- /dev/null
+++ b/src/main/java/com/muyu/common/config/RedisConfig.java
@@ -0,0 +1,43 @@
+package com.muyu.common.config;
+
+import org.springframework.boot.autoconfigure.AutoConfigureBefore;
+import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
+import org.springframework.cache.annotation.CachingConfigurerSupport;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+/**
+ * redis配置
+ *
+ * @author muyu
+ */
+@Configuration
+@EnableCaching
+@AutoConfigureBefore(RedisAutoConfiguration.class)
+public class RedisConfig extends CachingConfigurerSupport {
+
+
+ @Bean
+ @SuppressWarnings(value = {"unchecked", "rawtypes"})
+ public RedisTemplate