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 redisTemplate (RedisConnectionFactory connectionFactory) { + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(connectionFactory); + + FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class); + + // 使用StringRedisSerializer来序列化和反序列化redis的key值 + template.setKeySerializer(new StringRedisSerializer()); + template.setValueSerializer(serializer); + + // Hash的key也采用StringRedisSerializer的序列化方式 + template.setHashKeySerializer(new StringRedisSerializer()); + template.setHashValueSerializer(serializer); + + template.afterPropertiesSet(); + return template; + } +} diff --git a/src/main/java/com/muyu/common/contents/CreateContents.java b/src/main/java/com/muyu/common/contents/CreateContents.java new file mode 100644 index 0000000..0fe28d3 --- /dev/null +++ b/src/main/java/com/muyu/common/contents/CreateContents.java @@ -0,0 +1,14 @@ +package com.muyu.common.contents; + +/** + * @author yn + * @description TODO + * @date 2024-04-12 16:22 + */ +public class CreateContents { + + //AccessKey ID值 + public static final String ACCESSKEYIDDATA = "LTAI5tPDLpTbAX9bUSrTSrPH"; + //您的AccessKey Secret + public static final String ACCESSKEYSECRETDATA = "rbLG6bh8ZSttUPMxUspk9j8XLzvLU0"; +} diff --git a/src/main/java/com/muyu/common/domain/ApifoxModel.java b/src/main/java/com/muyu/common/domain/ApifoxModel.java new file mode 100644 index 0000000..d8d23ec --- /dev/null +++ b/src/main/java/com/muyu/common/domain/ApifoxModel.java @@ -0,0 +1,55 @@ +package com.muyu.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/muyu/common/domain/CPUInfo.java b/src/main/java/com/muyu/common/domain/CPUInfo.java new file mode 100644 index 0000000..10d27f3 --- /dev/null +++ b/src/main/java/com/muyu/common/domain/CPUInfo.java @@ -0,0 +1,30 @@ +package com.muyu.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/muyu/common/domain/CreateVo.java b/src/main/java/com/muyu/common/domain/CreateVo.java new file mode 100644 index 0000000..2679147 --- /dev/null +++ b/src/main/java/com/muyu/common/domain/CreateVo.java @@ -0,0 +1,32 @@ +package com.muyu.common.domain; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + * @author yn + * @description TODO + * @date 2024-04-12 16:17 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +public class CreateVo { + + //地域ID + private String redionId = "cn-shanghai"; + + //查询资源类型,取值范围 + private String destinationResource = "InstanceType"; + + //是否为I/O优化实例 + private String ioOptimized = "optimized"; + + //实例规格 + private String instanceType = "ecs.u1-c1m1.large"; + + private String instanceId; +} diff --git a/src/main/java/com/muyu/common/domain/DeleteServer.java b/src/main/java/com/muyu/common/domain/DeleteServer.java new file mode 100644 index 0000000..2556390 --- /dev/null +++ b/src/main/java/com/muyu/common/domain/DeleteServer.java @@ -0,0 +1,32 @@ +package com.muyu.common.domain; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + * @author yn + * @description TODO + * @date 2024-04-12 19:14 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +public class DeleteServer { + //区域ID + private String regionId = "cn-shanghai"; + + //多个实例ID,英文逗号隔开 + private String instanceIds; + + //实例名称,支持模糊查 + private String instanceName; + + //是否强制删除有删除保护的机器 默认 true + private String deleteProtected="true"; + + //是否强制删除运行中的机器 默认 true + private String force = "true"; +} diff --git a/src/main/java/com/muyu/common/domain/FlowInfo.java b/src/main/java/com/muyu/common/domain/FlowInfo.java new file mode 100644 index 0000000..ada9422 --- /dev/null +++ b/src/main/java/com/muyu/common/domain/FlowInfo.java @@ -0,0 +1,28 @@ +package com.muyu.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/muyu/common/domain/Icreate.java b/src/main/java/com/muyu/common/domain/Icreate.java new file mode 100644 index 0000000..59d83fa --- /dev/null +++ b/src/main/java/com/muyu/common/domain/Icreate.java @@ -0,0 +1,48 @@ +package com.muyu.common.domain; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + * @author yn + * @description TODO + * @date 2024-04-12 16:25 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +public class Icreate { + + //地域ID + private String rehionId = "cn-shanghai"; + + //镜像ID + private String imageId = "m-uf6hu0jwys1efmiemfxl"; + + //实例规格 + private String instanceType = "ecs.e-c1m1.large"; + + //安全组ID + private String securityGroupId = "sg-uf6bj6vxp8ruhvffdsau"; + + //虚拟交换机ID + private String vSwitchId = "vsw-uf6sfq669js64lwke0isv"; + + //公网出带宽最大值,单位为 Mbit/s。取值范围:0~100。 默认值:0。 + private String internetMaxBandwidthOut = "2"; + + //网络计费类型,取值范围 + private String internetChargeType = "PayByTraffic"; + + //系统盘大小 + private String size = "20"; + + //系统盘的云盘种类 + private String category = "cloud_essd"; + + //ECS实例的计费方式 + private String instanceChargeType = "PostPaid"; +} diff --git a/src/main/java/com/muyu/common/domain/InstanceInfo.java b/src/main/java/com/muyu/common/domain/InstanceInfo.java new file mode 100644 index 0000000..e858d5e --- /dev/null +++ b/src/main/java/com/muyu/common/domain/InstanceInfo.java @@ -0,0 +1,33 @@ +package com.muyu.common.domain; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; +import lombok.experimental.SuperBuilder; + +/** + * @author yn + * @description TODO + * @date 2024-04-13 18:41 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +@ToString +public class InstanceInfo{ + private String instanceId; + private String instanceName; + private String publicIpAddress; // 将数据类型修改为字符串 + private String privateIpAddress; // 将数据类型修改为字符串 + + + public void setPublicIpAddress(String ipAddress) { + this.publicIpAddress = ipAddress; + } + + public void setPrivateIpAddress(String ipAddress) { + this.privateIpAddress = ipAddress; + } +} diff --git a/src/main/java/com/muyu/common/domain/IsanJoin.java b/src/main/java/com/muyu/common/domain/IsanJoin.java new file mode 100644 index 0000000..97e7a48 --- /dev/null +++ b/src/main/java/com/muyu/common/domain/IsanJoin.java @@ -0,0 +1,22 @@ +package com.muyu.common.domain; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + * @author yn + * @description TODO + * @date 2024-04-15 10:57 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +public class IsanJoin { + //节点ID + private String insanId; + //连接数 + private Integer countConntion; +} diff --git a/src/main/java/com/muyu/common/domain/JVMInfo.java b/src/main/java/com/muyu/common/domain/JVMInfo.java new file mode 100644 index 0000000..76dc8bf --- /dev/null +++ b/src/main/java/com/muyu/common/domain/JVMInfo.java @@ -0,0 +1,58 @@ +package com.muyu.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/muyu/common/domain/MqttInfo.java b/src/main/java/com/muyu/common/domain/MqttInfo.java new file mode 100644 index 0000000..073413f --- /dev/null +++ b/src/main/java/com/muyu/common/domain/MqttInfo.java @@ -0,0 +1,63 @@ +package com.muyu.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/muyu/common/domain/NodeRegReq.java b/src/main/java/com/muyu/common/domain/NodeRegReq.java new file mode 100644 index 0000000..11599ce --- /dev/null +++ b/src/main/java/com/muyu/common/domain/NodeRegReq.java @@ -0,0 +1,28 @@ +package com.muyu.common.domain; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author yn + * @description TODO + * @date 2024-04-13 8:33 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class NodeRegReq { + + /** + * 客户端ID + */ + private String clientId; + + /** + * token + */ + private String token; +} diff --git a/src/main/java/com/muyu/common/redis/RedisService.java b/src/main/java/com/muyu/common/redis/RedisService.java new file mode 100644 index 0000000..115578c --- /dev/null +++ b/src/main/java/com/muyu/common/redis/RedisService.java @@ -0,0 +1,336 @@ +package com.muyu.common.redis; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.*; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * spring redis 工具类 + * + * @author muyu + **/ +@SuppressWarnings(value = {"unchecked", "rawtypes"}) +@Component +public class RedisService { + @Autowired + public RedisTemplate redisTemplate; + + /** + * 缓存基本的对象,Integer、String、实体类等 + * + * @param key 缓存的键值 + * @param value 缓存的值 + */ + public void setCacheObject (final String key, final T value) { + redisTemplate.opsForValue().set(key, value); + } + + public SetOperations opsForSet() { + return redisTemplate.opsForSet(); + } + public HashOperations opsForHash() { + return (HashOperations) redisTemplate.opsForHash(); + } + + // 获取缓存集合的方法,返回 List + public List getCacheSets(String key) { + // 获取绑定的 Set 操作对象 + BoundSetOperations setOperation = redisTemplate.boundSetOps(key); + + // 获取 Redis 集合中的所有元素,并转换为 List + Set members = setOperation.members(); + return members.stream() + .map(Object::toString) + .collect(Collectors.toList()); + } + + /** + * 减少序列值 + * @param key + * @param number + * @return + */ + public Long increment(final String key , Long number){ + return redisTemplate.opsForValue().increment(key,number); + } + /** + * 向 Redis 集合中添加元素 + * @param key Redis 集合的 key + * @param value 要添加的元素 + * @return 如果元素不存在并成功添加返回 true,如果元素已经存在则返回 false + */ + public boolean addToSet(String key, String value) { + Long added = redisTemplate.opsForSet().add(key, value); + return added == 1?true:false; + } + public ZSetOperations opsForZSet() { + return redisTemplate.opsForZSet(); + } + /** + * 缓存基本的对象,Integer、String、实体类等 + * + * @param key 缓存的键值 + * @param value 缓存的值 + * @param timeout 时间 + * @param timeUnit 时间颗粒度 + */ + public void setCacheObject (final String key, final T value, final Long timeout, final TimeUnit timeUnit) { + redisTemplate.opsForValue().set(key, value, timeout, timeUnit); + } + + /** + * 设置有效时间 + * + * @param key Redis键 + * @param timeout 超时时间 + * + * @return true=设置成功;false=设置失败 + */ + public boolean expire (final String key, final long timeout) { + return expire(key, timeout, TimeUnit.SECONDS); + } + + public ValueOperations opsForValue() { + return redisTemplate.opsForValue(); + } + /** + * 设置有效时间 + * + * @param key Redis键 + * @param timeout 超时时间 + * @param unit 时间单位 + * + * @return true=设置成功;false=设置失败 + */ + public boolean expire (final String key, final long timeout, final TimeUnit unit) { + return redisTemplate.expire(key, timeout, unit); + } + + /** + * 获取有效时间 + * + * @param key Redis键 + * + * @return 有效时间 + */ + public long getExpire (final String key) { + return redisTemplate.getExpire(key); + } + + /** + * 判断 key是否存在 + * + * @param key 键 + * + * @return true 存在 false不存在 + */ + public Boolean hasKey (String key) { + return redisTemplate.hasKey(key); + } + + + + /** + * 获得缓存的基本对象。 + * + * @param key 缓存键值 + * + * @return 缓存键值对应的数据 + */ + public T getCacheObject (final String key) { + ValueOperations operation = redisTemplate.opsForValue(); + return operation.get(key); + } + + /** + * 删除单个对象 + * + * @param key + */ + public boolean deleteObject (final String key) { + return redisTemplate.delete(key); + } + + /** + * 删除集合对象 + * + * @param collection 多个对象 + * + * @return + */ + public boolean deleteObject (final Collection collection) { + return redisTemplate.delete(collection) > 0; + } + + /** + * 缓存List数据 + * + * @param key 缓存的键值 + * @param dataList 待缓存的List数据 + * + * @return 缓存的对象 + */ + public long setCacheList (final String key, final List dataList) { + Long count = redisTemplate.opsForList().rightPushAll(key, dataList); + return count == null ? 0 : count; + } + + /** + * 获得缓存的list对象 + * + * @param key 缓存的键值 + * + * @return 缓存键值对应的数据 + */ + public T getCacheList (final String key,Long index) { + return (T) redisTemplate.opsForList().index(key, index); + } + /** + * 缓存Set + * + * @param key 缓存键值 + * @param dataSet 缓存的数据 + * + * @return 缓存数据的对象 + */ + public BoundSetOperations setCacheSet (final String key, final Set dataSet) { + BoundSetOperations setOperation = redisTemplate.boundSetOps(key); + Iterator it = dataSet.iterator(); + while (it.hasNext()) { + setOperation.add(it.next()); + } + return setOperation; + } + + /** + * 缓存Set + * + * @param key 缓存键值 + * @param setValue 缓存的数据 + * + * @return 缓存数据的对象 + */ + public BoundSetOperations setCacheSets (final String key, final T setValue) { + BoundSetOperations setOperation = redisTemplate.boundSetOps(key); + setOperation.add(setValue); + return setOperation; + } + /** + * 删除set值 + * + * @param key 缓存键值 + * @param setValue 缓存的数据 + * + * @return 缓存数据的对象 + */ + public void deleteCachSet(String key, String setValue) { + BoundSetOperations setOperation = redisTemplate.boundSetOps(key); + setOperation.remove(setValue); + } + /** + * 获得缓存的set + * + * @param key + * + * @return + */ + public Set getCacheSet (final String key) { + return redisTemplate.opsForSet().members(key); + } + + /** + * 缓存Map + * + * @param key + * @param dataMap + */ + public void setCacheMap (final String key, final Map dataMap) { + if (dataMap != null) { + redisTemplate.opsForHash().putAll(key, dataMap); + } + } + + /** + * 获得缓存的Map + * + * @param key + * + * @return + */ + public Map getCacheMap (final String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * 往Hash中存入数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @param value 值 + */ + public void setCacheMapValue (final String key, final String hKey, final T value) { + redisTemplate.opsForHash().put(key, hKey, value); + } + + /** + * 获取Hash中的数据 + * + * @param key Redis键 + * @param hKey Hash键 + * + * @return Hash中的对象 + */ + public T getCacheMapValue (final String key, final String hKey) { + HashOperations opsForHash = redisTemplate.opsForHash(); + return opsForHash.get(key, hKey); + } + + /** + * 获取多个Hash中的数据 + * + * @param key Redis键 + * @param hKeys Hash键集合 + * + * @return Hash对象集合 + */ + public List getMultiCacheMapValue (final String key, final Collection hKeys) { + return redisTemplate.opsForHash().multiGet(key, hKeys); + } + + /** + * 删除Hash中的某条数据 + * + * @param key Redis键 + * @param hKey Hash键 + * + * @return 是否成功 + */ + public boolean deleteCacheMapValue (final String key, final String hKey) { + return redisTemplate.opsForHash().delete(key, hKey) > 0; + } + + /** + * 获得缓存的基本对象列表 + * + * @param pattern 字符串前缀 + * + * @return 对象列表 + */ + public Collection keys (final String pattern) { + return redisTemplate.keys(pattern); + } + + + public void rightPush(String key, String value) { + redisTemplate.opsForList().rightPush(key, value); + } + + + public Object leftPopAndRemove(String key) { + return redisTemplate.opsForList().leftPop(key); + } +} diff --git a/src/main/java/com/muyu/common/utils/Result.java b/src/main/java/com/muyu/common/utils/Result.java new file mode 100644 index 0000000..4e1de4c --- /dev/null +++ b/src/main/java/com/muyu/common/utils/Result.java @@ -0,0 +1,111 @@ +package com.muyu.common.utils; + + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 响应信息主体 + * + * @author muyu + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Result implements Serializable { + /** + * 成功 + */ + public static final int SUCCESS = 200; + /** + * 失败 + */ + public static final int FAIL = 500; + /** + * 警告 + */ + public static final int WARN = 800; + + private static final long serialVersionUID = 1L; + private int code; + + private String msg; + + private T data; + + public static Result success () { + return restResult(null, SUCCESS, null); + } + + public static Result success (T data) { + return restResult(data, SUCCESS, null); + } + + public static Result success (T data, String msg) { + return restResult(data, SUCCESS, msg); + } + + public static Result error () { + return restResult(null, FAIL, null); + } + + public static Result error (String msg) { + return restResult(null, FAIL, msg); + } + + public static Result error (T data) { + return restResult(data, FAIL, null); + } + + public static Result error (T data, String msg) { + return restResult(data, FAIL, msg); + } + + public static Result error (int code, String msg) { + return restResult(null, code, msg); + } + + + + public static Result warn () { + return restResult(null, WARN, null); + } + + public static Result warn (String msg) { + return restResult(null, WARN, msg); + } + + public static Result warn (T data) { + return restResult(data, WARN, null); + } + + public static Result warn (T data, String msg) { + return restResult(data, WARN, msg); + } + + public static Result warn (int code, String msg) { + return restResult(null, code, msg); + } + + private static Result restResult (T data, int code, String msg) { + return Result.builder() + .code(code) + .data(data) + .msg(msg) + .build(); + } + + public static Boolean isError (Result ret) { + return !isSuccess(ret); + } + + public static Boolean isSuccess (Result ret) { + return Result.SUCCESS == ret.getCode(); + } + +} diff --git a/src/main/java/com/muyu/controller/AlController.java b/src/main/java/com/muyu/controller/AlController.java new file mode 100644 index 0000000..9a81c5d --- /dev/null +++ b/src/main/java/com/muyu/controller/AlController.java @@ -0,0 +1,185 @@ +package com.muyu.controller; + +import com.alibaba.fastjson2.JSONObject; +import com.muyu.common.redis.RedisService; +import com.muyu.common.utils.Result; +import com.muyu.common.domain.IsanJoin; +import lombok.AllArgsConstructor; +import lombok.Data; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.*; +import java.util.concurrent.CountDownLatch; + +/** + * @author yn + * @description 负载中心 算法 + * @date 2024-04-15 11:02 + */ +@Component +@RestController +@RequestMapping("/vecOne") +public class AlController { + @Autowired + private RedisService redisService; + + @RequestMapping("/vecTwo") + public Result contextLoads() { + //初始化序列 + redisService.setCacheObject("cursor", 0); + + List nodeIdList = new ArrayList<>(); + //获取缓存中值 + Set cacheSet = redisService.getCacheSet("Isantion:conntionCount"); + for (Object o : cacheSet) { + String str = (String) o; + IsanJoin isanJoin = JSONObject.parseObject(str, IsanJoin.class); + nodeIdList.add(new WorkGetWayNode(isanJoin.getInsanId(), isanJoin.getCountConntion())); + } + + +// List nodeIdList = new ArrayList() {{ +// add(new WorkGetWayNode("work-gateway-node-A", 8)); +// add(new WorkGetWayNode("work-gateway-node-B", 12)); +// add(new WorkGetWayNode("work-gateway-node-C", 2)); +// add(new WorkGetWayNode("work-gateway-node-D", 39)); +// add(new WorkGetWayNode("work-gateway-node-E", 39)); +// }}; + + // 创建一个空列表用于存储节点ID + List loadNodelist = new ArrayList<>(); + // 计算权重总和 + long count = nodeIdList.stream().mapToInt(WorkGetWayNode::getWeight).count(); + + // 若总权重小于100,则重新分配权重使之等于100 + if (count < 100) { + List list = nodeIdList.stream() + .sorted(((o1, o2) -> o2.getWeight() - o1.getWeight())) + .toList(); + + int countWeight = 0; + for (long i = 0; i < 100; i++) { + WorkGetWayNode workGetWayNode = list.get(countWeight++ % list.size()); + workGetWayNode.setWeight(workGetWayNode.getWeight() + 1); + } + } + + // 循环分配任务给各节点,直到所有节点权重为0 + whFor: + while (true) { + for (WorkGetWayNode workGetWayNode : nodeIdList) { + int weight = workGetWayNode.getWeight(); + if (weight > 0) { + loadNodelist.add(workGetWayNode.getNodeId()); + workGetWayNode.setWeight(weight - 1); + } + int sum = nodeIdList.stream() + .mapToInt(WorkGetWayNode::getWeight) + .sum(); + if (sum <= 0) { + break whFor; + } + } + } + + // 清空并更新节点列表缓存 + redisService.deleteObject("work:node:gateway"); + redisService.setCacheList("work:node:gateway", loadNodelist); + + // 使用计数器控制并发执行任务 + CountDownLatch downLatch = new CountDownLatch(3000); + + // 创建并启动线程执行任务 + new Thread(() -> { + for (int i = 0; i < 1000; i++) { + // 增加序列值 + Long cursor = redisService.increment("cursor", 1L); + // 获取节点ID + String nodeId = redisService.getCacheList("work:node:gateway", cursor % 100); + System.out.println(Thread.currentThread().getName() + ":" + cursor + "--------" + nodeId); + // 执行任务 + stiNode.sti(nodeId); + downLatch.countDown(); + } + }).start(); + new Thread(() -> { + for (int i = 0; i < 1000; i++) { + //增加序列值 + Long cursor = redisService.increment("cursor", 1L); + String nodeId = redisService.getCacheList("work:node:gateway", cursor % 100); + System.out.println(Thread.currentThread().getName() + ":" + cursor + "--------" + nodeId); + stiNode.sti(nodeId); + downLatch.countDown(); + } + }).start(); + + new Thread(() -> { + for (int i = 0; i < 1000; i++) { + //增加序列值 + Long cursor = redisService.increment("cursor", 1L); + String nodeId = redisService.getCacheList("work:node:gateway", cursor % 100); + System.out.println(Thread.currentThread().getName() + ":" + cursor + "--------" + nodeId); + stiNode.sti(nodeId); + downLatch.countDown(); + } + }).start(); + + try { + downLatch.await(); + + Map show = stiNode.show(); + + Map.Entry maxEntry = show.entrySet().stream() + .max(Comparator.comparing(Map.Entry::getValue)) + .orElse(null); + + if (maxEntry != null) { + System.out.println("<<<<<<<<<<<<< stiNodeMqp = new HashMap<>(); + + public synchronized static void sti(String nodeId) { + Integer stiCount = stiNodeMqp.getOrDefault(nodeId, 0); + stiNodeMqp.put(nodeId, stiCount + 1); + } + + + public static Map show() { + Map addMap = new HashMap<>(); + stiNodeMqp.forEach((key, val) -> { + addMap.put(key,Long.valueOf(val)); + System.out.println(key + "-------" + val); + }); + return addMap; + + } +} + +@Data +@AllArgsConstructor +class WorkGetWayNode { + + private String nodeId; + + private int Weight; + +} diff --git a/src/main/java/com/muyu/controller/LoadCenterController.java b/src/main/java/com/muyu/controller/LoadCenterController.java new file mode 100644 index 0000000..373d8fd --- /dev/null +++ b/src/main/java/com/muyu/controller/LoadCenterController.java @@ -0,0 +1,191 @@ +package com.muyu.controller; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.aliyun.ecs20140526.models.DescribeInstancesResponse; +import com.aliyun.ecs20140526.models.DescribeInstancesResponseBody; +import com.aliyun.tea.TeaException; + + +import com.muyu.common.config.ClientConfig; +import com.muyu.common.config.CreateAnConfig; +import com.muyu.common.redis.RedisService; +import com.muyu.common.domain.Icreate; +import com.muyu.common.domain.InstanceInfo; +import com.muyu.common.domain.IsanJoin; +import lombok.extern.log4j.Log4j2; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.*; + +/** + * @author yn + * @description TODO + * @date 2024-04-13 12:46 + */ +@Component +@Log4j2 +public class LoadCenterController { + + //定义一个值 + @Autowired + private RedisService redisService; + //车辆点击上线,通过负载中心,返回一个ip地址,请求连接到返回的ip地址 + + /** + * 定时器扫描 是否需要创建节点 + * + * @throws Exception + */ + @Scheduled(cron = "0/5 * * * * ?") + public void scheduleECS() throws Exception { + + // 第一次进来,先查询是否存在收集节点 节点名称默认都为 “Myname” + List Instance = selectECS("Myname"); + + redisService.deleteObject("Isantion:conntionCount"); + + //不为空 + if (!Instance.isEmpty()){ + //遍历集合 + for (InstanceInfo instanceInfo : Instance) { + //获取当前对象存入redis + redisService.setCacheSets("Instance:ache", JSON.toJSONString(instanceInfo)); + } + + //获取缓存中的对象 + List cacheSets = redisService.getCacheSets("Instance:ache"); + + for (String cacheSet : cacheSets) { + + String string = cacheSet; + InstanceInfo instanClasss = JSONObject.parseObject(string, InstanceInfo.class); + + + //获取每个FluxMQ运行信息 + String URL = "http://"+instanClasss.getPublicIpAddress()+":8080/public/cluster"; + //假设这里出现了超出预设连接数大于80%,则进行扩容 + 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(); + + try { + Response response = client.newCall(request).execute(); + + JSONArray jsonArray = JSONArray.parseArray(response.body().string()); + JSONObject jsonObject = jsonArray.getJSONObject(0); + JSONObject mqttInfo = jsonObject.getJSONObject("mqttInfo"); + int connectSize = mqttInfo.getIntValue("connectSize"); + + log.info("当前:"+instanClasss.getPublicIpAddress()+",的连接数===="+connectSize); + //存入收集节点ID:连接数 + IsanJoin isanJoin = new IsanJoin(); + isanJoin.setInsanId(instanClasss.getPublicIpAddress()); + isanJoin.setCountConntion(connectSize); + redisService.setCacheSets("Isantion:conntionCount", JSON.toJSONString(isanJoin)); + //判断是否达到连接数80 + if (connectSize >= 1000) { + //节点扩容 + try { + Icreate icreate = new Icreate(); + String anServer = CreateAnConfig.createAnServer(icreate); + log.info("扩容成功,实例ID为:{}", anServer); + // 每次新增查询实例集合 + List Instan = selectECS("Myname"); + //遍历集合 + for (InstanceInfo instanceInfo : Instan) { + //新增存入缓存 + redisService.setCacheSets("Instance:ache", JSON.toJSONString(instanceInfo)); + } + } catch (Exception e) { + throw new RuntimeException("扩容失败:" + e.getMessage()); + } + + } + }catch (Exception e) { + e.printStackTrace(); + } + } + + } +// //没收集节点时创建一个实例 +// Icreate icreate = new Icreate(); +// //执行创建实例方法 +// String anServer = CreateAn.createAnServer(icreate); +// //打印实例ID +// log.info("扩容成功,实例ID为:{}", anServer); +// // 执行查询实例集合 +// List Instan = selectECS("Myname"); +// //遍历集合 +// for (InstanceInfo instanceInfo : Instan) { +// //新增存入缓存 +// redisService.setCacheSets("Instance:ache", JSON.toJSONString(instanceInfo)); +// } +// + } + + + + public static List selectECS(String instanceName) throws Exception { + com.aliyun.ecs20140526.Client client = ClientConfig.createClient(); + 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(); + + 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/controller/VehicleController.java b/src/main/java/com/muyu/controller/VehicleController.java new file mode 100644 index 0000000..66aa90e --- /dev/null +++ b/src/main/java/com/muyu/controller/VehicleController.java @@ -0,0 +1,43 @@ +package com.muyu.controller; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author yn + * @description TODO + * @date 2024-04-01 20:56 + */ +@RestController +public class VehicleController { + + @PostMapping("/vehicle/online") + public ResponseEntity vahiclieOnline( + @RequestParam String vin, + @RequestParam String time, + @RequestParam String randomString + ){ + //将请求发送到fluxmq节点 + boolean connected = sendRequestToFluxMQ(vin, time, randomString); + + if (connected){ + //如果成功连接,则返回成功响应 + return ResponseEntity.ok("成功连接"); + } + //连接失败,返回错误响应,客户端需要重新走流程 + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body("链接失败"); + } + + //将请求发送到fluxmq节点的方法 + private boolean sendRequestToFluxMQ(String vin,String time,String randomString){ + // 在这里实现将请求发送到 fluxmq 节点的逻辑 + // 可以使用相应的消息队列客户端来发送消息 + + // 这里只是一个示例,假设连接成功 + return true; + } +} diff --git a/src/main/java/com/muyu/demos/web/BasicController.java b/src/main/java/com/muyu/demos/web/BasicController.java new file mode 100644 index 0000000..65e8908 --- /dev/null +++ b/src/main/java/com/muyu/demos/web/BasicController.java @@ -0,0 +1,67 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.muyu.demos.web; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @author theonefx + */ +@Controller +public class BasicController { + + // http://127.0.0.1:8080/hello?name=lisi + @RequestMapping("/hello") + @ResponseBody + public String hello(@RequestParam(name = "name", defaultValue = "unknown user") String name) { + return "Hello " + name; + } + + // http://127.0.0.1:8080/user + @RequestMapping("/user") + @ResponseBody + public User user() { + User user = new User(); + user.setName("theonefx"); + user.setAge(666); + return user; + } + + // http://127.0.0.1:8080/save_user?name=newName&age=11 + @RequestMapping("/save_user") + @ResponseBody + public String saveUser(User u) { + return "user will save: name=" + u.getName() + ", age=" + u.getAge(); + } + + // http://127.0.0.1:8080/html + @RequestMapping("/html") + public String html(){ + return "index.html"; + } + + @ModelAttribute + public void parseUser(@RequestParam(name = "name", defaultValue = "unknown user") String name + , @RequestParam(name = "age", defaultValue = "12") Integer age, User user) { + user.setName("zhangsan"); + user.setAge(18); + } +} diff --git a/src/main/java/com/muyu/demos/web/PathVariableController.java b/src/main/java/com/muyu/demos/web/PathVariableController.java new file mode 100644 index 0000000..e3024a9 --- /dev/null +++ b/src/main/java/com/muyu/demos/web/PathVariableController.java @@ -0,0 +1,44 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.muyu.demos.web; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @author theonefx + */ +@Controller +public class PathVariableController { + + // http://127.0.0.1:8080/user/123/roles/222 + @RequestMapping(value = "/user/{userId}/roles/{roleId}", method = RequestMethod.GET) + @ResponseBody + public String getLogin(@PathVariable("userId") String userId, @PathVariable("roleId") String roleId) { + return "User Id : " + userId + " Role Id : " + roleId; + } + + // http://127.0.0.1:8080/javabeat/somewords + @RequestMapping(value = "/javabeat/{regexp1:[a-z-]+}", method = RequestMethod.GET) + @ResponseBody + public String getRegExp(@PathVariable("regexp1") String regexp1) { + return "URI Part : " + regexp1; + } +} diff --git a/src/main/java/com/muyu/demos/web/User.java b/src/main/java/com/muyu/demos/web/User.java new file mode 100644 index 0000000..8e07afb --- /dev/null +++ b/src/main/java/com/muyu/demos/web/User.java @@ -0,0 +1,43 @@ +/* + * Copyright 2013-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.muyu.demos.web; + +/** + * @author theonefx + */ +public class User { + + private String name; + + private Integer age; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } +} diff --git a/src/main/java/com/muyu/server/ClientRegController.java b/src/main/java/com/muyu/server/ClientRegController.java new file mode 100644 index 0000000..47315c0 --- /dev/null +++ b/src/main/java/com/muyu/server/ClientRegController.java @@ -0,0 +1,111 @@ +package com.muyu.server; + +import com.muyu.common.redis.RedisService; +import com.muyu.common.utils.Result; +import lombok.extern.log4j.Log4j2; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.ValueOperations; +import org.springframework.data.redis.core.ZSetOperations; +import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletRequest; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + +/** + * @author yn + * @description TODO + * @date 2024-03-27 16:21 + * + * + * guoxubao.e3.luyouxia.net:12867 ->内网事件 + * + * http://guoxubao.w1.luyouxia.net -》外网事件 + */ +@RestController +@RequestMapping("reg") +@Log4j2 +public class ClientRegController { + + @Autowired + private HttpServletRequest request; + + @Autowired + private RedisService redisService; + + private Set tokenset = new HashSet<>(); + + /** + * 申请注册接口 获取到token值 + * 申请走内网:guoxubao.e3.luyouxia.net:12867/reg/apply + * @return + */ + @PostMapping("/apply") + public Result applicationRegistartion(){ + //生成令牌 只能使用一次 + String token = UUID.randomUUID().toString().replaceAll("-",""); + + tokenset.add(token); //到时候存redis + + log.info("程序生成令牌:{}",token); + + return Result.success(token); + } + + + + /** + * 注册收集节点 + * @return + */ + @PostMapping + public Result reg(@RequestBody NodeRegReq nodeRegReq) + { + + //后期负载均衡 + ZSetOperations zSetOperations = redisService.opsForZSet(); + + zSetOperations.add("LocadKey",nodeRegReq.getClientId(),0.0); + + + + //基本信息的存储 + ValueOperations opsedForValue = redisService.opsForValue(); + + opsedForValue.set(nodeRegReq.getClientId(),"存储客户端基本信息:ip,端口,负载"); + + return Result.success(); +} + + /** + * 获取用户基本信息 + * @param token + * @return + */ + public Result getConnectionOption(@RequestParam("token")String token){ + //token验证检查令牌是否有效 + if (!tokenset.contains(token)){ + + //令牌无效,返回错误信息 + log.warn("无效的令牌:{}",token); + + return Result.error("无效的令牌"); + } + + //通过负载key拿到客户端ID + ZSetOperations zSetOperations = redisService.opsForZSet(); + + ZSetOperations.TypedTuple fuzaiKey = zSetOperations.popMin("fuzaiKey"); + + //获取客户端ID + String cliendId = (String) fuzaiKey.getValue(); + + //根据客户端ID获取存储的基本信息 + ValueOperations opsedForValue = redisService.opsForValue(); + + //客户端的基本信息 + String s = opsedForValue.get(cliendId); + + return Result.success(s); + } +} diff --git a/src/main/java/com/muyu/server/NodeRegReq.java b/src/main/java/com/muyu/server/NodeRegReq.java new file mode 100644 index 0000000..955bc3f --- /dev/null +++ b/src/main/java/com/muyu/server/NodeRegReq.java @@ -0,0 +1,24 @@ +package com.muyu.server; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 注册模型请求对象 + * @author yn + * @description TODO + * @date 2024-03-27 17:27 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class NodeRegReq { + /** + * 客户端ID + */ + private String clientId; + private String token; +} diff --git a/src/main/java/com/muyu/test/fluxmqTest.java b/src/main/java/com/muyu/test/fluxmqTest.java new file mode 100644 index 0000000..b3aa344 --- /dev/null +++ b/src/main/java/com/muyu/test/fluxmqTest.java @@ -0,0 +1,115 @@ +package com.muyu.test; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +/** + * @author yn + * @description TODO + * @date 2024-04-13 9:39 + */ +public class fluxmqTest { + public static void main(String[] args) { + // FluxMQ 注册接口 URL + String fluxMQRegisterUrl = "http://43.143.161.183/register"; + + // 第一个请求获取 token 的 URL + String getTokenUrl = "http://43.143.161.183/getToken"; + + try { + // 发起第一个请求获取 token + String token = getToken(getTokenUrl); + + // 构建注册请求参数,包括 token + Map params = new HashMap<>(); + params.put("username", "your_username"); + params.put("email", "your_email@example.com"); + params.put("token", token); + + // 发起注册请求 + String response = register(fluxMQRegisterUrl, params); + + // 处理注册响应结果 + System.out.println("Response from FluxMQ registration: " + response); + } catch (Exception e) { + e.printStackTrace(); + } + } + + // 发起第一个请求获取 token + private static String getToken(String url) throws Exception { + HttpURLConnection conn = null; + try { + URL tokenUrl = new URL(url); + conn = (HttpURLConnection) tokenUrl.openConnection(); + conn.setRequestMethod("GET"); + + BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); + String line; + StringBuilder response = new StringBuilder(); + while ((line = reader.readLine()) != null) { + response.append(line); + } + reader.close(); + + // 解析 JSON 响应获取 token + // 这里假设 JSON 响应格式为 {"token": "your_token_value"} + String jsonResponse = response.toString(); + return jsonResponse.substring(jsonResponse.indexOf(':') + 2, jsonResponse.lastIndexOf('"')); + } finally { + if (conn != null) { + conn.disconnect(); + } + } + } + + // 发起注册请求 + private static String register(String url, Map params) throws Exception { + HttpURLConnection conn = null; + try { + URL registerUrl = new URL(url); + conn = (HttpURLConnection) registerUrl.openConnection(); + + // 设置请求方法为 POST + conn.setRequestMethod("POST"); + conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + conn.setRequestProperty("Accept", "application/json"); + conn.setDoInput(true); + conn.setDoOutput(true); + + // 构建请求参数 + StringBuilder postData = new StringBuilder(); + for (Map.Entry param : params.entrySet()) { + if (postData.length() != 0) { + postData.append('&'); + } + postData.append(param.getKey()); + postData.append('='); + postData.append(param.getValue()); + } + + // 将参数写入请求体 + byte[] postDataBytes = postData.toString().getBytes("UTF-8"); + conn.getOutputStream().write(postDataBytes); + + // 获取注册响应 + BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); + String line; + StringBuilder response = new StringBuilder(); + while ((line = reader.readLine()) != null) { + response.append(line); + } + reader.close(); + + return response.toString(); + } finally { + if (conn != null) { + conn.disconnect(); + } + } + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..0414873 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,14 @@ +server: + port: 9209 + +spring: + application: + name: mqtt + redis: + host: 127.0.0.1 + +config: + ali: + access-key-id: LTAI5tPDLpTbAX9bUSrTSrPH + access-key-secret: rbLG6bh8ZSttUPMxUspk9j8XLzvLU0 + region-id: cn-shanghai diff --git a/src/main/resources/static/index.html b/src/main/resources/static/index.html new file mode 100644 index 0000000..e2d94a2 --- /dev/null +++ b/src/main/resources/static/index.html @@ -0,0 +1,6 @@ + + +

