feat commit

网关负载功能
master
玉安君 2024-04-19 20:20:36 +08:00
parent 3857e3a875
commit a3059cbbf7
12 changed files with 325 additions and 86 deletions

View File

@ -4,6 +4,7 @@ import com.zhilian.common.security.annotation.EnableCustomConfig;
import com.zhilian.common.security.annotation.EnableMyFeignClients;
import com.zhilian.common.swagger.annotation.EnableCustomSwagger2;
import com.zhilian.online.controller.OnlineLoadCenterController;
import com.zhilian.online.domain.EcsInstance;
import com.zhilian.online.domain.req.EcsCreateReq;
import com.zhilian.online.uitls.AliyunOpenAPIUtils;
import lombok.extern.slf4j.Slf4j;
@ -14,6 +15,8 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.aliyun.ecs20140526.models.RunInstancesRequest;
import java.util.List;
/**
* @version:
* @Author: LiYuan
@ -58,8 +61,11 @@ public class ZhiLianOnlineApplication implements ApplicationRunner {
.periodUnit("Week")
.period(1)
.instanceChargeType("PostPaid")
.privateIpAddress("10.10.27.1")
// .privateIpAddress("10.10.27.1")
.build();
aliyunOpenAPIUtils.createInstance(ecs);
List<String> instance = aliyunOpenAPIUtils.createInstance(ecs);
List<EcsInstance> ecsInstances = aliyunOpenAPIUtils.queryEcsInstances(instance);
log.info("创建的实例信息为{}" , ecsInstances);
}
}

View File

@ -2,6 +2,7 @@ package com.zhilian.online.config;
import com.aliyun.ecs20140526.Client;
import com.aliyun.teaopenapi.models.Config;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ -21,6 +22,7 @@ import com.aliyun.teaopenapi.models.Config;
*/
@Configuration
@ConfigurationProperties("aliyun.ecs")
@Data
@Slf4j
public class AliyunEcsConfig {
@ -39,12 +41,17 @@ public class AliyunEcsConfig {
*/
private String endpoint;
/**
*
*/
private String regionId;
/**
* 使AK&SKClient
* @return Client
* @throws Exception
*/
@Bean("AliyunClient")
@Bean()
public Client createClient() throws Exception {
// 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
// 建议使用更安全的 STS 方式更多鉴权访问方式请参见https://help.aliyun.com/document_detail/378657.html。
@ -52,7 +59,8 @@ public class AliyunEcsConfig {
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
.setAccessKeyId(accessKeyId)
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
.setAccessKeySecret(accessKeySecret);
.setAccessKeySecret(accessKeySecret)
.setRegionId(regionId);
// Endpoint 请参考 https://api.aliyun.com/product/Ecs
config.endpoint = endpoint;
Client aliyunClient = new Client(config);

View File

@ -100,7 +100,7 @@ public class MqttxConfig {
@PostConstruct
// @PostConstruct
public void initMqtt() {
log.info("mqttx连接中......");

View File

@ -3,6 +3,7 @@ package com.zhilian.online.domain.req;
import lombok.*;
import javax.validation.constraints.NotBlank;
import java.util.List;
/**
* @BelongsProject: smart-cloud-server
@ -55,7 +56,7 @@ public class EcsQueryReq {
/**
* ID ["i-bp67acfmxazb4p****", "i-bp67acfmxazb4p****", "i-bp67acfmxazb4p****"]
*/
private String instanceIds;
private List<String> instanceIds;
/**
*

View File

@ -12,7 +12,7 @@ import java.util.List;
* @BelongsPackage: com.zhilian.online.load.cache
* @Author: LiYuan
* @CreateTime: 2024-04-18 19:11
* @Description:
* @Description: 100IP 线
* @Version: 1.0
*/
@Component
@ -28,7 +28,7 @@ public class GatewayLoadNodeCache extends GatewayCacheAbs<String> {
}
/**
* @description:
* @description:
* @author: LiYuan
* @param: nodeList
* @return: void

View File

@ -0,0 +1,54 @@
package com.zhilian.online.load.cache;
import com.zhilian.online.load.abs.GatewayCacheAbs;
import java.util.*;
/**
* @BelongsProject: smart-cloud-server
* @BelongsPackage: com.zhilian.online.load.cache
* @Author: LiYuan
* @CreateTime: 2024-04-19 19:42
* @Description:
* @Version: 1.0
*/
public class GatewayNodeCarsCache extends GatewayCacheAbs<String> {
@Override
public String getPre() {
return "gateway:node:cars";
}
/**
* @description: 线
* @author: LiYuan
* @param: String nodeId, String vin
* @return: void
**/
public void put(String nodeId, String vin) {
redisService.setCacheSet(encode(nodeId), vin);
}
/**
* @description: vin
* @author: LiYuan
* @param: String nodeId
* @return: void
**/
public List<String> get(String nodeId) {
Set<String> res = redisService.getCacheSet(encode(nodeId));
return res.stream().map(String::valueOf).toList();
}
/**
* @description: 线
* @author: LiYuan
* @param: String nodeId, String vin
* @return: void
**/
public void remove(String nodeId, String vin) {
redisService.deleteCacheSetValue(encode(nodeId), vin);
}
}

View File

@ -11,16 +11,16 @@ import java.util.List;
* @BelongsPackage: com.zhilian.online.load.cache
* @Author: LiYuan
* @CreateTime: 2024-04-18 19:44
* @Description: String key + nodeInfo
* @Description: String key(ID) +
* @Version: 1.0
*/
@Component
public class GatewayNodeCache extends GatewayCacheAbs<String > {
public class GatewayNodeInfoCache extends GatewayCacheAbs<String > {
@Override
public String getPre() {
return "gateway:node:info";
return "gateway:node:info:";
}
/**

View File

@ -1,41 +0,0 @@
package com.zhilian.online.load.cache;
import com.zhilian.online.load.abs.GatewayCacheAbs;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
* @BelongsProject: smart-cloud-server
* @BelongsPackage: com.zhilian.online.load.cache
* @Author: LiYuan
* @CreateTime: 2024-04-18 20:03
* @Description: Zset
* @Version: 1.0
*/
@Component
public class GatewayNodeLoadInfoCache extends GatewayCacheAbs<String > {
private final static String gatewayZset = "node-connects:";
@Override
public String getPre() {
return "gateway:Zset:";
}
/**
* @description: Zset
* @author: LiYuan
* @param:
* @return:
**/
public Map<Object,Double> get(){
return redisService.getCacheObject(encode(gatewayZset));
}
}

View File

@ -0,0 +1,62 @@
package com.zhilian.online.load.cache;
import com.zhilian.online.domain.model.GatewayNodeInfo;
import com.zhilian.online.load.abs.GatewayCacheAbs;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
* @BelongsProject: smart-cloud-server
* @BelongsPackage: com.zhilian.online.load.cache
* @Author: LiYuan
* @CreateTime: 2024-04-18 20:03
* @Description:
* @Version: 1.0
*/
@Component
public class GatewayNodeWeightCache extends GatewayCacheAbs<String > {
private final static String gatewayNodeLoadKey = "weight";
@Override
public String getPre() {
return "gateway:node:";
}
/**
* @description: Zset
* @author: LiYuan
* @param: void
* @return: Map<Object,Double>
**/
public Map<Object,Double> get(){
return redisService.getCacheObject(encode(gatewayNodeLoadKey));
}
/**
* @description:
* @author: LiYuan
* @param: gatewayNodeInfo
* @return: score
**/
public Double get(GatewayNodeInfo gatewayNodeInfo){
return redisService.getCacheZsetScore(encode(gatewayNodeLoadKey),gatewayNodeInfo);
}
public void put(GatewayNodeInfo gatewayNodeInfo){
redisService.setCacheZsetValue(encode(gatewayNodeLoadKey),gatewayNodeInfo,0.0);
}
public void increment(GatewayNodeInfo gatewayNodeInfo,Double score){
redisService.incrementScore(encode(gatewayNodeLoadKey),gatewayNodeInfo,score);
}
}

View File

@ -8,13 +8,12 @@ import org.springframework.stereotype.Component;
* @BelongsPackage: com.zhilian.online.load.cache
* @Author: LiYuan
* @CreateTime: 2024-04-18 19:58
* @Description: 线
* @Description:
* @Version: 1.0
*/
@Component
public class GatewayVehicleNodeCaChe extends GatewayCacheAbs<String> {
private final static String gatewayCarBusinessKey = "business:";
@Override
public String getPre() {
@ -28,7 +27,7 @@ public class GatewayVehicleNodeCaChe extends GatewayCacheAbs<String> {
* @return:
**/
public void put(String vin, String nodeId) {
redisService.setCacheObject(encode(gatewayCarBusinessKey) + vin,nodeId);
redisService.setCacheObject(encode(vin),nodeId);
}
@ -39,7 +38,7 @@ public class GatewayVehicleNodeCaChe extends GatewayCacheAbs<String> {
* @return:
**/
public void remove(String vin){
redisService.deleteObject(encode(gatewayCarBusinessKey) + vin);
redisService.deleteObject(encode(vin));
}
/**
@ -49,7 +48,7 @@ public class GatewayVehicleNodeCaChe extends GatewayCacheAbs<String> {
* @return:
**/
public String get(String vin){
return redisService.getCacheObject(encode(gatewayCarBusinessKey) + vin);
return redisService.getCacheObject(encode(vin));
}

View File

@ -7,6 +7,7 @@ import com.zhilian.common.redis.service.RedisService;
import com.zhilian.online.config.RabbitConfig;
import com.zhilian.online.constans.OnlineConstants;
import com.zhilian.online.domain.ApifoxModel;
import com.zhilian.online.load.cache.GatewayNodeInfoCache;
import com.zhilian.online.mapper.OnlineLoadCenterMapper;
import com.zhilian.online.service.OnlineLoadCenterService;
import com.zhilian.online.uitls.MqttUtil;
@ -54,8 +55,12 @@ public class OnlineLoadCenterServiceImpl implements OnlineLoadCenterService{
@Autowired
private MqttUtil mqttUtil;
@Autowired
private GatewayNodeInfoCache gatewayNodeInfoCache;
/**
* @description: , 访
* @description: , 访
* @author: LiYuan
* @param: vehicle
* @return: Result<OnlineAccount>
@ -74,6 +79,7 @@ public class OnlineLoadCenterServiceImpl implements OnlineLoadCenterService{
}
/**
* @description: 线
* @author: LiYuan
@ -128,6 +134,10 @@ public class OnlineLoadCenterServiceImpl implements OnlineLoadCenterService{
return;
}
/**
* @description:线
* @author: LiYuan

View File

@ -4,6 +4,7 @@ import com.aliyun.ecs20140526.models.*;
import com.aliyun.tea.TeaException;
import com.aliyun.teautil.models.RuntimeOptions;
import com.zhilian.common.core.domain.Result;
import com.zhilian.online.config.AliyunEcsConfig;
import com.zhilian.online.domain.EcsInstance;
import com.zhilian.online.domain.req.EcsCreateReq;
import com.zhilian.online.domain.req.EcsQueryReq;
@ -16,6 +17,7 @@ import org.springframework.validation.annotation.Validated;
import com.aliyun.ecs20140526.Client;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
@ -34,11 +36,11 @@ public class AliyunOpenAPIUtils {
* ECS
*/
@Autowired
@Qualifier(value = "AliyunClient")
private Client aliyunClient;
@Value("aliyun.ecs.region-id")
private String regionId;
@Autowired
private AliyunEcsConfig aliyunEcsConfig;
/**
@ -47,8 +49,8 @@ public class AliyunOpenAPIUtils {
* @param: ecsQueryReq
* @return: List<EcsInstance>
*/
public List<EcsInstance> queryEcsInstances(@Validated EcsQueryReq ecsQueryReq) {
log.info("开始创建实例");
public List<EcsInstance> queryEcsInstances(EcsQueryReq ecsQueryReq) {
log.info("开始查询实例{}",ecsQueryReq.getInstanceIds());
List<EcsInstance> ecsInstances = new ArrayList<>();
DescribeInstancesResponse describeInstancesResponse = null;
@ -75,6 +77,77 @@ public class AliyunOpenAPIUtils {
}
/**
*
*
* @param: ecsQueryReq
* @return: List<EcsInstance>
*/
public List<EcsInstance> queryEcsInstancesByPrivateIp(List<String> privateIpAddress) {
log.info("开始查询实例{}",privateIpAddress);
List<EcsInstance> ecsInstances = new ArrayList<>();
DescribeInstancesResponse describeInstancesResponse = null;
//将请求参数写入查询请求中
String ipaddress = parseIpListToString(privateIpAddress);
DescribeInstancesRequest describeInstancesRequest = setQueryReq(ipaddress);
RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// 复制代码运行请自行打印 API 的返回值
describeInstancesResponse = aliyunClient.describeInstancesWithOptions(describeInstancesRequest, runtime);
DescribeInstancesResponseBody body = describeInstancesResponse.getBody();
DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstances instances = body.getInstances();
ecsInstances = takeQueryInstances(instances);
} catch (TeaException error) {
log.error("code:[{}],message:[{}],data:[{}]", error.getCode(), error.getMessage(), error.getData());
} catch (Exception aError) {
TeaException error = new TeaException(aError.getMessage(), aError);
log.error("code:[{}],message:[{}],data:[{}]", error.getCode(), error.getMessage(), error.getData());
}
return ecsInstances;
}
/**
*
*
* @param: instanceIds
* @return: List<EcsInstance>
*/
public List<EcsInstance> queryEcsInstances(List<String> instanceIds) {
log.info("开始查询实例{}",instanceIds);
List<EcsInstance> ecsInstances = new ArrayList<>();
DescribeInstancesResponse describeInstancesResponse = null;
//将请求参数写入查询请求中
DescribeInstancesRequest describeInstancesRequest = setQueryReq(instanceIds);
RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// 复制代码运行请自行打印 API 的返回值
describeInstancesResponse = aliyunClient.describeInstancesWithOptions(describeInstancesRequest, runtime);
DescribeInstancesResponseBody body = describeInstancesResponse.getBody();
DescribeInstancesResponseBody.DescribeInstancesResponseBodyInstances instances = body.getInstances();
ecsInstances = takeQueryInstances(instances);
} catch (TeaException error) {
log.error("code:[{}],message:[{}],data:[{}]", error.getCode(), error.getMessage(), error.getData());
} catch (Exception aError) {
TeaException error = new TeaException(aError.getMessage(), aError);
log.error("code:[{}],message:[{}],data:[{}]", error.getCode(), error.getMessage(), error.getData());
}
return ecsInstances;
}
/**
* @description:
* @author: LiYuan
@ -109,20 +182,21 @@ public class AliyunOpenAPIUtils {
error.getCode(), error.getMessage(), error.getData());
}
return instanceIds;
// List<EcsInstance> ecsInstances = queryEcsInstances(instanceIds);
// putNodeOfCreatedCache(ecsInstances);
return instanceIds;
}
public Result deleteInstance(String instanceId) {
Result result = new Result<>();
DeleteInstancesRequest deleteInstancesRequest = new DeleteInstancesRequest()
.setRegionId(regionId)
.setRegionId(aliyunEcsConfig.getRegionId())
.setDryRun(false)
.setForce(true)
.setTerminateSubscription(false)
.setInstanceId(java.util.Arrays.asList(
instanceId
));
.setInstanceId(Arrays.asList(instanceId));
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// 复制代码运行请自行打印 API 的返回值
@ -150,23 +224,87 @@ public class AliyunOpenAPIUtils {
* @return: DescribeInstancesRequest
**/
public DescribeInstancesRequest setQueryReq(EcsQueryReq ecsQueryReq) {
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("[");
ecsQueryReq.getInstanceIds().forEach(item ->{
stringBuffer.append("\"" + item + "\",");
});
stringBuffer.deleteCharAt(stringBuffer.length()-1);
stringBuffer.append("]");
return new DescribeInstancesRequest()
.setRegionId(regionId)
.setInstanceName(ecsQueryReq.getInstanceName())
.setPageNumber(ecsQueryReq.getPageNumber())
.setPageSize(ecsQueryReq.getPageSize())
.setVpcId(ecsQueryReq.getVpcId())
.setVSwitchId(ecsQueryReq.getVSwitchId())
.setZoneId(ecsQueryReq.getZoneId())
.setInstanceNetworkType(ecsQueryReq.getInstanceNetworkType())
.setSecurityGroupId(ecsQueryReq.getSecurityGroupId())
.setInstanceIds(ecsQueryReq.getInstanceIds())
.setPrivateIpAddresses(ecsQueryReq.getPrivateIpAddresses())
.setPublicIpAddresses(ecsQueryReq.getPublicIpAddresses())
.setInstanceName(ecsQueryReq.getInstanceName())
.setImageId(ecsQueryReq.getImageId())
.setInstanceType(ecsQueryReq.getInstanceType())
.setStatus(ecsQueryReq.getStatus());
.setRegionId(aliyunEcsConfig.getRegionId())
.setInstanceIds(stringBuffer.toString());
// .setInstanceName(ecsQueryReq.getInstanceName())
// .setPageNumber(ecsQueryReq.getPageNumber())
// .setPageSize(ecsQueryReq.getPageSize())
// .setVpcId(ecsQueryReq.getVpcId())
// .setVSwitchId(ecsQueryReq.getVSwitchId())
// .setZoneId(ecsQueryReq.getZoneId())
// .setInstanceNetworkType(ecsQueryReq.getInstanceNetworkType())
// .setSecurityGroupId(ecsQueryReq.getSecurityGroupId())
// .setPrivateIpAddresses(ecsQueryReq.getPrivateIpAddresses())
// .setPublicIpAddresses(ecsQueryReq.getPublicIpAddresses())
// .setInstanceName(ecsQueryReq.getInstanceName())
// .setImageId(ecsQueryReq.getImageId())
// .setInstanceType(ecsQueryReq.getInstanceType())
// .setStatus(ecsQueryReq.getStatus());
}
/**
* @description:
* @author: LiYuan
* @param: EcsQueryReq
* @return: DescribeInstancesRequest
**/
public DescribeInstancesRequest setQueryReq(String ipAddresses) {
return new DescribeInstancesRequest()
.setRegionId(aliyunEcsConfig.getRegionId())
.setPrivateIpAddresses(ipAddresses);
}
public String parseIpListToString(List<String> ipAddress){
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("[");
ipAddress.forEach(item ->{
stringBuffer.append("\"" + item + "\",");
});
stringBuffer.deleteCharAt(stringBuffer.length()-1);
stringBuffer.append("]");
return stringBuffer.toString();
}
/**
* @description:
* @author: LiYuan
* @param: EcsQueryReq
* @return: DescribeInstancesRequest
**/
public DescribeInstancesRequest setQueryReq(List<String> instances) {
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("[");
instances.forEach(item ->{
stringBuffer.append("\"" + item + "\",");
});
stringBuffer.deleteCharAt(stringBuffer.length()-1);
stringBuffer.append("]");
return new DescribeInstancesRequest()
.setRegionId(aliyunEcsConfig.getRegionId())
.setInstanceIds(stringBuffer.toString());
// .setInstanceName(ecsQueryReq.getInstanceName())
// .setPageNumber(ecsQueryReq.getPageNumber())
// .setPageSize(ecsQueryReq.getPageSize())
// .setVpcId(ecsQueryReq.getVpcId())
// .setVSwitchId(ecsQueryReq.getVSwitchId())
// .setZoneId(ecsQueryReq.getZoneId())
// .setInstanceNetworkType(ecsQueryReq.getInstanceNetworkType())
// .setSecurityGroupId(ecsQueryReq.getSecurityGroupId())
// .setPrivateIpAddresses(ecsQueryReq.getPrivateIpAddresses())
// .setPublicIpAddresses(ecsQueryReq.getPublicIpAddresses())
// .setInstanceName(ecsQueryReq.getInstanceName())
// .setImageId(ecsQueryReq.getImageId())
// .setInstanceType(ecsQueryReq.getInstanceType())
// .setStatus(ecsQueryReq.getStatus());
}
@ -183,7 +321,7 @@ public class AliyunOpenAPIUtils {
EcsInstance ecsInstance = EcsInstance.builder()
.instanceId(item.getInstanceId())
.instanceName(item.getInstanceName())
.regionId(regionId)
.regionId(aliyunEcsConfig.getRegionId())
.status(item.getStatus())
.instanceType(item.getInstanceType())
.cpu(item.getCpu())
@ -221,7 +359,7 @@ public class AliyunOpenAPIUtils {
.setCategory(ecsCreateReq.getSystemDickCategory());
//构建创建实例请求
RunInstancesRequest runInstancesRequest = new RunInstancesRequest()
.setRegionId(regionId)
.setRegionId(aliyunEcsConfig.getRegionId())
.setImageId(ecsCreateReq.getImageId())
.setInstanceType(ecsCreateReq.getInstanceType())
.setSecurityGroupId(ecsCreateReq.getSecurityGroupId())
@ -243,4 +381,6 @@ public class AliyunOpenAPIUtils {
return runInstancesRequest;
}
}