Compare commits

..

4 Commits

Author SHA1 Message Date
yuan 87e6afc257 feat:http请求 2024-10-10 20:27:24 +08:00
yuan 41354f4a8f feat:http请求 2024-10-10 20:27:15 +08:00
yuan 239c6001c8 Merge branch 'refs/heads/dev.cargateway' into dev 2024-10-10 20:26:27 +08:00
yuan 83f0060b4e feat:http请求 2024-10-10 20:25:17 +08:00
11 changed files with 204 additions and 37 deletions

View File

@ -0,0 +1,22 @@
package com.muyu.common.rabbit.constants;
/**
* @Author
* @Packagecom.muyu.common.rabbit.contants
* @Projectcloud-server-8
* @nameVehicleGatewayContants
* @Date2024/10/10 9:02
*/
public class VehicleGatewayConstants {
/**
*
*/
public final static String VEHICLE_GETAWAY_EXCHANGE = "vehicle.getaway";
/**
* 线
*/
public final static String VEHICLE_GETAWAY_ROUTING_KEY = "vehicle.getaway.online";
}

View File

@ -64,6 +64,7 @@
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
<!--验证码 -->
<dependency>
<groupId>pro.fessional</groupId>
@ -76,6 +77,12 @@
<artifactId>cloud-common-redis</artifactId>
</dependency>
<!-- rabbitMq 消息队列 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-gateway-spring-boot-starter</artifactId>

View File

@ -102,6 +102,10 @@
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>com.muyu</groupId>
<artifactId>cloud-common-security</artifactId>
</dependency>
</dependencies>

View File

@ -0,0 +1,23 @@
package com.muyu.car.domain.api;
/**
* @Author
* @Packagecom.muyu.car.domain.api.req
* @Projectcloud-server-8
* @nameWebHookConnection
* @Date2024/10/10 7:49
*/
public class WebHookConnection {
private String protocol;
private String timestamp;
private String version;
private String keepalive;
private String cleanSession;
private String nodeIp;
private String clientId;
private String clientIp;
private String clientPort;
private String MessageId;
}

View File

@ -0,0 +1,30 @@
package com.muyu.car.gateway.controller;
import com.muyu.car.domain.api.WebHookConnection;
import com.muyu.common.core.domain.Result;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author
* @Packagecom.muyu.gateway.controller
* @Projectcloud-server-8
* @nameFluxMqCallbackController
* @Date2024/10/10 2:44
*/
@RestController
@RequestMapping("/fluxmq")
public class FluxMqCallbackController {
@Autowired private RabbitTemplate rabbitTemplate;
@PostMapping("/send")
public Result<String> online(WebHookConnection webHookConnection){
rabbitTemplate.convertAndSend("getaway","fluxmq",webHookConnection);
return Result.success();
}
}

View File

@ -29,7 +29,7 @@ public class VehicleInformationController {
@Validated @RequestBody VehicleConnectionReq vehicleConnectionReq
) {
return Result.success(vehicleInformationService.getVehicleData(vehicleConnectionReq));
return vehicleInformationService.getVehicleData(vehicleConnectionReq);
}
}

View File