hello word!!!

+

this is a html page

+ + \ No newline at end of file diff --git a/src/test/java/com/muyu/MqttApplicationTests.java b/src/test/java/com/muyu/MqttApplicationTests.java new file mode 100644 index 0000000..762c9d5 --- /dev/null +++ b/src/test/java/com/muyu/MqttApplicationTests.java @@ -0,0 +1,13 @@ +package com.muyu; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class MqttApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/target/classes/application.yml b/target/classes/application.yml new file mode 100644 index 0000000..0414873 --- /dev/null +++ b/target/classes/application.yml @@ -0,0 +1,14 @@ +server: + port: 9209 + +spring: + application: + name: mqtt + redis: + host: 127.0.0.1 + +config: + ali: + access-key-id: LTAI5tPDLpTbAX9bUSrTSrPH + access-key-secret: rbLG6bh8ZSttUPMxUspk9j8XLzvLU0 + region-id: cn-shanghai diff --git a/target/classes/com/muyu/Ynpplication.class b/target/classes/com/muyu/Ynpplication.class new file mode 100644 index 0000000..5ffe838 Binary files /dev/null and b/target/classes/com/muyu/Ynpplication.class differ diff --git a/target/classes/com/muyu/common/aly/AliYunRcsService.class b/target/classes/com/muyu/common/aly/AliYunRcsService.class new file mode 100644 index 0000000..2c4d257 Binary files /dev/null and b/target/classes/com/muyu/common/aly/AliYunRcsService.class differ diff --git a/target/classes/com/muyu/common/config/AliConfig.class b/target/classes/com/muyu/common/config/AliConfig.class new file mode 100644 index 0000000..9299e2f Binary files /dev/null and b/target/classes/com/muyu/common/config/AliConfig.class differ diff --git a/target/classes/com/muyu/common/config/ClientConfig.class b/target/classes/com/muyu/common/config/ClientConfig.class new file mode 100644 index 0000000..cb2003e Binary files /dev/null and b/target/classes/com/muyu/common/config/ClientConfig.class differ diff --git a/target/classes/com/muyu/common/config/CreateAnConfig.class b/target/classes/com/muyu/common/config/CreateAnConfig.class new file mode 100644 index 0000000..d88a34d Binary files /dev/null and b/target/classes/com/muyu/common/config/CreateAnConfig.class differ diff --git a/target/classes/com/muyu/common/config/FastJson2JsonRedisSerializer.class b/target/classes/com/muyu/common/config/FastJson2JsonRedisSerializer.class new file mode 100644 index 0000000..fe42ba3 Binary files /dev/null and b/target/classes/com/muyu/common/config/FastJson2JsonRedisSerializer.class differ diff --git a/target/classes/com/muyu/common/config/RedisConfig.class b/target/classes/com/muyu/common/config/RedisConfig.class new file mode 100644 index 0000000..7dbfb71 Binary files /dev/null and b/target/classes/com/muyu/common/config/RedisConfig.class differ diff --git a/target/classes/com/muyu/common/contents/CreateContents.class b/target/classes/com/muyu/common/contents/CreateContents.class new file mode 100644 index 0000000..2526fb6 Binary files /dev/null and b/target/classes/com/muyu/common/contents/CreateContents.class differ diff --git a/target/classes/com/muyu/common/domain/ApifoxModel.class b/target/classes/com/muyu/common/domain/ApifoxModel.class new file mode 100644 index 0000000..033e3b8 Binary files /dev/null and b/target/classes/com/muyu/common/domain/ApifoxModel.class differ diff --git a/target/classes/com/muyu/common/domain/CPUInfo.class b/target/classes/com/muyu/common/domain/CPUInfo.class new file mode 100644 index 0000000..940d84c Binary files /dev/null and b/target/classes/com/muyu/common/domain/CPUInfo.class differ diff --git a/target/classes/com/muyu/common/domain/CreateVo$CreateVoBuilder.class b/target/classes/com/muyu/common/domain/CreateVo$CreateVoBuilder.class new file mode 100644 index 0000000..e5240c5 Binary files /dev/null and b/target/classes/com/muyu/common/domain/CreateVo$CreateVoBuilder.class differ diff --git a/target/classes/com/muyu/common/domain/CreateVo$CreateVoBuilderImpl.class b/target/classes/com/muyu/common/domain/CreateVo$CreateVoBuilderImpl.class new file mode 100644 index 0000000..ac9684b Binary files /dev/null and b/target/classes/com/muyu/common/domain/CreateVo$CreateVoBuilderImpl.class differ diff --git a/target/classes/com/muyu/common/domain/CreateVo.class b/target/classes/com/muyu/common/domain/CreateVo.class new file mode 100644 index 0000000..4e8b816 Binary files /dev/null and b/target/classes/com/muyu/common/domain/CreateVo.class differ diff --git a/target/classes/com/muyu/common/domain/DeleteServer$DeleteServerBuilder.class b/target/classes/com/muyu/common/domain/DeleteServer$DeleteServerBuilder.class new file mode 100644 index 0000000..921e80b Binary files /dev/null and b/target/classes/com/muyu/common/domain/DeleteServer$DeleteServerBuilder.class differ diff --git a/target/classes/com/muyu/common/domain/DeleteServer$DeleteServerBuilderImpl.class b/target/classes/com/muyu/common/domain/DeleteServer$DeleteServerBuilderImpl.class new file mode 100644 index 0000000..90879e3 Binary files /dev/null and b/target/classes/com/muyu/common/domain/DeleteServer$DeleteServerBuilderImpl.class differ diff --git a/target/classes/com/muyu/common/domain/DeleteServer.class b/target/classes/com/muyu/common/domain/DeleteServer.class new file mode 100644 index 0000000..e26d40a Binary files /dev/null and b/target/classes/com/muyu/common/domain/DeleteServer.class differ diff --git a/target/classes/com/muyu/common/domain/FlowInfo.class b/target/classes/com/muyu/common/domain/FlowInfo.class new file mode 100644 index 0000000..cd5199a Binary files /dev/null and b/target/classes/com/muyu/common/domain/FlowInfo.class differ diff --git a/target/classes/com/muyu/common/domain/Icreate$IcreateBuilder.class b/target/classes/com/muyu/common/domain/Icreate$IcreateBuilder.class new file mode 100644 index 0000000..8a94ef5 Binary files /dev/null and b/target/classes/com/muyu/common/domain/Icreate$IcreateBuilder.class differ diff --git a/target/classes/com/muyu/common/domain/Icreate$IcreateBuilderImpl.class b/target/classes/com/muyu/common/domain/Icreate$IcreateBuilderImpl.class new file mode 100644 index 0000000..38d951a Binary files /dev/null and b/target/classes/com/muyu/common/domain/Icreate$IcreateBuilderImpl.class differ diff --git a/target/classes/com/muyu/common/domain/Icreate.class b/target/classes/com/muyu/common/domain/Icreate.class new file mode 100644 index 0000000..7af9ffc Binary files /dev/null and b/target/classes/com/muyu/common/domain/Icreate.class differ diff --git a/target/classes/com/muyu/common/domain/InstanceInfo$InstanceInfoBuilder.class b/target/classes/com/muyu/common/domain/InstanceInfo$InstanceInfoBuilder.class new file mode 100644 index 0000000..ea546cb Binary files /dev/null and b/target/classes/com/muyu/common/domain/InstanceInfo$InstanceInfoBuilder.class differ diff --git a/target/classes/com/muyu/common/domain/InstanceInfo$InstanceInfoBuilderImpl.class b/target/classes/com/muyu/common/domain/InstanceInfo$InstanceInfoBuilderImpl.class new file mode 100644 index 0000000..5908b2d Binary files /dev/null and b/target/classes/com/muyu/common/domain/InstanceInfo$InstanceInfoBuilderImpl.class differ diff --git a/target/classes/com/muyu/common/domain/InstanceInfo.class b/target/classes/com/muyu/common/domain/InstanceInfo.class new file mode 100644 index 0000000..6d5d00a Binary files /dev/null and b/target/classes/com/muyu/common/domain/InstanceInfo.class differ diff --git a/target/classes/com/muyu/common/domain/IsanJoin$IsanJoinBuilder.class b/target/classes/com/muyu/common/domain/IsanJoin$IsanJoinBuilder.class new file mode 100644 index 0000000..60cad4d Binary files /dev/null and b/target/classes/com/muyu/common/domain/IsanJoin$IsanJoinBuilder.class differ diff --git a/target/classes/com/muyu/common/domain/IsanJoin$IsanJoinBuilderImpl.class b/target/classes/com/muyu/common/domain/IsanJoin$IsanJoinBuilderImpl.class new file mode 100644 index 0000000..19bd521 Binary files /dev/null and b/target/classes/com/muyu/common/domain/IsanJoin$IsanJoinBuilderImpl.class differ diff --git a/target/classes/com/muyu/common/domain/IsanJoin.class b/target/classes/com/muyu/common/domain/IsanJoin.class new file mode 100644 index 0000000..caaad93 Binary files /dev/null and b/target/classes/com/muyu/common/domain/IsanJoin.class differ diff --git a/target/classes/com/muyu/common/domain/JVMInfo.class b/target/classes/com/muyu/common/domain/JVMInfo.class new file mode 100644 index 0000000..60194bc Binary files /dev/null and b/target/classes/com/muyu/common/domain/JVMInfo.class differ diff --git a/target/classes/com/muyu/common/domain/MqttInfo.class b/target/classes/com/muyu/common/domain/MqttInfo.class new file mode 100644 index 0000000..04e2a6a Binary files /dev/null and b/target/classes/com/muyu/common/domain/MqttInfo.class differ diff --git a/target/classes/com/muyu/common/domain/NodeRegReq$NodeRegReqBuilder.class b/target/classes/com/muyu/common/domain/NodeRegReq$NodeRegReqBuilder.class new file mode 100644 index 0000000..5feb1b4 Binary files /dev/null and b/target/classes/com/muyu/common/domain/NodeRegReq$NodeRegReqBuilder.class differ diff --git a/target/classes/com/muyu/common/domain/NodeRegReq.class b/target/classes/com/muyu/common/domain/NodeRegReq.class new file mode 100644 index 0000000..42cadbc Binary files /dev/null and b/target/classes/com/muyu/common/domain/NodeRegReq.class differ diff --git a/target/classes/com/muyu/common/redis/RedisService.class b/target/classes/com/muyu/common/redis/RedisService.class new file mode 100644 index 0000000..dbe3708 Binary files /dev/null and b/target/classes/com/muyu/common/redis/RedisService.class differ diff --git a/target/classes/com/muyu/common/utils/Result$ResultBuilder.class b/target/classes/com/muyu/common/utils/Result$ResultBuilder.class new file mode 100644 index 0000000..bdbc784 Binary files /dev/null and b/target/classes/com/muyu/common/utils/Result$ResultBuilder.class differ diff --git a/target/classes/com/muyu/common/utils/Result.class b/target/classes/com/muyu/common/utils/Result.class new file mode 100644 index 0000000..d3984f3 Binary files /dev/null and b/target/classes/com/muyu/common/utils/Result.class differ diff --git a/target/classes/com/muyu/controller/AlController.class b/target/classes/com/muyu/controller/AlController.class new file mode 100644 index 0000000..c517a57 Binary files /dev/null and b/target/classes/com/muyu/controller/AlController.class differ diff --git a/target/classes/com/muyu/controller/LoadCenterController.class b/target/classes/com/muyu/controller/LoadCenterController.class new file mode 100644 index 0000000..2909830 Binary files /dev/null and b/target/classes/com/muyu/controller/LoadCenterController.class differ diff --git a/target/classes/com/muyu/controller/VehicleController.class b/target/classes/com/muyu/controller/VehicleController.class new file mode 100644 index 0000000..9daa3e9 Binary files /dev/null and b/target/classes/com/muyu/controller/VehicleController.class differ diff --git a/target/classes/com/muyu/controller/WorkGetWayNode.class b/target/classes/com/muyu/controller/WorkGetWayNode.class new file mode 100644 index 0000000..8d1c5d2 Binary files /dev/null and b/target/classes/com/muyu/controller/WorkGetWayNode.class differ diff --git a/target/classes/com/muyu/controller/stiNode.class b/target/classes/com/muyu/controller/stiNode.class new file mode 100644 index 0000000..559c26e Binary files /dev/null and b/target/classes/com/muyu/controller/stiNode.class differ diff --git a/target/classes/com/muyu/demos/web/BasicController.class b/target/classes/com/muyu/demos/web/BasicController.class new file mode 100644 index 0000000..d237640 Binary files /dev/null and b/target/classes/com/muyu/demos/web/BasicController.class differ diff --git a/target/classes/com/muyu/demos/web/PathVariableController.class b/target/classes/com/muyu/demos/web/PathVariableController.class new file mode 100644 index 0000000..8139366 Binary files /dev/null and b/target/classes/com/muyu/demos/web/PathVariableController.class differ diff --git a/target/classes/com/muyu/demos/web/User.class b/target/classes/com/muyu/demos/web/User.class new file mode 100644 index 0000000..074e7ca Binary files /dev/null and b/target/classes/com/muyu/demos/web/User.class differ diff --git a/target/classes/com/muyu/server/ClientRegController.class b/target/classes/com/muyu/server/ClientRegController.class new file mode 100644 index 0000000..75de296 Binary files /dev/null and b/target/classes/com/muyu/server/ClientRegController.class differ diff --git a/target/classes/com/muyu/server/NodeRegReq$NodeRegReqBuilder.class b/target/classes/com/muyu/server/NodeRegReq$NodeRegReqBuilder.class new file mode 100644 index 0000000..6d35c93 Binary files /dev/null and b/target/classes/com/muyu/server/NodeRegReq$NodeRegReqBuilder.class differ diff --git a/target/classes/com/muyu/server/NodeRegReq.class b/target/classes/com/muyu/server/NodeRegReq.class new file mode 100644 index 0000000..38e580c Binary files /dev/null and b/target/classes/com/muyu/server/NodeRegReq.class differ diff --git a/target/classes/com/muyu/test/fluxmqTest.class b/target/classes/com/muyu/test/fluxmqTest.class new file mode 100644 index 0000000..90a013d Binary files /dev/null and b/target/classes/com/muyu/test/fluxmqTest.class differ diff --git a/target/classes/static/index.html b/target/classes/static/index.html new file mode 100644 index 0000000..e2d94a2 --- /dev/null +++ b/target/classes/static/index.html @@ -0,0 +1,6 @@ + + +

