From 7bff86090aae354a837c381a8acccf838370f4eb Mon Sep 17 00:00:00 2001
From: rouchen <3133657697@qq.com>
Date: Sun, 2 Jun 2024 22:40:30 +0800
Subject: [PATCH] =?UTF-8?q?feat=20=E8=8E=B7=E5=8F=96=E8=BD=A6=E8=BE=86cpu?=
=?UTF-8?q?=E4=BD=BF=E7=94=A8=E7=8E=87=20=E4=BB=A5=E5=8F=8A=E6=80=BB?=
=?UTF-8?q?=E6=95=B0=E9=87=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 6 +
src/main/java/com/car/ZnCarApplication.java | 2 +
.../com/car/config/InitConnectWeight.java | 159 +++++++++++++-----
.../com/car/controller/ConnectController.java | 21 +++
.../java/com/car/demos/loadenter/Auth.java | 28 +++
.../java/com/car/demos/loadenter/Content.java | 61 +++++++
.../car/demos/loadenter/LoadEnterNumber.java | 47 ++++++
.../java/com/car/mapper/ConnerMapper.java | 18 ++
.../java/com/car/service/ConnectService.java | 5 +
.../car/service/impl/ConnectServiceImpl.java | 23 ++-
src/main/resources/application.yml | 20 +--
src/main/resources/mapper/ConnerMapper.xml | 15 ++
12 files changed, 351 insertions(+), 54 deletions(-)
create mode 100644 src/main/java/com/car/demos/loadenter/Auth.java
create mode 100644 src/main/java/com/car/demos/loadenter/Content.java
create mode 100644 src/main/java/com/car/demos/loadenter/LoadEnterNumber.java
create mode 100644 src/main/java/com/car/mapper/ConnerMapper.java
create mode 100644 src/main/resources/mapper/ConnerMapper.xml
diff --git a/pom.xml b/pom.xml
index c932398..02abb5b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -156,6 +156,12 @@
commons-lang3
3.12.0
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.13
+
diff --git a/src/main/java/com/car/ZnCarApplication.java b/src/main/java/com/car/ZnCarApplication.java
index 27c3eec..2d4ae1a 100644
--- a/src/main/java/com/car/ZnCarApplication.java
+++ b/src/main/java/com/car/ZnCarApplication.java
@@ -1,9 +1,11 @@
package com.car;
+import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
+@MapperScan
public class ZnCarApplication {
public static void main(String[] args) {
diff --git a/src/main/java/com/car/config/InitConnectWeight.java b/src/main/java/com/car/config/InitConnectWeight.java
index 470f6d4..dd6ad0a 100644
--- a/src/main/java/com/car/config/InitConnectWeight.java
+++ b/src/main/java/com/car/config/InitConnectWeight.java
@@ -9,8 +9,17 @@ import com.aliyun.ecs20140526.models.DescribeInstancesResponse;
import com.aliyun.tea.TeaException;
import com.aliyun.teautil.models.RuntimeOptions;
import com.car.demos.ConnectWeight;
+import com.car.demos.loadenter.Auth;
+import com.car.demos.loadenter.Content;
+import com.car.demos.loadenter.LoadEnterNumber;
import com.car.service.impl.ConnectServiceImpl;
import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
@@ -18,7 +27,7 @@ import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.*;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
-
+import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
@@ -44,11 +53,14 @@ public class InitConnectWeight implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) {
+ connectService.loadCenterDel();
ArrayList connectWeightList = new ArrayList<>();
ArrayList ipList = new ArrayList<>();
+ LoadEnterNumber loadEnterNumber = new LoadEnterNumber();
+
Client client = null;
//获取阿里云客户端
try {
@@ -94,15 +106,22 @@ public class InitConnectWeight implements ApplicationRunner {
com.aliyun.teautil.Common.assertAsString(error.message);
}
//网关收集节点
- int gatewayNum = 0;
+ int gatewayNum = ipList.size();
//数据解析结点数量
int dataNum=0;
//整体负载率
String overallLoad="";
+ //总车辆
+ int connectEventSize =0;
+
+ //内存使用率
+ String memoryUseRate = null;
+ //cpu使用率
+ String cpuUsage = null;
+
//遍历所有ip,获取每一个服务的连接数
for (String ip : ipList) {
//网关收集节点
- gatewayNum = ip.length();
log.info("gatewayNum:{}", gatewayNum);
//fluxMq连接
String url = "http://" + ip + ":8080/public/login";
@@ -144,52 +163,84 @@ public class InitConnectWeight implements ApplicationRunner {
log.info("响应是:{}", responseInfo.getBody());
JSONArray jsonArray = JSON.parseArray(responseInfo.getBody());
+
if (jsonArray.size() > 0) {
JSONObject jsonObject = jsonArray.getJSONObject(0);
// Integer connectSize = jsonObject.getJSONObject("mqttInfo").getJSONObject("runtimes").getInteger("mqtt.connect");
- Integer connectSize = Integer.valueOf(jsonObject.getJSONObject("mqttInfo").getString("connectSize"));
+
+ //获取内存使用率
+ JSONObject flowInfo = jsonObject.getJSONObject("jvmInfo");
+ //内存大小
+ String heapMaxSize = flowInfo.getString("heap-max");
+ //堆内存使用率
+ String heapUsedSize = flowInfo.getString("heap-used");
+
+ // 定义单位到字节的转换系数
+ final double GB_TO_BYTES = 1024 * 1024 * 1024; // 1 GB = 1024^3 bytes
+ final double MB_TO_BYTES = 1024 * 1024; // 1 MB = 1024^2 bytes
+
+ // 解析字符串并转换为字节
+ double maxHeapBytes = Double.parseDouble(heapMaxSize.substring(0, heapMaxSize.length() - 3)) * GB_TO_BYTES; // 去掉"GB"并转换
+ double usedHeapBytes = Double.parseDouble(heapUsedSize.substring(0, heapUsedSize.length() - 3)) * MB_TO_BYTES; // 去掉"MB"并转换
+
+ // 计算使用率(百分比)
+ double usagePercentage = (usedHeapBytes / maxHeapBytes) * 100;
+ //内存率
+ memoryUseRate=usagePercentage+"%";
+
+ //cpu
+ JSONObject cpuInfo = jsonObject.getJSONObject("cpuInfo");
+ String string = cpuInfo.getString("user");
+ cpuUsage =string;
+
+
+ //获取mqtt
+ JSONObject mqttInfo = jsonObject.getJSONObject("mqttInfo");
+ //连接数
+ Integer connectSize = Integer.valueOf(mqttInfo.getString("connectSize"));
+ //小车总连接数
+ connectEventSize = Integer.valueOf(mqttInfo.getString("connectEventSize"));
+
connectWeightList.add(new ConnectWeight(ip,100-connectSize));
+ //权重值
+ Integer weightValue = 100 - connectSize;
+
log.info("链接数量:{}", connectSize);
} else {
log.info("得到的相应数据为null");
}
- }
-// Integer sum =0;
-// for (ConnectWeight connectWeight : connectWeightList) {
-// sum = sum + connectWeight.getWeightValue();
-// }
+// //获取车辆列表
+// String postList = "http://"+ip+":8080/mqtt/connection";
//
-// int max = 0;
-// for (ConnectWeight connectWeight : connectWeightList) {
-// log.info("权重值:{}",connectWeight.getWeightValue());
-// Integer result = BigDecimal.valueOf(connectWeight.getWeightValue() * 100).divide(BigDecimal.valueOf(sum), 0, RoundingMode.DOWN).intValue();
-// if (result > max){
-// max = result;
-// }
-// connectWeight.setWeightValue(result);
-// log.info("100次轮询次数:{}",result);
-// }
-//
-// ArrayList weightIpList = new ArrayList<>();
-//
-// //轮询出现次数
-// for (int i = 0; i <= max; i++) {
-// for (ConnectWeight connectWeight : connectWeightList) {
-// if (connectWeight.getWeightValue() > i){
-// weightIpList.add(connectWeight.getCarServerIp());
-// }else if (connectWeight.getWeightValue() == max ){
-// weightIpList.add(connectWeight.getCarServerIp());
-// }
-// }
-// }
-//
-// //存入redis
-// redisTemplate.delete("ips");
-// for (String ip : weightIpList) {
-// redisTemplate.opsForList().rightPush("ips",ip);
-// }
+// HttpClient closeableHttpClient = HttpClients.createDefault();
+// HttpPost httpPost = new HttpPost(postList);
+// JSONObject object = JSONObject.parseObject(result);
+// httpPost.addHeader("accessToken",object.getString("accessToken") ); // 设置请求头
+// try {
+// HttpResponse response = closeableHttpClient.execute(httpPost);
+// Object o = restTemplate.postForObject(postList, response, Object.class);
+// log.info("响应是:{}", o);
+// JSONObject jsonObject = JSONObject.parseObject(response.toString());
+// JSONArray content = jsonObject.getJSONArray("content");
+// for (int i = 0; i < content.size(); i++) {
+// // 获取每个元素(JSONObject)
+// JSONObject contentItem = content.getJSONObject(i);
+// // 获取state字段的值
+// int state = contentItem.getIntValue("state");
+// if (state == 1) {
+// // 如果state为1,则将当前对象添加到列表中
+// filteredContent.add(contentItem);
+// }
+// }
+// log.info("车辆列表:{}", response);
+// } catch (IOException e) {
+// throw new RuntimeException(e);
+// }
+
+ }
+ log.info("车辆在线是",connectEventSize);
//每个连接数的权重总和
Integer sum =0;
@@ -199,15 +250,27 @@ public class InitConnectWeight implements ApplicationRunner {
System.out.println("sum"+sum);
int max=0;
+ //权重总和
+ double sumOfWeights=0;
for (ConnectWeight connectWeight : connectWeightList) {
- Integer result = BigDecimal.valueOf(connectWeight.getWeightValue() * 100).divide(BigDecimal.valueOf(sum), 0, RoundingMode.DOWN).intValue();
+ BigDecimal divide = BigDecimal.valueOf(connectWeight.getWeightValue() * 100).divide(BigDecimal.valueOf(sum), 0, RoundingMode.DOWN);
+ int result = divide.intValue();
if (result > max){
max = result;
}
connectWeight.setWeightValue(result);
System.out.println("100次轮询次数:{}"+result);
+ sumOfWeights+=connectWeight.getWeightValue();
}
-
+ overallLoad =sumOfWeights/ipList.size()+"%";
+ log.info("总负载",overallLoad);
+ LoadEnterNumber build = LoadEnterNumber.builder()
+ .carSum(connectEventSize)
+ .gatewayNum(ipList.size())
+ .dataNum(dataNum)
+ .overallLoad(overallLoad)
+ .build();
+ connectService.LoadCenterAdd(build);
ArrayList weightIpList = new ArrayList<>();
for (int i = 0; i <= max; i++) {
@@ -223,13 +286,25 @@ public class InitConnectWeight implements ApplicationRunner {
}
}
}
-
// 存入redis
redisTemplate.delete("ips");
for (String ip : weightIpList) {
redisTemplate.opsForList().rightPush("ips",ip);
}
-
+// List contents = new ArrayList<>();
+// for (JSONObject jsonObject : filteredContent) {
+// Content build = Content.builder()
+// .cleanSession(jsonObject.getInteger("cleanSession"))
+// .id(jsonObject.getInteger("id"))
+// .clientPort(jsonObject.getInteger("clientPort"))
+// .protocolType(jsonObject.getString("protocolType"))
+// .version(jsonObject.getString("version"))
+// .state(jsonObject.getInteger("state"))
+// .connectTime(jsonObject.getDate("connectTime"))
+// .auth(jsonObject.getJSONArray("auth").toJavaList(Auth.class))
+// .build();
+// contents.add(build);
+// }
}
}
diff --git a/src/main/java/com/car/controller/ConnectController.java b/src/main/java/com/car/controller/ConnectController.java
index a1b00f0..65b80ce 100644
--- a/src/main/java/com/car/controller/ConnectController.java
+++ b/src/main/java/com/car/controller/ConnectController.java
@@ -2,6 +2,7 @@ package com.car.controller;
import com.car.demos.MqttServerModel;
import com.car.demos.Result;
+import com.car.demos.loadenter.LoadEnterNumber;
import com.car.demos.req.VehicleConnectionReq;
import com.car.service.ConnectService;
import org.springframework.beans.factory.annotation.Autowired;
@@ -26,4 +27,24 @@ public class ConnectController {
public ResultgetConnect(@RequestBody VehicleConnectionReq vehicleConnectionReq){
return connectService.getConnect();
}
+
+ /**
+ * 添加负载中心总条数
+ * @param loadEnterNumber
+ * @return
+ */
+ @PostMapping("/LoadCenterAdd")
+ public Result LoadCenterAdd(@RequestBody LoadEnterNumber loadEnterNumber){
+ connectService.LoadCenterAdd(loadEnterNumber);
+ return Result.success("添加成功");
+ }
+
+ /**
+ * 删除负载中心总条数
+ */
+ @PostMapping("/loadCenterDel")
+ public Result loadCenterDel(){
+ connectService.loadCenterDel();
+ return Result.success("删除成功");
+ }
}
diff --git a/src/main/java/com/car/demos/loadenter/Auth.java b/src/main/java/com/car/demos/loadenter/Auth.java
new file mode 100644
index 0000000..6e4f4c5
--- /dev/null
+++ b/src/main/java/com/car/demos/loadenter/Auth.java
@@ -0,0 +1,28 @@
+package com.car.demos.loadenter;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+/**
+ * 用户信息 Auth
+ *
+ * @author Yangle
+ * Date 2024/6/2 11:45
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@SuperBuilder
+public class Auth {
+ /**
+ * 用户名
+ */
+ private String username;
+ /**
+ * 用户密码
+ */
+ private String password;
+
+}
diff --git a/src/main/java/com/car/demos/loadenter/Content.java b/src/main/java/com/car/demos/loadenter/Content.java
new file mode 100644
index 0000000..b86890c
--- /dev/null
+++ b/src/main/java/com/car/demos/loadenter/Content.java
@@ -0,0 +1,61 @@
+package com.car.demos.loadenter;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 车辆详细信息 Content
+ *
+ * @author Yangle
+ * Date 2024/6/2 11:32
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@SuperBuilder
+public class Content {
+ /**
+ * id
+ */
+ private Integer id;
+
+ /**
+ * 客户端id
+ */
+ private Integer clientId;
+ /*
+ 客户端地址
+ */
+ private String clientIp;
+
+ private Integer clientPort;
+ private String protocolType;
+ private String nodeIp;
+ private String version;
+ private Integer keepalive;
+ private Integer cleanSession;
+ /**
+ * 状态
+ */
+ private Integer state;
+ /**
+ * 连接时间
+ */
+ private Date connectTime;
+
+ private List auth;
+
+
+
+
+
+
+
+
+
+}
diff --git a/src/main/java/com/car/demos/loadenter/LoadEnterNumber.java b/src/main/java/com/car/demos/loadenter/LoadEnterNumber.java
new file mode 100644
index 0000000..6dd109d
--- /dev/null
+++ b/src/main/java/com/car/demos/loadenter/LoadEnterNumber.java
@@ -0,0 +1,47 @@
+package com.car.demos.loadenter;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.SuperBuilder;
+
+import java.util.List;
+
+/**
+ * 负载中心数据总数量展示 loadEnterNumber
+ *
+ * @author Yangle
+ * Date 2024/6/2 11:29
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@SuperBuilder
+public class LoadEnterNumber {
+
+ /*
+ 主键
+ */
+ private Integer id;
+ /*
+ 网关收集节点数量
+ */
+ private Integer gatewayNum;
+ /*
+ 数据解析节点数量
+ */
+ private Integer dataNum;
+ /*
+ 整体负载率
+ */
+ private String overallLoad;
+ /*
+ 车辆在线数量
+ */
+ private Integer carSum;
+//
+// /**
+// * 车辆对象
+// */
+// private List contents;
+}
diff --git a/src/main/java/com/car/mapper/ConnerMapper.java b/src/main/java/com/car/mapper/ConnerMapper.java
new file mode 100644
index 0000000..a1ba4aa
--- /dev/null
+++ b/src/main/java/com/car/mapper/ConnerMapper.java
@@ -0,0 +1,18 @@
+package com.car.mapper;
+
+import com.car.demos.loadenter.LoadEnterNumber;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * ConnerMapper
+ *
+ * @author Yangle
+ * Date 2024/6/2 11:52
+ */
+@Mapper
+public interface ConnerMapper {
+ void lodaCenterAdd(LoadEnterNumber loadEnterNumber);
+
+ void loadCenterDel();
+
+}
diff --git a/src/main/java/com/car/service/ConnectService.java b/src/main/java/com/car/service/ConnectService.java
index 0fdf18c..39ea4af 100644
--- a/src/main/java/com/car/service/ConnectService.java
+++ b/src/main/java/com/car/service/ConnectService.java
@@ -2,6 +2,7 @@ package com.car.service;
import com.car.demos.MqttServerModel;
import com.car.demos.Result;
+import com.car.demos.loadenter.LoadEnterNumber;
/**
* 车辆连接业务层 ConnectImpl
@@ -12,4 +13,8 @@ import com.car.demos.Result;
public interface ConnectService {
Result getConnect();
+ void LoadCenterAdd(LoadEnterNumber loadEnterNumber);
+
+ void loadCenterDel();
+
}
diff --git a/src/main/java/com/car/service/impl/ConnectServiceImpl.java b/src/main/java/com/car/service/impl/ConnectServiceImpl.java
index 6a2c446..3beac6e 100644
--- a/src/main/java/com/car/service/impl/ConnectServiceImpl.java
+++ b/src/main/java/com/car/service/impl/ConnectServiceImpl.java
@@ -5,6 +5,8 @@ import com.aliyun.teaopenapi.models.Config;
import com.car.demos.MqttServerModel;
import com.car.demos.Result;
+import com.car.demos.loadenter.LoadEnterNumber;
+import com.car.mapper.ConnerMapper;
import com.car.service.ConnectService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
@@ -18,8 +20,8 @@ import org.springframework.stereotype.Service;
*/
@Service
public class ConnectServiceImpl implements ConnectService {
-// @Autowired
-// private ConnerMapper connerMapper;
+ @Autowired
+ private ConnerMapper connerMapper;
@Autowired
private StringRedisTemplate redisTemplate;
@Override
@@ -42,6 +44,23 @@ public class ConnectServiceImpl implements ConnectService {
}
}
+ /**
+ * 添加负载中心
+ * @param loadEnterNumber
+ */
+ @Override
+ public void LoadCenterAdd(LoadEnterNumber loadEnterNumber) {
+ connerMapper.lodaCenterAdd(loadEnterNumber);
+ }
+
+ /**
+ * 删除负载中心
+ */
+ @Override
+ public void loadCenterDel() {
+ connerMapper.loadCenterDel();
+ }
+
public static Client createClient() throws Exception {
// 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 65ce8e3..d15ba54 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -14,7 +14,7 @@ spring:
matching-strategy: ant_path_matcher
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
- url: jdbc:mysql://115.159.211.196:3306/data_basete?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
+ url: jdbc:mysql://115.159.211.196:3306/zncar?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
username: root
password: yl@123
druid:
@@ -48,13 +48,13 @@ spring:
port: 6379
password: yl030509
-## 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
+# 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/ConnerMapper.xml b/src/main/resources/mapper/ConnerMapper.xml
new file mode 100644
index 0000000..e234c60
--- /dev/null
+++ b/src/main/resources/mapper/ConnerMapper.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+ INSERT INTO `zncar`.`load_enter_number`
+ ( `gateway_num`, `data_num`, `overall_load`, `car_sum`)
+ VALUES ( #{gatewayNum}, #{dataNum}, #{overallLoad}, #{carSum});
+
+
+ DELETE FROM `zncar`.`load_enter_number`
+
+