@ -1,5 +1,6 @@
package com.muyu.car.gateway.mq;
import com.muyu.common.rabbit.constants.VehicleGatewayConstants;
import lombok.extern.log4j.Log4j2;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
@ -7,6 +8,7 @@ import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
@ -19,35 +21,14 @@ import org.springframework.stereotype.Component;
*/
@Log4j2
@Component
public class CreateExchange implements ApplicationRunner {
public class CreateExchange {
@Autowired
private ConnectionFactory connectionFactory;
@Override
public void run(ApplicationArguments args) {
log.info("=====>开始创建交换机");
try {
RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
// 创建Fanout类型的交换机
FanoutExchange exchange = new FanoutExchange("ONLINE_EXCHANGE", true, false);
rabbitAdmin.declareExchange(exchange);
// 创建队列
Queue queue = new Queue("GO_ONLINE", true, false, false);
rabbitAdmin.declareQueue(queue);
// Fanout交换机绑定
rabbitAdmin.declareBinding(BindingBuilder.bind(queue).to(exchange));
log.info("=====>交换机创建成功");
log.info("=====>队列创建成功并绑定到交换机");
}catch (Exception e) {
log.info(e.getMessage());
}
/**
*
* @return
*/
@Bean
public DirectExchange initVehicleGatewayExchange(){
return new DirectExchange(VehicleGatewayConstants.VEHICLE_GETAWAY_EXCHANGE);
}
}

View File

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.muyu.car.domain.api.req.VehicleConnectionReq;
import com.muyu.car.domain.model.MqttServerModel;
import com.muyu.car.domain.model.VehicleInformation;
import com.muyu.common.core.domain.Result;
/**
* @Author
@ -13,5 +14,5 @@ import com.muyu.car.domain.model.VehicleInformation;
* @Date2024/10/6 2:40
*/
public interface VehicleInformationService{
MqttServerModel getVehicleData(VehicleConnectionReq vehicleConnectionReq);
Result<MqttServerModel> getVehicleData(VehicleConnectionReq vehicleConnectionReq);
}

View File

@ -6,6 +6,7 @@ import com.muyu.car.domain.model.MqttServerModel;
import com.muyu.car.domain.model.VehicleInformation;
import com.muyu.car.gateway.service.VehicleInformationService;
import com.muyu.car.mapper.VehicleInformationMapper;
import com.muyu.common.core.domain.Result;
import com.muyu.common.redis.service.RedisService;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
@ -33,7 +34,7 @@ public class VehicleInformationServiceImpl implements VehicleInformationService{
@Autowired private RedisService redisService;
@Override
public MqttServerModel getVehicleData(VehicleConnectionReq vehicleConnectionReq) {
public Result<MqttServerModel> getVehicleData(VehicleConnectionReq vehicleConnectionReq) {
log.info("车辆连接请求:[{}]",vehicleConnectionReq);
vehicleConnectionReq.setPassword(vehicleConnectionReq.getVehicleVin()+vehicleConnectionReq.getTimestamp()+vehicleConnectionReq.getNonce());
@ -45,16 +46,16 @@ public class VehicleInformationServiceImpl implements VehicleInformationService{
log.info("车辆无法重复预上线");
}
// 获取名为 "ipList" 的列表
// 获取 IP 的列表
List<String> ipList = redisService.getCacheList("ipList");
if (ipList.isEmpty()) {
return null;
return Result.error("IP服务器列表为空");
}
// 获取当前使用的索引位置
String indexStr = redisService.getCacheObject("currentIndex");
int index = indexStr!= null? Integer.parseInt(indexStr) : 0;
String selectedIp = ipList.get(index);
// 获取 IP 的使用次数
// 获取 IP 的使用次数
String countStr = redisService.getCacheMapValue("ipCounts", selectedIp);
log.info("IP:[{}]车辆连接数:[{}]",selectedIp,countStr);
int count = countStr!= null? Integer.parseInt(countStr) : 0;
@ -65,7 +66,7 @@ public class VehicleInformationServiceImpl implements VehicleInformationService{
// 更新索引
index = (index + 1) % ipList.size();
redisService.setCacheObject("currentIndex", String.valueOf(index));
return new MqttServerModel("tcp://"+selectedIp.substring(1,selectedIp.length()-1)+":1883","vehicle");
return Result.success(new MqttServerModel("tcp://"+selectedIp.substring(1,selectedIp.length()-1)+":1883","vehicle"));
} else {
// 如果使用次数达到 12 次,跳过该 IP 并更新索引
index = (index + 1) % ipList.size();

View File

@ -45,7 +45,7 @@ public class GenerateInstance implements ApplicationRunner {
// 设置地域ID
.setRegionId("cn-hangzhou")
// 设置镜像ID
.setImageId("m-bp1hkxfctk751s62jqhq")
.setImageId("m-bp1epdalpjow84ornf09")
// 设置实例类型
.setInstanceType("ecs.t6-c1m1.large")
// 设置安全组ID

View File

@ -0,0 +1,98 @@
package com.muyu.car;
import com.aliyun.ecs20140526.models.RunInstancesResponse;
import com.aliyun.ecs20140526.models.RunInstancesResponseBody;
import com.aliyun.tea.TeaException;
import com.muyu.car.instance.CreateClient;
import lombok.extern.log4j.Log4j2;
import java.util.ArrayList;
import java.util.List;
/**
* @Author
* @Packagecom.muyu.car.gateway
* @Projectcloud-server-8
* @nametest
* @Date2024/10/10 10:30
*/
@Log4j2
public class test {
public static void main(String[] args) throws Exception {
generateInstance();
}
/**
*
* @throws Exception
*/
public static List<String> generateInstance() throws Exception {
// 创建ECS客户端对象用于后续调用ECS相关API
com.aliyun.ecs20140526.Client client = CreateClient.createClient();
com.aliyun.ecs20140526.models.RunInstancesRequest.RunInstancesRequestSystemDisk systemDisk = new com.aliyun.ecs20140526.models.RunInstancesRequest.RunInstancesRequestSystemDisk()
.setSize("40")
.setCategory("cloud_essd");
com.aliyun.ecs20140526.models.RunInstancesRequest runInstancesRequest = new com.aliyun.ecs20140526.models.RunInstancesRequest()
// 设置地域ID
.setRegionId("cn-hangzhou")
// 设置镜像ID
.setImageId("m-bp1epdalpjow84ornf09")
// 设置实例类型
.setInstanceType("ecs.t6-c1m1.large")
// 设置安全组ID
.setSecurityGroupId("sg-bp1a7fk8js5pn3fw9p2m")
// 设置虚拟交换机ID
.setVSwitchId("vsw-bp193np7r01vssqxhh24e")
// 设置实例名称
.setInstanceName("server-mqtt")
// 设置实例付费类型为后付费按量付费
.setInstanceChargeType("PostPaid")
// 设置互联网最大出带宽为1 Mbps
.setInternetMaxBandwidthOut(1)
// 设置系统盘配置
.setSystemDisk(systemDisk)
// 设置主机名
.setHostName("root")
// 设置实例密码
.setPassword("EightGroup123.")
// 设置创建实例的数量
.setAmount(1);
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// 复制代码运行请自行打印 API 的返回值
RunInstancesResponse runInstancesResponse = client.runInstancesWithOptions(runInstancesRequest, runtime);
// 获取body返回值对象
RunInstancesResponseBody body = runInstancesResponse.getBody();
ArrayList<String> list = new ArrayList<>();
// 得到实例ID数组
for (String instance : body.getInstanceIdSets().getInstanceIdSet()) {
list.add(instance);
}
log.info("实例ID:{}",list);
return list;
} catch (TeaException error) {
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
log.info(error.getMessage());
// 诊断地址
log.info(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
log.info(error.getMessage());
// 诊断地址
log.info(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
return null;
}
}