hello word!!!

+

this is a html page

+ + \ No newline at end of file diff --git a/target/maven-archiver/pom.properties b/target/maven-archiver/pom.properties new file mode 100644 index 0000000..ccec67f --- /dev/null +++ b/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed Apr 17 10:20:56 CST 2024 +groupId=com.muyu +artifactId=mqtt +version=0.0.1-SNAPSHOT diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..7db8189 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,45 @@ +com\muyu\common\domain\DeleteServer$DeleteServerBuilderImpl.class +com\muyu\Ynpplication.class +com\muyu\common\config\FastJson2JsonRedisSerializer.class +com\muyu\server\ClientRegController.class +com\muyu\common\domain\IsanJoin$IsanJoinBuilder.class +com\muyu\common\domain\IsanJoin.class +com\muyu\controller\LoadCenterController.class +com\muyu\server\NodeRegReq.class +com\muyu\common\domain\NodeRegReq.class +com\muyu\common\redis\RedisService.class +com\muyu\common\domain\CreateVo$CreateVoBuilderImpl.class +com\muyu\common\domain\InstanceInfo$InstanceInfoBuilderImpl.class +com\muyu\test\fluxmqTest.class +com\muyu\common\domain\InstanceInfo.class +com\muyu\controller\AlController.class +com\muyu\controller\WorkGetWayNode.class +com\muyu\common\domain\CreateVo.class +com\muyu\common\domain\Icreate$IcreateBuilderImpl.class +com\muyu\demos\web\User.class +com\muyu\common\config\RedisConfig.class +com\muyu\common\aly\AliYunRcsService.class +com\muyu\common\domain\NodeRegReq$NodeRegReqBuilder.class +com\muyu\demos\web\PathVariableController.class +com\muyu\common\domain\DeleteServer.class +com\muyu\common\domain\MqttInfo.class +com\muyu\common\utils\Result$ResultBuilder.class +com\muyu\common\domain\JVMInfo.class +com\muyu\common\config\AliConfig.class +com\muyu\common\config\ClientConfig.class +com\muyu\common\contents\CreateContents.class +com\muyu\common\domain\ApifoxModel.class +com\muyu\common\domain\IsanJoin$IsanJoinBuilderImpl.class +com\muyu\controller\stiNode.class +com\muyu\common\domain\Icreate$IcreateBuilder.class +com\muyu\common\utils\Result.class +com\muyu\common\domain\CreateVo$CreateVoBuilder.class +com\muyu\demos\web\BasicController.class +com\muyu\common\domain\CPUInfo.class +com\muyu\common\domain\InstanceInfo$InstanceInfoBuilder.class +com\muyu\common\config\CreateAnConfig.class +com\muyu\server\NodeRegReq$NodeRegReqBuilder.class +com\muyu\common\domain\Icreate.class +com\muyu\common\domain\FlowInfo.class +com\muyu\common\domain\DeleteServer$DeleteServerBuilder.class +com\muyu\controller\VehicleController.class diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..6e98e19 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,30 @@ +C:\Users\yn\Desktop\acb\src\main\java\com\muyu\controller\VehicleController.java +C:\Users\yn\Desktop\acb\src\main\java\com\muyu\demos\web\User.java +C:\Users\yn\Desktop\acb\src\main\java\com\muyu\common\domain\DeleteServer.java +C:\Users\yn\Desktop\acb\src\main\java\com\muyu\common\domain\MqttInfo.java +C:\Users\yn\Desktop\acb\src\main\java\com\muyu\demos\web\BasicController.java +C:\Users\yn\Desktop\acb\src\main\java\com\muyu\common\utils\Result.java +C:\Users\yn\Desktop\acb\src\main\java\com\muyu\test\fluxmqTest.java +C:\Users\yn\Desktop\acb\src\main\java\com\muyu\common\domain\ApifoxModel.java +C:\Users\yn\Desktop\acb\src\main\java\com\muyu\common\config\AliConfig.java +C:\Users\yn\Desktop\acb\src\main\java\com\muyu\common\config\CreateAnConfig.java +C:\Users\yn\Desktop\acb\src\main\java\com\muyu\common\redis\RedisService.java +C:\Users\yn\Desktop\acb\src\main\java\com\muyu\controller\LoadCenterController.java +C:\Users\yn\Desktop\acb\src\main\java\com\muyu\common\config\ClientConfig.java +C:\Users\yn\Desktop\acb\src\main\java\com\muyu\common\config\FastJson2JsonRedisSerializer.java +C:\Users\yn\Desktop\acb\src\main\java\com\muyu\common\aly\AliYunRcsService.java +C:\Users\yn\Desktop\acb\src\main\java\com\muyu\common\domain\Icreate.java +C:\Users\yn\Desktop\acb\src\main\java\com\muyu\common\domain\JVMInfo.java +C:\Users\yn\Desktop\acb\src\main\java\com\muyu\common\domain\CPUInfo.java +C:\Users\yn\Desktop\acb\src\main\java\com\muyu\controller\AlController.java +C:\Users\yn\Desktop\acb\src\main\java\com\muyu\common\domain\IsanJoin.java +C:\Users\yn\Desktop\acb\src\main\java\com\muyu\common\contents\CreateContents.java +C:\Users\yn\Desktop\acb\src\main\java\com\muyu\Ynpplication.java +C:\Users\yn\Desktop\acb\src\main\java\com\muyu\common\domain\FlowInfo.java +C:\Users\yn\Desktop\acb\src\main\java\com\muyu\common\domain\NodeRegReq.java +C:\Users\yn\Desktop\acb\src\main\java\com\muyu\common\domain\CreateVo.java +C:\Users\yn\Desktop\acb\src\main\java\com\muyu\demos\web\PathVariableController.java +C:\Users\yn\Desktop\acb\src\main\java\com\muyu\common\domain\InstanceInfo.java +C:\Users\yn\Desktop\acb\src\main\java\com\muyu\common\config\RedisConfig.java +C:\Users\yn\Desktop\acb\src\main\java\com\muyu\server\NodeRegReq.java +C:\Users\yn\Desktop\acb\src\main\java\com\muyu\server\ClientRegController.java diff --git a/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst new file mode 100644 index 0000000..b312cdd --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst @@ -0,0 +1 @@ +com\muyu\MqttApplicationTests.class diff --git a/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100644 index 0000000..fe31d99 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst @@ -0,0 +1 @@ +C:\Users\yn\Desktop\acb\src\test\java\com\muyu\MqttApplicationTests.java diff --git a/target/mqtt-0.0.1-SNAPSHOT-jar-with-dependencies.jar b/target/mqtt-0.0.1-SNAPSHOT-jar-with-dependencies.jar new file mode 100644 index 0000000..008b084 Binary files /dev/null and b/target/mqtt-0.0.1-SNAPSHOT-jar-with-dependencies.jar differ diff --git a/target/mqtt-0.0.1-SNAPSHOT.jar b/target/mqtt-0.0.1-SNAPSHOT.jar new file mode 100644 index 0000000..fe11dcc Binary files /dev/null and b/target/mqtt-0.0.1-SNAPSHOT.jar differ diff --git a/target/surefire-reports/TEST-com.muyu.MqttApplicationTests.xml b/target/surefire-reports/TEST-com.muyu.MqttApplicationTests.xml new file mode 100644 index 0000000..64a2033 --- /dev/null +++ b/target/surefire-reports/TEST-com.muyu.MqttApplicationTests.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/target/surefire-reports/com.muyu.MqttApplicationTests.txt b/target/surefire-reports/com.muyu.MqttApplicationTests.txt new file mode 100644 index 0000000..67a9c33 --- /dev/null +++ b/target/surefire-reports/com.muyu.MqttApplicationTests.txt @@ -0,0 +1,4 @@ +------------------------------------------------------------------------------- +Test set: com.muyu.MqttApplicationTests +------------------------------------------------------------------------------- +Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.485 s - in com.muyu.MqttApplicationTests diff --git a/target/test-classes/com/muyu/MqttApplicationTests.class b/target/test-classes/com/muyu/MqttApplicationTests.class new file mode 100644 index 0000000..3863c35 Binary files /dev/null and b/target/test-classes/com/muyu/MqttApplicationTests.class differ