feat(): 重构创建实例代码以及删除

dev.gateway.aliyun
ywt 2024-10-08 10:43:19 +08:00
parent 51ca5ef6f4
commit 27479e2b49
31 changed files with 633 additions and 443 deletions

View File

@ -6,6 +6,7 @@ import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations; import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -17,6 +18,7 @@ import java.util.concurrent.TimeUnit;
**/ **/
@SuppressWarnings(value = {"unchecked", "rawtypes"}) @SuppressWarnings(value = {"unchecked", "rawtypes"})
@Component @Component
//@Service
public class RedisService { public class RedisService {
@Autowired @Autowired
public RedisTemplate redisTemplate; public RedisTemplate redisTemplate;

View File

@ -83,6 +83,10 @@
<groupId>com.muyu</groupId> <groupId>com.muyu</groupId>
<artifactId>cloud-common-xxl</artifactId> <artifactId>cloud-common-xxl</artifactId>
</dependency> </dependency>
<!-- <dependency>-->
<!-- <groupId>com.muyu</groupId>-->
<!-- <artifactId>cloud-common-redis</artifactId>-->
<!-- </dependency>-->
<dependency> <dependency>
<groupId>com.muyu</groupId> <groupId>com.muyu</groupId>

View File

@ -4,13 +4,16 @@ import com.muyu.common.security.annotation.EnableCustomConfig;
import com.muyu.common.security.annotation.EnableMyFeignClients; import com.muyu.common.security.annotation.EnableMyFeignClients;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
/** /**
* *
*/ */
@EnableCustomConfig @EnableCustomConfig
@EnableMyFeignClients @EnableFeignClients
@SpringBootApplication @SpringBootApplication
//@ComponentScan(basePackages = "com.muyu")
public class VehicleGatewayApplication { public class VehicleGatewayApplication {
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(VehicleGatewayApplication.class, args); SpringApplication.run(VehicleGatewayApplication.class, args);

View File

@ -0,0 +1,36 @@
package com.muyu.cloud.vehicle.gateway.aliyun;
import com.aliyun.ecs20140526.Client;
import com.aliyun.teaopenapi.models.Config;
import com.muyu.cloud.vehicle.gateway.config.AliProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Ali
*/
@Configuration
public class AliYunConfig {
@Autowired
private AliProperties aliProperties;
@Bean
public Client createClient() {
// 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
Config config = new Config()
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
.setAccessKeyId(aliProperties.getAccessKeyId())
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
.setAccessKeySecret(aliProperties.getAccessKeySecret());
// Endpoint 请参考 https://api.aliyun.com/product/Ecs
config.endpoint = aliProperties.getEndpoint();
try {
return new Client(config);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}

View File

@ -1,135 +0,0 @@
// This file is auto-generated, don't edit it. Thanks.
package com.muyu.cloud.vehicle.gateway.aliyun.ecs;
import com.aliyun.ecs20140526.Client;
import com.aliyun.ecs20140526.models.DeleteInstancesRequest;
import com.aliyun.ecs20140526.models.DescribeInstancesRequest;
import com.aliyun.ecs20140526.models.DescribeInstancesResponse;
import com.aliyun.ecs20140526.models.DescribeInstancesResponseBody;
import com.aliyun.tea.*;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.Common;
import com.aliyun.teautil.models.RuntimeOptions;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextClosedEvent;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
*
*/
@Log4j2
@Component
public class DelInstance implements ApplicationListener<ContextClosedEvent> {
@Autowired
private StringRedisTemplate redisTemplate;
/**
* <b>description</b> :
* <p>使AK&amp;SKClient</p>
* @return Client
*
* @throws Exception
*/
public static Client createClient() throws Exception {
// 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
// 建议使用更安全的 STS 方式更多鉴权访问方式请参见https://help.aliyun.com/document_detail/378657.html。
Config config = new Config()
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
.setAccessKeyId("LTAI5t7Fnx2QLTYLSu9357wP")
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
.setAccessKeySecret("3LOnydNZ25ytsTGczuSygElx0HJ6nN");
// Endpoint 请参考 https://api.aliyun.com/product/Ecs
config.endpoint = "ecs.cn-shanghai.aliyuncs.com";
return new Client(config);
}
public void delInstance() throws Exception{
//创建ECS客户端对象用于后续调用ECS相关API
Client client = DelInstance.createClient();
List<String> list = redisTemplate.opsForList().range("instanceIds",0,-1);
// DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest()
// .setRegionId("cn-shanghai");
// //创建运行时选择对象,用于配置运行时的选项参数
// RuntimeOptions runtimeOptions = new RuntimeOptions();
//
// //获取实例列表
// DescribeInstancesResponse describeInstancesResponse = client.describeInstancesWithOptions(describeInstancesRequest, runtimeOptions);
//
// //提取实例ID集合
// ArrayList<String> list = new ArrayList<>();
// DescribeInstancesResponseBody body = describeInstancesResponse.getBody();
//
// for (DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstance instance : body.getInstances().getInstance()) {
// list.add(instance.getInstanceId());
// }
//
// System.out.println("Instance IDs"+list);
// 创建删除实例请求对象,并设置请求参数
DeleteInstancesRequest deleteInstancesRequest = new DeleteInstancesRequest()
// 设置地域ID指定要删除的实例所属的地域ID。
.setRegionId("cn-shanghai")
//设置DryRun为True用于验证请求是否可以成功但不实际执行删除操作
.setDryRun(false)
// 设置Force为true表示即使实例有正在运行的任务也强制删除实例
.setForce(true)
// 设置TerminateSubscription为true表示删除按订阅付费的实例时终止订阅
.setTerminateSubscription(true)
// 设置实例ID列表使用参数名称 instanceId参数类型为数组。
.setInstanceId(list);
// 创建运行时选项对象,用于配置运行时的选项参数
RuntimeOptions runtime = new RuntimeOptions();
try{
//复制代码运行请自行打印 API 的返回值
client.deleteInstancesWithOptions(deleteInstancesRequest,runtime);
} catch (TeaException error) {
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
log.error(error.getMessage());
// 诊断地址
log.error(error.getData().get("Recommend"));
Common.assertAsString(error.message);
} catch (Exception _error){
TeaException error = new TeaException(_error.getMessage(), _error);
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
log.error(error.getMessage());
// 诊断地址
log.error(error.getData().get("Recommend"));
Common.assertAsString(error.message);
}
}
// @Override
// public void destroy() throws Exception {
// log.info("===============>开始执行删除实例方法");
// delInstance();
// }
@Override
public void onApplicationEvent(ContextClosedEvent event) {
try{
log.info("=======>删除实例");
delInstance();
// redisTemplate.delete("instanceIds");
// redisTemplate.delete("instanceList");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}

View File

@ -0,0 +1,30 @@
package com.muyu.cloud.vehicle.gateway.aliyun.ecs;
import com.muyu.cloud.vehicle.gateway.aliyun.service.AliYunEcsService;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
*
*/
@Log4j2
@Component
public class DeleteSample implements DisposableBean {
@Autowired
private AliYunEcsService aliYunEcsService;
@Override
public void destroy() throws Exception {
try{
log.info("==========开始执行删除实例方法");
Thread.sleep(10000);
aliYunEcsService.deleteInstance();
} catch (Exception e) {
log.info("删除实例失败");
throw new RuntimeException(e);
}
log.info("删除实例成功");
}
}

View File

@ -1,59 +0,0 @@
package com.muyu.cloud.vehicle.gateway.aliyun.ecs;
import com.aliyun.ecs20140526.Client;
import com.aliyun.ecs20140526.models.DescribeInstancesRequest;
import com.aliyun.ecs20140526.models.DescribeInstancesResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.darabonba.env.EnvClient;
import com.aliyun.teautil.Common;
import com.aliyun.teautil.models.RuntimeOptions;
import java.util.Arrays;
import java.util.List;
/**
*
*/
public class QueryInstance {
/**
* <b>description</b> :
* <p>使AK&amp;SKClient</p>
* @return Client
*
* @throws Exception
*/
public static Client createClient(String alibabaCloudAccessKeyId, String alibabaCloudAccessKeySecret) throws Exception{
Config config = new Config()
.setAccessKeyId("LTAI5t7Fnx2QLTYLSu9357wP")
.setAccessKeySecret("3LOnydNZ25ytsTGczuSygElx0HJ6nN");
config.endpoint = "ecs-cn-hangzhou.aliyuncs.com";
return new Client(config);
}
public static Client createClientWithSTS() throws Exception {
Config config = new Config()
.setAccessKeyId("LTAI5t7Fnx2QLTYLSu9357wP")
.setAccessKeySecret("3LOnydNZ25ytsTGczuSygElx0HJ6nN")
.setSecurityToken("token")
.setType("sts");
config.endpoint = "ecs-cn-hangzhou.aliyuncs.com";
return new Client(config);
}
public static void main(String[] args_) throws Exception{
List<String> list = Arrays.asList(args_);
Client client = QueryInstance.createClient(EnvClient.getEnv("LTAI5t7Fnx2QLTYLSu9357wP"), EnvClient.getEnv("3LOnydNZ25ytsTGczuSygElx0HJ6nN"));
DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest()
.setRegionId("cn-shanghai")
.setInternetChargeType("PayByTraffic")
.setInstanceChargeType("PostPaid");
RuntimeOptions runtime = new RuntimeOptions();
DescribeInstancesResponse resp = client.describeInstancesWithOptions(describeInstancesRequest, runtime);
com.aliyun.teaconsole.Client.log(Common.toJSONString(resp));
}
}

View File

@ -1,114 +1,57 @@
package com.muyu.cloud.vehicle.gateway.aliyun.ecs; package com.muyu.cloud.vehicle.gateway.aliyun.ecs;
import com.aliyun.ecs20140526.Client; import com.muyu.cloud.vehicle.gateway.aliyun.service.AliYunEcsService;
import com.aliyun.ecs20140526.models.*; import com.muyu.cloud.vehicle.gateway.config.AliProperties;
import com.aliyun.tea.*; import com.muyu.cloud.vehicle.gateway.domain.AliInstance;
import com.aliyun.teaopenapi.models.Config; import com.muyu.common.redis.service.RedisService;
import com.aliyun.teautil.models.RuntimeOptions;
import com.muyu.cloud.vehicle.gateway.aliyun.domain.Instance;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import org.apache.logging.log4j.CloseableThreadContext;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner; import org.springframework.boot.ApplicationRunner;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
/** /**
* ECS *
*/ */
@Log4j2 @Log4j2
@Component @Component
public class Sample implements ApplicationRunner{ public class Sample implements ApplicationRunner{
@Autowired
private AliYunEcsService aliYunEcsService;
@Autowired
private AliProperties aliProperties;
/** // @Autowired
* <b>description</b> : // private RedisService redisService;
* <p>使AK&amp;SKClient</p>
* @return Client
*
* @throws Exception
*/
public static Client createClient() throws Exception {
// 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
Config config = new Config()
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
.setAccessKeyId("LTAI5t7Fnx2QLTYLSu9357wP")
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
.setAccessKeySecret("3LOnydNZ25ytsTGczuSygElx0HJ6nN");
// Endpoint 请参考 https://api.aliyun.com/product/Ecs
config.endpoint = "ecs-cn-hangzhou.aliyuncs.com";
return new Client(config);
}
public void creatInstance() throws Exception {
// 将命令行参数转换为字符串列表
List<String> args = Arrays.asList();
// 创建阿里云ECS客户端
Client client = Sample.createClient();
// 配置系统盘参数
RunInstancesRequest.RunInstancesRequestSystemDisk systemDisk = new RunInstancesRequest.RunInstancesRequestSystemDisk()
.setSize("20")// 设置系统盘大小为40GB
.setCategory("cloud_essd");// 设置系统盘类型为cloud_essd
// 创建创建实例请求对象并设置参数
RunInstancesRequest runInstancesRequest = new RunInstancesRequest()
.setRegionId("cn-shanghai") // 设置地域ID
.setImageId("m-uf66taa8r57ky0pg3e7s")// 设置镜像ID
.setInstanceType("ecs.e-c1m1.large")// 设置实例类型
.setSecurityGroupId("sg-uf6hyictocodexptlgiv")// 设置安全组ID
.setVSwitchId("vsw-uf6ags5luz17qd6ckn2tb")// 设置虚拟交换机ID
.setInstanceName("launch-advisor-20240929")// 设置实例名称
.setInstanceChargeType("PostPaid")// 设置实例付费类型为后付费按量付费
.setSystemDisk(systemDisk)// 设置系统盘配置
.setHostName("root")// 设置主机名
.setPassword("@ywt021900")// 设置实例密码
.setAmount(1)// 设置创建实例的数量
.setInternetChargeType("PayByTraffic")// 设置互联网计费类型为按流量计费
.setInternetMaxBandwidthOut(1);// 设置互联网最大出带宽为1 Mbps
RuntimeOptions runtime = new RuntimeOptions();
try {
// 复制代码运行请自行打印 API 的返回值
RunInstancesResponse runInstancesResponse = client.runInstancesWithOptions(runInstancesRequest, runtime);
RunInstancesResponseBody body = runInstancesResponse.getBody();
ArrayList<String> list = new ArrayList<>(body.getInstanceIdSets().getInstanceIdSet());
log.info("实例ID{}", list);
} 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);
}
}
// private static DescribeInstancesResponse queryInstanceDetails(Client client) {
//
// //创建查询实例请求对象并设置参数
// DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest();
// return null;
// }
@Override @Override
public void run(ApplicationArguments args) throws Exception { public void run(ApplicationArguments args) throws Exception {
log.info("===============>开始批量创建实例"); List<String> list;
creatInstance(); try{
log.info("开始创建实例");
list =aliYunEcsService.generateInstance(aliProperties.getAmount());
} catch (Exception e) {
log.info("创建实例失败");
throw new RuntimeException(e);
}
log.info("创建实例成功");
// redisService.setCacheList("instanceIds",list);
try{
Thread.sleep(6000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
List<AliInstance> aliInstances = aliYunEcsService.selectInstance(list);
log.info("查询实例信息成功:{}",aliInstances);
//将查询到的实例信息列表存储到redis中
// redisService.setCacheList("instanceList",aliInstances);
log.info("redis存储成功{}",aliInstances);
} }
} }

View File

@ -1,56 +0,0 @@
package com.muyu.cloud.vehicle.gateway.aliyun.ecs;//// This file is auto-generated, don't edit it. Thanks.
//package com.muyu.cloud.vehicle.gateway.aliyun.ecs;
//
//import com.aliyun.tea.*;
//
///**
// * 启动一台实例
// */
//public class StartInstance {
//
// /**
// * <b>description</b> :
// * <p>使用AK&amp;SK初始化账号Client</p>
// * @return Client
// *
// * @throws Exception
// */
// public static com.aliyun.ecs20140526.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("LTAI5t7Fnx2QLTYLSu9357wP")
// // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
// .setAccessKeySecret("3LOnydNZ25ytsTGczuSygElx0HJ6nN");
// // Endpoint 请参考 https://api.aliyun.com/product/Ecs
// config.endpoint = "ecs.cn-shanghai.aliyuncs.com";
// return new com.aliyun.ecs20140526.Client(config);
// }
//
// public static void main(String[] args_) throws Exception {
// java.util.List<String> args = java.util.Arrays.asList(args_);
// com.aliyun.ecs20140526.Client client = StartInstance.createClient();
// com.aliyun.ecs20140526.models.StartInstanceRequest startInstanceRequest = new com.aliyun.ecs20140526.models.StartInstanceRequest();
// com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
// try {
// // 复制代码运行请自行打印 API 的返回值
// client.startInstanceWithOptions(startInstanceRequest, runtime);
// } 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);
// }
// }
//}

View File

@ -1,10 +0,0 @@
package com.muyu.cloud.vehicle.gateway.aliyun.mapper;
import com.muyu.cloud.vehicle.gateway.aliyun.domain.VehicleConnection;
import com.muyu.cloud.vehicle.gateway.aliyun.domain.req.VehicleConnectionReq;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface VehicleConnectionMapper {
void addConnect(VehicleConnection vehicleConnection);
}

View File

@ -0,0 +1,194 @@
package com.muyu.cloud.vehicle.gateway.aliyun.service;
import com.aliyun.ecs20140526.Client;
import com.aliyun.ecs20140526.models.*;
import com.aliyun.tea.TeaException;
import com.aliyun.teautil.models.RuntimeOptions;
import com.muyu.cloud.vehicle.gateway.config.AliProperties;
import com.muyu.cloud.vehicle.gateway.domain.AliInstance;
import com.muyu.common.core.exception.ServiceException;
import com.muyu.common.redis.service.RedisService;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
*ali
*/
@Log4j2
@Service
public class AliYunEcsService {
/**
*
*/
@Autowired
private AliProperties aliProperties;
/**
*
*/
@Autowired
private Client client;
/**
* redis
*/
// @Autowired
// private RedisService redisService;
/**
*
*
* @param amount
* @return id
*/
public List<String> generateInstance(Integer amount) {
// redisService.deleteObject("instanceIds");
// redisService.deleteObject("instanceList");
// 检查生成实例的数量是否有效
if (amount == null || amount <= 0) {
throw new ServiceException("生成数量不能小于1");
}
// 初始化系统盘配置
RunInstancesRequest.RunInstancesRequestSystemDisk systemDisk = new RunInstancesRequest.RunInstancesRequestSystemDisk();
systemDisk.setSize("20");
systemDisk.setCategory("cloud_essd");
// 创建创建实例请求对象并设置参数
RunInstancesRequest runInstancesRequest = new RunInstancesRequest()
// 设置地域ID
.setRegionId(aliProperties.getRegionId())
// 设置镜像ID
.setImageId(aliProperties.getImageId())
// 设置实例规格类型
.setInstanceType(aliProperties.getInstanceType())
// 设置安全组ID
.setSecurityGroupId(aliProperties.getSecurityGroupId())
// 设置虚拟交换机ID
.setVSwitchId(aliProperties.getSwitchId())
// 设置实例名称
.setInstanceName("server-mqtt")
// 设置付费类型 按量付费
.setInstanceChargeType("PostPaid")
// 设置系统盘配置
.setSystemDisk(systemDisk)
// 设置用户名
.setHostName("root")
// 设置密码
.setPassword("@ywt0219")
// 设置要创建的实例数量
.setAmount(amount)
.setInternetChargeType("PayByTraffic")
.setInternetMaxBandwidthOut(1);
// 创建运行时选项对象
RuntimeOptions runtimeOptions = new RuntimeOptions();
// 尝试执行创建实例请求
try {
// 复制代码运行请自行打印 API 的返回值
RunInstancesResponse runInstancesResponse = client.runInstancesWithOptions(runInstancesRequest, runtimeOptions);
if (runInstancesResponse.getStatusCode() != 200) {
throw new ServiceException("查询实例状态失败");
}
log.info("实例创建成功: {}", runInstancesResponse.getBody().getInstanceIdSets().instanceIdSet);
RunInstancesResponseBody body = runInstancesResponse.getBody();
RunInstancesResponseBody.RunInstancesResponseBodyInstanceIdSets instanceIdSets = body.getInstanceIdSets();
return new ArrayList<>(instanceIdSets.instanceIdSet);
} catch (Exception error) {
log.error("创建阿里云实例报错:[{}]", error.getMessage());
throw new ServiceException(error.getMessage());
}
}
/**
* id
*
* @param instanceIds id
*/
public List<AliInstance> selectInstance(List<String> instanceIds) throws Exception {
// 检查实例ID列表是否为空如果为空则抛出异常
if (instanceIds == null || instanceIds.isEmpty()) {
throw new ServiceException("实例id不能为空");
}
// 创建查询实例的请求对象
DescribeInstancesRequest request = new DescribeInstancesRequest()
.setRegionId(aliProperties.getRegionId());
// 创建运行时选项对象,用于配置请求的额外参数
RuntimeOptions runtimeOptions = new RuntimeOptions();
List<AliInstance> aliInstances = new ArrayList<>();
try {
// 发送请求并获取响应对象
DescribeInstancesResponse describeInstancesResponse = client.describeInstancesWithOptions(request, runtimeOptions);
// 检查响应状态码如果为200则表示查询失败抛出异常
if (describeInstancesResponse.getStatusCode() != 200) {
throw new ServiceException("查询实例状态失败");
}
List<DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstance> instance = describeInstancesResponse.getBody().getInstances().getInstance();
for (DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstance bodyInstance : instance) {
// 实例id
String instanceId = bodyInstance.getInstanceId();
log.info("实例id为{}", instanceId);
// ip地址
String ipAddress = bodyInstance.getPublicIpAddress().getIpAddress().get(0);
log.info("实例ip为{}", ipAddress);
// 实例状态
String status = bodyInstance.getStatus();
log.info("实例状态为:{}", status);
AliInstance aliInstance = new AliInstance(instanceId, ipAddress, status);
aliInstances.add(aliInstance);
}
log.info("查询成功");
} catch (Exception e) {
log.error("查询服务器实例错误:[{}]", e.getMessage(), e);
throw new RuntimeException(e);
}
return aliInstances;
}
/**
*
*/
public void deleteInstance() throws Exception {
DescribeInstancesRequest attributeRequest = new DescribeInstancesRequest();
attributeRequest.setRegionId(aliProperties.getRegionId());
RuntimeOptions runtimeOptions = new RuntimeOptions();
DescribeInstancesResponse instancesWithOptions = client.describeInstancesWithOptions(attributeRequest, runtimeOptions);
ArrayList<String> list = new ArrayList<>();
DescribeInstancesResponseBody body = instancesWithOptions.getBody();
for (DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstance instance : body.instances.instance) {
list.add(instance.getInstanceId());
}
log.info("list:" + list);
DeleteInstancesRequest deleteInstancesRequest = new DeleteInstancesRequest();
deleteInstancesRequest.setRegionId(aliProperties.getRegionId())
.setDryRun(false)
.setForce(true)
.setTerminateSubscription(true)
.setInstanceId(list);
RuntimeOptions runtime = new RuntimeOptions();
try {
client.deleteInstancesWithOptions(deleteInstancesRequest, runtime);
} 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);
}
}
}

View File

@ -0,0 +1,51 @@
package com.muyu.cloud.vehicle.gateway.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
*
*/
@Data
@Configuration
@ConfigurationProperties(prefix = "aliyun")
public class AliProperties {
/**
* Key
*/
private String accessKeyId;
/**
* Secret
*/
private String accessKeySecret;
/**
*
*/
private String endpoint;
/**
* ID
*/
private String regionId;
/**
* ID
*/
private String imageId;
/**
*
*/
private String instanceType;
/**
* ID
*/
private String securityGroupId;
/**
* ID
*/
private String switchId;
/**
*
*/
private Integer amount;
}

View File

@ -1,28 +0,0 @@
package com.muyu.cloud.vehicle.gateway.config;
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.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
* Redis
*/
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String,String> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new StringRedisSerializer());
return redisTemplate;
}
}

View File

@ -1,43 +0,0 @@
package com.muyu.cloud.vehicle.gateway.config;
import lombok.extern.log4j.Log4j2;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
/**
* rest
*/
@Log4j2
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory factory){
return new RestTemplate(factory);
}
/**
* HTTP
* 155
*
*
* @return
*/
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
try{
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
//设置读取超时时间为5秒
factory.setReadTimeout(5000);
//设置连接超时时间为15秒
factory.setConnectTimeout(15000);
return factory;
} catch (Exception e) {
//处理创建工厂或设置超时时间可能出现的异常
log.info("创建工厂失败:" + e.getMessage());
throw new RuntimeException("初始化HTTP请求失败",e);
}
}
}

View File

@ -1,9 +1,9 @@
package com.muyu.cloud.vehicle.gateway.aliyun.controller; package com.muyu.cloud.vehicle.gateway.controller;
import com.alibaba.nacos.api.model.v2.Result; import com.alibaba.nacos.api.model.v2.Result;
import com.muyu.cloud.vehicle.gateway.aliyun.domain.req.VehicleConnectionReq; import com.muyu.cloud.vehicle.gateway.domain.req.VehicleConnectionReq;
import com.muyu.cloud.vehicle.gateway.aliyun.service.VehicleConnectionService; import com.muyu.cloud.vehicle.gateway.service.VehicleConnectionService;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;

View File

@ -1,4 +1,4 @@
package com.muyu.cloud.vehicle.gateway.aliyun.domain; package com.muyu.cloud.vehicle.gateway.domain;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.muyu.cloud.vehicle.gateway.aliyun.domain; package com.muyu.cloud.vehicle.gateway.domain;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;

View File

@ -1,4 +1,4 @@
package com.muyu.cloud.vehicle.gateway.aliyun.domain; package com.muyu.cloud.vehicle.gateway.domain;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;

View File

@ -1,4 +1,4 @@
package com.muyu.cloud.vehicle.gateway.aliyun.domain; package com.muyu.cloud.vehicle.gateway.domain;
/** /**
* *

View File

@ -1,4 +1,4 @@
package com.muyu.cloud.vehicle.gateway.aliyun.domain; package com.muyu.cloud.vehicle.gateway.domain;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.muyu.cloud.vehicle.gateway.aliyun.domain; package com.muyu.cloud.vehicle.gateway.domain;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;

View File

@ -1,4 +1,4 @@
package com.muyu.cloud.vehicle.gateway.aliyun.domain; package com.muyu.cloud.vehicle.gateway.domain;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;

View File

@ -1,4 +1,4 @@
package com.muyu.cloud.vehicle.gateway.aliyun.domain; package com.muyu.cloud.vehicle.gateway.domain;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;

View File

@ -1,4 +1,4 @@
package com.muyu.cloud.vehicle.gateway.aliyun.domain.req; package com.muyu.cloud.vehicle.gateway.domain.req;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;

View File

@ -0,0 +1,9 @@
package com.muyu.cloud.vehicle.gateway.mapper;
import com.muyu.cloud.vehicle.gateway.domain.VehicleConnection;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface VehicleConnectionMapper {
void addConnect(VehicleConnection vehicleConnection);
}

View File

@ -1,6 +1,6 @@
package com.muyu.cloud.vehicle.gateway.aliyun.service; package com.muyu.cloud.vehicle.gateway.service;
import com.muyu.cloud.vehicle.gateway.aliyun.domain.req.VehicleConnectionReq; import com.muyu.cloud.vehicle.gateway.domain.req.VehicleConnectionReq;
public interface VehicleConnectionService { public interface VehicleConnectionService {
/** /**

View File

@ -1,9 +1,9 @@
package com.muyu.cloud.vehicle.gateway.aliyun.service.impl; package com.muyu.cloud.vehicle.gateway.service.impl;
import com.muyu.cloud.vehicle.gateway.aliyun.domain.VehicleConnection; import com.muyu.cloud.vehicle.gateway.domain.VehicleConnection;
import com.muyu.cloud.vehicle.gateway.aliyun.domain.req.VehicleConnectionReq; import com.muyu.cloud.vehicle.gateway.domain.req.VehicleConnectionReq;
import com.muyu.cloud.vehicle.gateway.aliyun.mapper.VehicleConnectionMapper; import com.muyu.cloud.vehicle.gateway.mapper.VehicleConnectionMapper;
import com.muyu.cloud.vehicle.gateway.aliyun.service.VehicleConnectionService; import com.muyu.cloud.vehicle.gateway.service.VehicleConnectionService;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;

View File

@ -0,0 +1,130 @@
//// This file is auto-generated, don't edit it. Thanks.
//package com.muyu.cloud.vehicle.gateway.utils;
//
//import com.aliyun.ecs20140526.Client;
//import com.aliyun.ecs20140526.models.DeleteInstancesRequest;
//import com.aliyun.tea.*;
//import com.aliyun.teaopenapi.models.Config;
//import com.aliyun.teautil.Common;
//import com.aliyun.teautil.models.RuntimeOptions;
//import lombok.extern.log4j.Log4j2;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.context.ApplicationListener;
//import org.springframework.context.event.ContextClosedEvent;
//import org.springframework.data.redis.core.StringRedisTemplate;
//import org.springframework.stereotype.Component;
//
//import java.util.List;
//
///**
// * 删除实例
// */
//@Log4j2
//@Component
//public class DelInstance{
//
// @Autowired
// private StringRedisTemplate redisTemplate;
//
//
// /**
// * <b>description</b> :
// * <p>使用AK&amp;SK初始化账号Client</p>
// * @return Client
// *
// * @throws Exception
// */
// public static Client createClient() throws Exception {
// // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
// // 建议使用更安全的 STS 方式更多鉴权访问方式请参见https://help.aliyun.com/document_detail/378657.html。
// Config config = new Config()
// // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
// .setAccessKeyId("LTAI5t7Fnx2QLTYLSu9357wP")
// // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
// .setAccessKeySecret("3LOnydNZ25ytsTGczuSygElx0HJ6nN");
// // Endpoint 请参考 https://api.aliyun.com/product/Ecs
// config.endpoint = "ecs.cn-shanghai.aliyuncs.com";
// return new Client(config);
// }
//
//
//
// public void delInstance() throws Exception{
// //创建ECS客户端对象用于后续调用ECS相关API
// Client client = DelInstance.createClient();
//
// List<String> list = redisTemplate.opsForList().range("instanceIds",0,-1);
//
//// DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest()
//// .setRegionId("cn-shanghai");
//
//// //创建运行时选择对象,用于配置运行时的选项参数
//// RuntimeOptions runtimeOptions = new RuntimeOptions();
////
//// //获取实例列表
//// DescribeInstancesResponse describeInstancesResponse = client.describeInstancesWithOptions(describeInstancesRequest, runtimeOptions);
////
//// //提取实例ID集合
//// ArrayList<String> list = new ArrayList<>();
//// DescribeInstancesResponseBody body = describeInstancesResponse.getBody();
////
//// for (DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstancesInstance instance : body.getInstances().getInstance()) {
//// list.add(instance.getInstanceId());
//// }
////
//// System.out.println("Instance IDs"+list);
//
// // 创建删除实例请求对象,并设置请求参数
// DeleteInstancesRequest deleteInstancesRequest = new DeleteInstancesRequest()
// // 设置地域ID指定要删除的实例所属的地域ID。
// .setRegionId("cn-shanghai")
// //设置DryRun为True用于验证请求是否可以成功但不实际执行删除操作
// .setDryRun(false)
// // 设置Force为true表示即使实例有正在运行的任务也强制删除实例
// .setForce(true)
// // 设置TerminateSubscription为true表示删除按订阅付费的实例时终止订阅
// .setTerminateSubscription(true)
// // 设置实例ID列表使用参数名称 instanceId参数类型为数组。
// .setInstanceId(list);
// // 创建运行时选项对象,用于配置运行时的选项参数
// RuntimeOptions runtime = new RuntimeOptions();
// try{
// //复制代码运行请自行打印 API 的返回值
// client.deleteInstancesWithOptions(deleteInstancesRequest,runtime);
// } catch (TeaException error) {
// // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// // 错误 message
// log.error(error.getMessage());
// // 诊断地址
// log.error(error.getData().get("Recommend"));
// Common.assertAsString(error.message);
// } catch (Exception _error){
// TeaException error = new TeaException(_error.getMessage(), _error);
// // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// // 错误 message
// log.error(error.getMessage());
// // 诊断地址
// log.error(error.getData().get("Recommend"));
// Common.assertAsString(error.message);
// }
// }
//
//
//// @Override
//// public void destroy() throws Exception {
//// log.info("===============>开始执行删除实例方法");
//// delInstance();
//// }
//
//// @Override
//// public void onApplicationEvent(ContextClosedEvent event) {
//// try{
//// log.info("=======>删除实例");
//// delInstance();
////// redisTemplate.delete("instanceIds");
////// redisTemplate.delete("instanceList");
//// } catch (Exception e) {
//// throw new RuntimeException(e);
//// }
//// }
//}

View File

@ -0,0 +1,109 @@
//package com.muyu.cloud.vehicle.gateway.utils;
//
//
//import com.aliyun.ecs20140526.Client;
//import com.aliyun.ecs20140526.models.*;
//import com.aliyun.tea.*;
//import com.aliyun.teaopenapi.models.Config;
//import com.aliyun.teautil.models.RuntimeOptions;
//import lombok.extern.log4j.Log4j2;
//import org.springframework.boot.ApplicationArguments;
//import org.springframework.boot.ApplicationRunner;
//import org.springframework.stereotype.Component;
//
//import java.util.ArrayList;
//import java.util.Arrays;
//import java.util.List;
//
///**
// * 批量创建ECS实例
// */
//@Log4j2
//@Component
//public class Sample {
//
//
//
// /**
// * <b>description</b> :
// * <p>使用AK&amp;SK初始化账号Client</p>
// * @return Client
// *
// * @throws Exception
// */
// public static Client createClient() throws Exception {
// // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
// Config config = new Config()
// // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
// .setAccessKeyId("LTAI5t7Fnx2QLTYLSu9357wP")
// // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
// .setAccessKeySecret("3LOnydNZ25ytsTGczuSygElx0HJ6nN");
// // Endpoint 请参考 https://api.aliyun.com/product/Ecs
// config.endpoint = "ecs-cn-hangzhou.aliyuncs.com";
// return new Client(config);
// }
//
// public void creatInstance() throws Exception {
//
// // 将命令行参数转换为字符串列表
// List<String> args = Arrays.asList();
// // 创建阿里云ECS客户端
// Client client = Sample.createClient();
// // 配置系统盘参数
// RunInstancesRequest.RunInstancesRequestSystemDisk systemDisk = new RunInstancesRequest.RunInstancesRequestSystemDisk()
// .setSize("20")// 设置系统盘大小为40GB
// .setCategory("cloud_essd");// 设置系统盘类型为cloud_essd
// // 创建创建实例请求对象并设置参数
// RunInstancesRequest runInstancesRequest = new RunInstancesRequest()
// .setRegionId("cn-shanghai") // 设置地域ID
// .setImageId("m-uf66taa8r57ky0pg3e7s")// 设置镜像ID
// .setInstanceType("ecs.e-c1m1.large")// 设置实例类型
// .setSecurityGroupId("sg-uf6hyictocodexptlgiv")// 设置安全组ID
// .setVSwitchId("vsw-uf6ags5luz17qd6ckn2tb")// 设置虚拟交换机ID
// .setInstanceName("launch-advisor-20240929")// 设置实例名称
// .setInstanceChargeType("PostPaid")// 设置实例付费类型为后付费按量付费
// .setSystemDisk(systemDisk)// 设置系统盘配置
// .setHostName("root")// 设置主机名
// .setPassword("@ywt021900")// 设置实例密码
// .setAmount(1)// 设置创建实例的数量
// .setInternetChargeType("PayByTraffic")// 设置互联网计费类型为按流量计费
// .setInternetMaxBandwidthOut(1);// 设置互联网最大出带宽为1 Mbps
// RuntimeOptions runtime = new RuntimeOptions();
// try {
// // 复制代码运行请自行打印 API 的返回值
// RunInstancesResponse runInstancesResponse = client.runInstancesWithOptions(runInstancesRequest, runtime);
// RunInstancesResponseBody body = runInstancesResponse.getBody();
// ArrayList<String> list = new ArrayList<>(body.getInstanceIdSets().getInstanceIdSet());
// log.info("实例ID{}", list);
//
// } 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);
// }
// }
//
//// private static DescribeInstancesResponse queryInstanceDetails(Client client) {
////
//// //创建查询实例请求对象并设置参数
//// DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest();
//// return null;
//// }
////
//// @Override
//// public void run(ApplicationArguments args) throws Exception {
//// log.info("===============>开始批量创建实例");
//// creatInstance();
//// }
//}

View File

@ -7,7 +7,7 @@ nacos:
addr: 47.101.49.53:8848 addr: 47.101.49.53:8848
user-name: nacos user-name: nacos
password: nacos password: nacos
namespace: seven namespace: warn
# SPRING_AMQP_DESERIALIZATION_TRUST_ALL=true spring.amqp.deserialization.trust.all # SPRING_AMQP_DESERIALIZATION_TRUST_ALL=true spring.amqp.deserialization.trust.all
# Spring # Spring
spring: spring:
@ -58,3 +58,13 @@ spring:
logging: logging:
level: level:
com.muyu.system.mapper: DEBUG com.muyu.system.mapper: DEBUG
aliyun:
access-key-id: LTAI5t7Fnx2QLTYLSu9357wP
access-key-secret: 3LOnydNZ25ytsTGczuSygElx0HJ6nN
endpoint: ecs-cn-hangzhou.aliyuncs.com
region-id: cn-shanghai
image-id: m-uf66taa8r57ky0pg3e7s
instance-type: ecs.t6-c1m1.large
security-group-id: sg-uf6hyictocodexptlgiv
switch-id: vsw-uf6ags5luz17qd6ckn2tb
amount: 1

View File

@ -2,7 +2,7 @@
<!DOCTYPE mapper <!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.muyu.cloud.vehicle.gateway.aliyun.mapper.VehicleConnectionMapper"> <mapper namespace="com.muyu.cloud.vehicle.gateway.mapper.VehicleConnectionMapper">
<insert id="addConnect"> <insert id="addConnect">