commit 3f5643fb726a29aaa1174d179bcf12f72b0db5cc Author: 20300 <643145201@qq.com> Date: Tue Jun 4 20:26:06 2024 +0800 feat()cpu 内存 负载计算 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..855a155 --- /dev/null +++ b/pom.xml @@ -0,0 +1,162 @@ + + + 4.0.0 + com.example + parse-message + 0.0.1-SNAPSHOT + parse-message + parse-message + + 11 + UTF-8 + UTF-8 + 2.6.13 + + + + org.bouncycastle + bcpkix-jdk15on + 1.70 + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.projectlombok + lombok + 1.18.30 + + + + + commons-lang + commons-lang + 2.6 + + + + javax.servlet + javax.servlet-api + provided + + + + org.springframework.boot + spring-boot-starter-web + + + + org.apache.httpcomponents + httpcore + 4.4.12 + + + org.apache.httpcomponents + httpclient + 4.5.13 + + + + org.apache.commons + commons-lang3 + 3.12.0 + + + org.eclipse.paho + org.eclipse.paho.client.mqttv3 + 1.2.5 + + + + org.springframework.boot + spring-boot-starter-amqp + + + + + com.alibaba + fastjson + 1.2.79 + + + + mysql + mysql-connector-java + 8.0.11 + runtime + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.2.2 + + + + com.github.pagehelper + pagehelper-spring-boot-starter + 1.4.1 + + + + com.aliyun + ecs20140526 + 5.1.8 + + + + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + pom + import + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 1.8 + 1.8 + UTF-8 + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + com.hyc.ParseMessageApplication + true + + + + repackage + + repackage + + + + + + + + diff --git a/src/main/java/com/hyc/ParseMessageApplication.java b/src/main/java/com/hyc/ParseMessageApplication.java new file mode 100644 index 0000000..f33c70d --- /dev/null +++ b/src/main/java/com/hyc/ParseMessageApplication.java @@ -0,0 +1,13 @@ +package com.hyc; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ParseMessageApplication { + + public static void main(String[] args) { + SpringApplication.run(ParseMessageApplication.class, args); + } + +} diff --git a/src/main/java/com/hyc/config/RabbitmqConfig.java b/src/main/java/com/hyc/config/RabbitmqConfig.java new file mode 100644 index 0000000..f6a1f5f --- /dev/null +++ b/src/main/java/com/hyc/config/RabbitmqConfig.java @@ -0,0 +1,54 @@ +package com.hyc.config; + +import org.springframework.amqp.core.*; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * rabbitMq配置类 + * + * @author YouChe·He + * @ClassName: RabbitmqConfig + * @Description: rabbitMq配置类 + * @CreateTime: 2024/5/27 16:56 + */ +@Configuration +public class RabbitmqConfig { + public static final String INIT_CONNECT = "init_connect"; + public static final String DISCONNECT_CONNECT = "disconnect_connect"; + public static final String EXCHANGE_TOPICS_INFORM="exchange_topics_inform"; + public static final String ROUTINGKEY_EMAIL="inform.#.email.#"; + public static final String ROUTINGKEY_SMS="inform.#.sms.#"; + + + @Bean(EXCHANGE_TOPICS_INFORM) + public Exchange EXCHANGE_TOPICS_INFORM(){ + //durable(true) 持久化,mq重启之后交换机还在 + return ExchangeBuilder.topicExchange(EXCHANGE_TOPICS_INFORM).durable(true).build(); + } + + //声明QUEUE_INFORM_EMAIL队列 + @Bean(INIT_CONNECT) + public Queue QUEUE_INFORM_EMAIL(){ + return new Queue(INIT_CONNECT); + } + //声明QUEUE_INFORM_SMS队列 + @Bean(DISCONNECT_CONNECT) + public Queue QUEUE_INFORM_SMS(){ + return new Queue(DISCONNECT_CONNECT); + } + + //ROUTINGKEY_EMAIL队列绑定交换机,指定routingKey + @Bean + public Binding BINDING_QUEUE_INFORM_EMAIL(@Qualifier(INIT_CONNECT) Queue queue, + @Qualifier(EXCHANGE_TOPICS_INFORM) Exchange exchange){ + return BindingBuilder.bind(queue).to(exchange).with(ROUTINGKEY_EMAIL).noargs(); + } + //ROUTINGKEY_SMS队列绑定交换机,指定routingKey + @Bean + public Binding BINDING_ROUTINGKEY_SMS(@Qualifier(DISCONNECT_CONNECT) Queue queue, + @Qualifier(EXCHANGE_TOPICS_INFORM) Exchange exchange){ + return BindingBuilder.bind(queue).to(exchange).with(ROUTINGKEY_SMS).noargs(); + } +} diff --git a/src/main/java/com/hyc/config/RestTemplateConfig.java b/src/main/java/com/hyc/config/RestTemplateConfig.java new file mode 100644 index 0000000..f75938f --- /dev/null +++ b/src/main/java/com/hyc/config/RestTemplateConfig.java @@ -0,0 +1,33 @@ +package com.hyc.config; + +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配置类 + * + * @author YouChe·He + * @ClassName: RestTemplateConfig + * @Description: rest配置类 + * @CreateTime: 2024/5/27 10:01 + */ +@Configuration +public class RestTemplateConfig { + @Bean + public RestTemplate restTemplate(ClientHttpRequestFactory factory) { + return new RestTemplate(factory); + } + + @Bean + public ClientHttpRequestFactory simpleClientHttpRequestFactory() { + SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); + //超时设置 + factory.setReadTimeout(5000);//ms + factory.setConnectTimeout(15000);//ms + return factory; + } +} + diff --git a/src/main/java/com/hyc/consumer/MQTTConsumer.java b/src/main/java/com/hyc/consumer/MQTTConsumer.java new file mode 100644 index 0000000..163859c --- /dev/null +++ b/src/main/java/com/hyc/consumer/MQTTConsumer.java @@ -0,0 +1,68 @@ +//package com.hyc.consumer; +// +//import com.hyc.domain.ConnectionParameter; +//import lombok.extern.slf4j.Slf4j; +//import org.eclipse.paho.client.mqttv3.*; +//import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; +//import org.springframework.stereotype.Component; +// +///** +// * MQTT消费者 +// * +// * @author YouChe·He +// * @ClassName: MQTTConsumer +// * @Description: MQTT消费者 +// * @CreateTime: 2024/5/30 19:12 +// */ +//@Component +//@Slf4j +//public class MQTTConsumer { +// +// public void parseMessage(ConnectionParameter connectionParameter){ +// int qos = 0; +// +// try { +// MqttClient client = null; +// +// client = new MqttClient(connectionParameter.getBroker(), connectionParameter.getClientid(), new MemoryPersistence()); +// +// +// // 连接参数 +// MqttConnectOptions options = new MqttConnectOptions(); +// if (connectionParameter.getUsername() !=null && !"".equals(connectionParameter.getUsername())){ +// options.setUserName(connectionParameter.getUsername()); +// options.setPassword(connectionParameter.getPassword().toCharArray()); +// } +// +// options.setConnectionTimeout(60); +// options.setKeepAliveInterval(60); +// // 设置回调 +// client.setCallback(new MqttCallback() { +// +// @Override +// public void connectionLost(Throwable cause) { +// System.out.println("connectionLost: " + cause.getMessage()); +// } +// +// @Override +// public void messageArrived(String topic, MqttMessage message) { +// System.out.println("topic: " + topic); +// System.out.println("Qos: " + message.getQos()); +// System.out.println("message content: " + new String(message.getPayload())); +// +// } +// +// @Override +// public void deliveryComplete(IMqttDeliveryToken token) { +// System.out.println("deliveryComplete---------" + token.isComplete()); +// } +// +// }); +// client.connect(options); +// client.subscribe(connectionParameter.getTopic(), qos); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// +//} diff --git a/src/main/java/com/hyc/consumer/ReceiveHandler.java b/src/main/java/com/hyc/consumer/ReceiveHandler.java new file mode 100644 index 0000000..9ffa28a --- /dev/null +++ b/src/main/java/com/hyc/consumer/ReceiveHandler.java @@ -0,0 +1,51 @@ +//package com.hyc.consumer; +// +//import com.alibaba.fastjson.JSONObject; +//import com.hyc.config.RabbitmqConfig; +//import com.hyc.domain.ConnectionParameter; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.amqp.core.Message; +//import org.springframework.amqp.rabbit.annotation.RabbitListener; +//import org.springframework.beans.factory.annotation.Autowired; +// +//import org.springframework.stereotype.Component; +// +///** +// * 断开连接消费者 +// * +// * @author YouChe·He +// * @ClassName: ReceiveHandler +// * @Description: 断开连接消费者 +// * @CreateTime: 2024/5/27 17:00 +// */ +//@Component +//@Slf4j +//public class ReceiveHandler { +// +// @Autowired +// private MQTTConsumer mqttConsumer; +// +// @RabbitListener(queues = {RabbitmqConfig.INIT_CONNECT}) +// public void receive_email(Message msg){ +// String messageBody = new String(msg.getBody()); +// ConnectionParameter connectionParameter = getConnectionParameter(messageBody); +// mqttConsumer.parseMessage(connectionParameter); +// } +// +// +// public ConnectionParameter getConnectionParameter(String messageBody){ +// +// +// log.error("链接事件得到的消息:{}",messageBody); +// JSONObject jsonObject = JSONObject.parseObject(messageBody); +// String carVin = jsonObject.getString("clientId"); +// +// String[] split = carVin.split("-"); +// String vin = split[0]; +// String broker = split[1]; +// String topic = split[2]; +// log.warn("ConnectionParameter对象的属性 broker:{},vin:{},topic:{}",broker,vin,topic); +// return new ConnectionParameter(broker,null,null,vin,topic); +// } +// +//} diff --git a/src/main/java/com/hyc/controller/SummarizeController.java b/src/main/java/com/hyc/controller/SummarizeController.java new file mode 100644 index 0000000..8c3c221 --- /dev/null +++ b/src/main/java/com/hyc/controller/SummarizeController.java @@ -0,0 +1,101 @@ +package com.hyc.controller; + +import com.hyc.domain.ConnectionParameter; +import com.hyc.domain.SummarizeResp; +import com.hyc.result.Result; +import com.hyc.service.SummarizeService; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.*; +import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 创建Mqtt客户端 + * + * @author YouChe·He + * @ClassName: CreateMqttClient + * @Description: 创建Mqtt客户端 + * @CreateTime: 2024/5/31 10:25 + */ +@Slf4j +@RestController +@RequestMapping("/create") +public class SummarizeController { + + @Autowired + private SummarizeService summarizeService; + + @PostMapping("/createMqttClient") + public String createMqttClient(@RequestBody List connectionParameterList){ + + log.error("进来了!!!"); + for (ConnectionParameter connectionParameter : connectionParameterList) { + boolean oneMqttClient = createOneMqttClient(connectionParameter); + if (oneMqttClient==true){ + log.warn("broker为:{}的mqtt客户端连接成功",connectionParameter.getBroker()); + } + } + + return "成功!"; + } + + @GetMapping("/getAllLoadInfo") + public Result getAllLoadInfo(){ + return summarizeService.getAllLoadInfo(); + } + + + + public boolean createOneMqttClient(ConnectionParameter connectionParameter){ + + int qos = 0; + try { + MqttClient client = null; + + client = new MqttClient(connectionParameter.getBroker(), connectionParameter.getClientid(), new MemoryPersistence()); + + + // 连接参数 + MqttConnectOptions options = new MqttConnectOptions(); + if (connectionParameter.getUsername() !=null && !"".equals(connectionParameter.getUsername())){ + options.setUserName(connectionParameter.getUsername()); + options.setPassword(connectionParameter.getPassword().toCharArray()); + } + + options.setConnectionTimeout(60); + options.setKeepAliveInterval(60); + // 设置回调 + client.setCallback(new MqttCallback() { + + @Override + public void connectionLost(Throwable cause) { + System.out.println("connectionLost: " + cause.getMessage()); + } + + @Override + public void messageArrived(String topic, MqttMessage message) { + System.out.println("topic: " + topic); + System.out.println("Qos: " + message.getQos()); + System.out.println("message content: " + new String(message.getPayload())); + + } + + @Override + public void deliveryComplete(IMqttDeliveryToken token) { + System.out.println("deliveryComplete---------" + token.isComplete()); + } + + }); + client.connect(options); + client.subscribe(connectionParameter.getTopic(), qos); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + return true; + } + +} diff --git a/src/main/java/com/hyc/domain/ConnectionParameter.java b/src/main/java/com/hyc/domain/ConnectionParameter.java new file mode 100644 index 0000000..5b13c5c --- /dev/null +++ b/src/main/java/com/hyc/domain/ConnectionParameter.java @@ -0,0 +1,24 @@ +package com.hyc.domain; + + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +/** + * 连接MQTT参数 + * + * @author YouChe·He + * @ClassName: ConnectionParameter + * @Description: 连接MQTT参数 + * @CreateTime: 2024/5/30 18:52 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ConnectionParameter { + private String broker; + private String username; + private String password; + private String clientid; + private String topic; +} diff --git a/src/main/java/com/hyc/domain/GetWayServerLoad.java b/src/main/java/com/hyc/domain/GetWayServerLoad.java new file mode 100644 index 0000000..36d385e --- /dev/null +++ b/src/main/java/com/hyc/domain/GetWayServerLoad.java @@ -0,0 +1,35 @@ +package com.hyc.domain; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 服务对应负载 + * + * @author YouChe·He + * @ClassName: GetWayServerLoad + * @Description: 服务对应负载 + * @CreateTime: 2024/6/2 22:05 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class GetWayServerLoad { + /** + * 服务ip + */ + private String ip; + /** + * 负载率 + */ + private Double loadNum; + /** + * 内存使用率 + */ + private Double memoryNum; + /** + * CPU使用率 + */ + private Double cpuNum; +} diff --git a/src/main/java/com/hyc/domain/SummarizeResp.java b/src/main/java/com/hyc/domain/SummarizeResp.java new file mode 100644 index 0000000..e1ebdad --- /dev/null +++ b/src/main/java/com/hyc/domain/SummarizeResp.java @@ -0,0 +1,45 @@ +package com.hyc.domain; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.util.List; + +/** + * 概述响应类 + * + * @author YouChe·He + * @ClassName: SummarizeResp + * @Description: 概述响应类 + * @CreateTime: 2024/6/2 16:39 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +public class SummarizeResp { + /** + * 网管节点收集数量 + */ + private Integer gateWayServerNum; + /** + * 数据解析节点数量 + */ + private Integer dataAnalyze; + + /** + * 整体负载 + */ + private Double allLoad; + /** + * 车辆在线数 + */ + private Integer catOnline; + private List timeSortCarList; + + private List getWayServerLoadList; + + private List vinIpList; +} diff --git a/src/main/java/com/hyc/domain/TimeSortCar.java b/src/main/java/com/hyc/domain/TimeSortCar.java new file mode 100644 index 0000000..400ddc5 --- /dev/null +++ b/src/main/java/com/hyc/domain/TimeSortCar.java @@ -0,0 +1,49 @@ +package com.hyc.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * 时间排序小车 + * + * @author YouChe·He + * @ClassName: TimeSortCar + * @Description: 时间排序小车 + * @CreateTime: 2024/6/2 16:34 + */ +@Data +@SuperBuilder +@AllArgsConstructor +@NoArgsConstructor +public class TimeSortCar implements Comparable { + /** + * 车辆唯一标识 VIN + */ + private String vin; + + /** + * 连接节点ip + */ + private String ip; + /** + * 连接时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date connectTime; + /** + * 连接时长 单位分钟 + */ + private long connectDuration; + + @Override + public int compareTo(TimeSortCar o) { + return Integer.compare((int) o.connectDuration,(int) this.connectDuration); + } +} diff --git a/src/main/java/com/hyc/domain/VinIp.java b/src/main/java/com/hyc/domain/VinIp.java new file mode 100644 index 0000000..068354c --- /dev/null +++ b/src/main/java/com/hyc/domain/VinIp.java @@ -0,0 +1,41 @@ +package com.hyc.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * 小车绑定服务信息 + * + * @author YouChe·He + * @ClassName: VinIp + * @Description: 小车绑定服务信息 + * @CreateTime: 2024/6/2 16:52 + */ +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +public class VinIp { + + /** + * 车辆唯一标识 VIN + */ + private String vin; + + /** + * 连接节点ip + */ + private String ip; + /** + * 连接时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date connectTime; +} diff --git a/src/main/java/com/hyc/mapper/SummarizeMapper.java b/src/main/java/com/hyc/mapper/SummarizeMapper.java new file mode 100644 index 0000000..266147f --- /dev/null +++ b/src/main/java/com/hyc/mapper/SummarizeMapper.java @@ -0,0 +1,31 @@ +package com.hyc.mapper; +/** + * 持久层 + * + * @author YouChe·He + * @ClassName: SummarizeMapper + * @Description: 持久层 + * @CreateTime: 2024/6/2 16:47 + */ + +import com.hyc.domain.VinIp; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.web.bind.annotation.Mapping; + +import javax.annotation.ManagedBean; +import java.util.List; + +/** + *@ClassName SummarizeMapper + *@Description 描述 + *@Author ZHIHAO.DAI + *@Date 2024/6/2 16:47 + */ +@Mapper +public interface SummarizeMapper { + + List getAllLoadInfo(); + + List getNewConnectVin(); + +} diff --git a/src/main/java/com/hyc/result/HttpStatus.java b/src/main/java/com/hyc/result/HttpStatus.java new file mode 100644 index 0000000..7f32c7b --- /dev/null +++ b/src/main/java/com/hyc/result/HttpStatus.java @@ -0,0 +1,93 @@ +package com.hyc.result; + +/** + * 返回状态码 + * + * @author ruoyi + */ +public class HttpStatus { + /** + * 操作成功 + */ + public static final int SUCCESS = 200; + + /** + * 对象创建成功 + */ + public static final int CREATED = 201; + + /** + * 请求已经被接受 + */ + public static final int ACCEPTED = 202; + + /** + * 操作已经执行成功,但是没有返回数据 + */ + public static final int NO_CONTENT = 204; + + /** + * 资源已被移除 + */ + public static final int MOVED_PERM = 301; + + /** + * 重定向 + */ + public static final int SEE_OTHER = 303; + + /** + * 资源没有被修改 + */ + public static final int NOT_MODIFIED = 304; + + /** + * 参数列表错误(缺少,格式不匹配) + */ + public static final int BAD_REQUEST = 400; + + /** + * 未授权 + */ + public static final int UNAUTHORIZED = 401; + + /** + * 访问受限,授权过期 + */ + public static final int FORBIDDEN = 403; + + /** + * 资源,服务未找到 + */ + public static final int NOT_FOUND = 404; + + /** + * 不允许的http方法 + */ + public static final int BAD_METHOD = 405; + + /** + * 资源冲突,或者资源被锁 + */ + public static final int CONFLICT = 409; + + /** + * 不支持的数据,媒体类型 + */ + public static final int UNSUPPORTED_TYPE = 415; + + /** + * 系统内部错误 + */ + public static final int ERROR = 500; + + /** + * 接口未实现 + */ + public static final int NOT_IMPLEMENTED = 501; + + /** + * 系统警告消息 + */ + public static final int WARN = 601; +} diff --git a/src/main/java/com/hyc/result/Result.java b/src/main/java/com/hyc/result/Result.java new file mode 100644 index 0000000..f858c2d --- /dev/null +++ b/src/main/java/com/hyc/result/Result.java @@ -0,0 +1,101 @@ +package com.hyc.result; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 响应信息主体 + * + * @author ruoyi + */ +@Data +public class Result implements Serializable { + /** + * 成功 + */ + public static final int SUCCESS = HttpStatus.SUCCESS; + /** + * 失败 + */ + public static final int FAIL = HttpStatus.ERROR; + private static final long serialVersionUID = 1L; + /** + * 系统警告消息 + */ + private static final int WARN = HttpStatus.WARN; + + private int code; + + private String msg; + + private T data; + + public static Result success () { + return restResult(null, SUCCESS, "操作成功"); + } + + public static Result success (T data) { + return restResult(data, SUCCESS, "操作成功"); + } + + public static Result success (T data, String msg) { + return restResult(data, SUCCESS, msg); + } + + public static Result error () { + return restResult(null, FAIL, "操作失败"); + } + + public static Result error (String msg) { + return restResult(null, FAIL, msg); + } + + public static Result error (T data) { + return restResult(data, FAIL, "操作失败"); + } + + 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, "操作失败"); + } + + public static Result warn (String msg) { + return restResult(null, WARN, msg); + } + + public static Result warn (T data) { + return restResult(data, WARN, "操作失败"); + } + + 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) { + Result apiResult = new Result<>(); + apiResult.setCode(code); + apiResult.setData(data); + apiResult.setMsg(msg); + return apiResult; + } + + 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/hyc/service/SummarizeService.java b/src/main/java/com/hyc/service/SummarizeService.java new file mode 100644 index 0000000..b0d3dc5 --- /dev/null +++ b/src/main/java/com/hyc/service/SummarizeService.java @@ -0,0 +1,22 @@ +package com.hyc.service; +/** + * 服务层 + * + * @author YouChe·He + * @ClassName: SummarizeService + * @Description: 服务层 + * @CreateTime: 2024/6/2 16:46 + */ + +import com.hyc.domain.SummarizeResp; +import com.hyc.result.Result; + +/** + *@ClassName SummarizeService + *@Description 描述 + *@Author ZHIHAO.DAI + *@Date 2024/6/2 16:46 + */ +public interface SummarizeService { + Result getAllLoadInfo(); +} diff --git a/src/main/java/com/hyc/service/impl/SummarizeServiceImpl.java b/src/main/java/com/hyc/service/impl/SummarizeServiceImpl.java new file mode 100644 index 0000000..37bed6c --- /dev/null +++ b/src/main/java/com/hyc/service/impl/SummarizeServiceImpl.java @@ -0,0 +1,191 @@ +package com.hyc.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +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.teautil.models.RuntimeOptions; +import com.hyc.domain.GetWayServerLoad; +import com.hyc.domain.SummarizeResp; +import com.hyc.domain.TimeSortCar; +import com.hyc.domain.VinIp; +import com.hyc.mapper.SummarizeMapper; +import com.hyc.result.Result; +import com.hyc.service.SummarizeService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.*; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import java.math.BigDecimal; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 实现 + * + * @author YouChe·He + * @ClassName: SummarizeServiceImpl + * @Description: 实现 + * @CreateTime: 2024/6/2 16:46 + */ +@Service +@Slf4j +public class SummarizeServiceImpl implements SummarizeService { + + @Autowired + private SummarizeMapper summarizeMapper; + @Autowired + private RestTemplate restTemplate; + @Override + public Result getAllLoadInfo() { + + ArrayList getWayServerLoads = new ArrayList<>(); + + Integer carSum = 0; + + Double allLoad = 0.0; + + Integer gateWayServerNum = 0; + + Integer dataAnalyze = 22; + + + + ArrayList ipList = new ArrayList<>(); + + List connectLongVinList = summarizeMapper.getAllLoadInfo(); + + List newConnectVinList = summarizeMapper.getNewConnectVin(); + + + try { + Client client = this.createClient(); + //填写地区参数和实例规格参数 + DescribeInstancesRequest describeInstancesRequest = new DescribeInstancesRequest() + .setRegionId("cn-shanghai") + .setInstanceType("ecs.e-c1m2.xlarge"); + RuntimeOptions runtime = new RuntimeOptions(); + + //获得ip并添加进入集合 + DescribeInstancesResponse describeInstancesResponse = client.describeInstancesWithOptions(describeInstancesRequest, runtime); + List> ipListList = describeInstancesResponse.getBody().instances.getInstance().stream().map(instance -> instance.publicIpAddress.ipAddress).collect(Collectors.toList()); + for (List strings : ipListList) { + for (String ip : strings) { + ipList.add(ip); + gateWayServerNum ++; + } + System.out.println("------------------------"); + } + //遍历ip 访问URL + for (String ip : ipList) { + String url = "http://" + ip + ":8080/public/login"; + Map request = new HashMap<>(); + request.put("username", "fluxmq"); + request.put("password", "fluxmq"); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_JSON); + HttpEntity> r = new HttpEntity<>(request, httpHeaders); + String result = restTemplate.postForObject(url, r, String.class); + + + //http://fluxmq.muyu.icu/public/cluster + + int nextInt = new Random().nextInt(1000); + String getInfoUrl = "http://" + ip + ":8080/public/cluster?random=" + nextInt; + + HttpHeaders httpHeadersGetInfo = new HttpHeaders(); + httpHeadersGetInfo.setContentType(MediaType.APPLICATION_JSON); + httpHeadersGetInfo.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + httpHeadersGetInfo.set("Cookie", result); + HttpEntity getInfoRequest = new HttpEntity(httpHeadersGetInfo); + ResponseEntity responseInfo = restTemplate.exchange(getInfoUrl, HttpMethod.GET, getInfoRequest, String.class, 1); + + log.info("响应是:{}", responseInfo.getBody()); + + JSONArray jsonArray = JSON.parseArray(responseInfo.getBody()); + if (jsonArray.size() > 0) { + + JSONObject jsonObject = jsonArray.getJSONObject(0); + + Integer connectSize = Integer.valueOf(jsonObject.getJSONObject("mqttInfo").getString("connectSize")); + carSum = connectSize + carSum; + log.info("负载:{}",connectSize*1.0/100); + + allLoad = connectSize*1.0/100; + + + + String cSys = jsonObject.getJSONObject("cpuInfo").getString("idle"); + int i = cSys.indexOf("%"); + Double cpuInfo = Double.valueOf(cSys.substring(0, i)); + log.info("CPU利用率:{}",cSys); + + String heapUsed =jsonObject.getJSONObject("jvmInfo").getString("heap-used"); + int x = heapUsed.indexOf("M"); + String realHeapUsed = heapUsed.substring(0, x); + + String noHeapUsed = jsonObject.getJSONObject("jvmInfo").getString("no_heap-used"); + int y = noHeapUsed.indexOf("M"); + String realNoHeapUsed = noHeapUsed.substring(0, y); + + String heapMax = jsonObject.getJSONObject("jvmInfo").getString("heap-max"); + int z = heapMax.indexOf("G"); + String realHeapMax = heapMax.substring(0, z); + + double v = (Double.valueOf(realHeapUsed) + Double.valueOf(realNoHeapUsed))/ (Double.valueOf(realHeapMax) * 1000) * 100; + + BigDecimal bd = new BigDecimal(v).setScale(2, BigDecimal.ROUND_HALF_UP); + double roundedNumber = bd.doubleValue(); + log.info("heapUsed:{},noHeapUsed:{},heapMax:{},内存使用率:{}",heapUsed,noHeapUsed,heapMax,roundedNumber); + getWayServerLoads.add(new GetWayServerLoad(ip,connectSize*1.0/100*100,roundedNumber,cpuInfo)); + log.info("链接数量:{}", connectSize); + } else { + log.error("得到的相应数据为null"); + } + } + + } catch (Exception e) { + throw new RuntimeException(e); + } + + ArrayList sortCarArrayList = new ArrayList<>(); + + for (VinIp vinIp : connectLongVinList) { + Date connectTime = vinIp.getConnectTime(); + + Date currentTime = new Date(); + + // 计算时间差(单位:毫秒) + long timeDifference = currentTime.getTime() - connectTime.getTime(); + + // 转换为分钟数 + long minutesDifference = timeDifference / (1000 * 60); + sortCarArrayList.add(new TimeSortCar(vinIp.getVin(),vinIp.getIp(),vinIp.getConnectTime(),minutesDifference)); + + } + + + Collections.sort(sortCarArrayList); + SummarizeResp summarizeResp = new SummarizeResp(gateWayServerNum,dataAnalyze,allLoad / gateWayServerNum * 100,carSum,sortCarArrayList,getWayServerLoads,newConnectVinList); + + return Result.success(summarizeResp); + } + + public Client createClient() throws Exception { + // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。 + // 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html。 + Config config = new Config() + // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。 + .setAccessKeyId("LTAI5tAEQA9AgnqasQ7Y56cJ") + // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。 + .setAccessKeySecret("IsrnZ6dKBgEit5HXv2xyfo0xT8VGkj"); + // Endpoint 请参考 https://api.aliyun.com/product/Ecs + config.endpoint = "ecs.cn-shanghai.aliyuncs.com"; + return new Client(config); + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..6e533f2 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,62 @@ +# 服务器相关 + +server: + port: 10003 + +spring: + rabbitmq: + host: 115.159.47.91 + port: 5672 + username: guest + password: guest + virtualHost: / + mvc: + pathmatch: + matching-strategy: ant_path_matcher + datasource: + driver-class-name: com.mysql.jdbc.Driver + url: jdbc:mysql://47.103.75.98:3306/netcar?serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false + username: root + password: hyc@123 + druid: + # 下面为连接池的补充设置,应用到上面所有数据源中 + # 初始化大小,最小,最大 + initial-size: 5 + min-idle: 5 + max-active: 20 + # 配置获取连接等待超时的时间 + max-wait: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + time-between-eviction-runs-millis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + min-evictable-idle-time-millis: 300000 + validation-query: SELECT 1 FROM DUAL + test-while-idle: true + test-on-borrow: false + test-on-return: false + # 打开PSCache,并且指定每个连接上PSCache的大小 + pool-prepared-statements: true + # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 + max-pool-prepared-statement-per-connection-size: 20 + filters: stat,wall + use-global-data-source-stat: true + # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 + connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 + application: + name: shop-server + redis: + host: 47.103.75.98 + port: 6379 + password: hyc123 + + +# mybatis +mybatis: + configuration: + map-underscore-to-camel-case: true + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + mapper-locations: classpath*:mapper/*Mapper.xml + global-config: + db-config: + id-type: auto + diff --git a/src/main/resources/mapper/ConnectMapper.xml b/src/main/resources/mapper/ConnectMapper.xml new file mode 100644 index 0000000..79fd57d --- /dev/null +++ b/src/main/resources/mapper/ConnectMapper.xml @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/src/test/java/com/hyc/parsemessage/ParseMessageApplicationTests.java b/src/test/java/com/hyc/parsemessage/ParseMessageApplicationTests.java new file mode 100644 index 0000000..94ccb50 --- /dev/null +++ b/src/test/java/com/hyc/parsemessage/ParseMessageApplicationTests.java @@ -0,0 +1,13 @@ +package com.hyc.parsemessage; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class ParseMessageApplicationTests { + + @Test + void contextLoads() { + } + +}