1.31 k8s开发
This commit is contained in:
parent
7e9587c6e7
commit
828461d46b
@ -0,0 +1,159 @@
|
||||
package com.qqchen.deploy.backend.framework.utils;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
/**
|
||||
* K8s资源工具类
|
||||
* 用于解析和格式化K8s资源(CPU、内存)
|
||||
*/
|
||||
@Slf4j
|
||||
public class K8sResourceUtils {
|
||||
|
||||
private K8sResourceUtils() {
|
||||
// 工具类,禁止实例化
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析CPU资源字符串为毫核(millicores)
|
||||
* 支持格式:
|
||||
* - "2" -> 2000m (2核)
|
||||
* - "2000m" -> 2000m
|
||||
* - "0.5" -> 500m
|
||||
*
|
||||
* @param cpuStr CPU资源字符串
|
||||
* @return 毫核数
|
||||
*/
|
||||
public static long parseCpuToMillicores(String cpuStr) {
|
||||
if (cpuStr == null || cpuStr.isEmpty()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
try {
|
||||
if (cpuStr.endsWith("m")) {
|
||||
// 已经是毫核格式,如"2000m"
|
||||
return Long.parseLong(cpuStr.substring(0, cpuStr.length() - 1));
|
||||
} else {
|
||||
// 核数格式,如"2"或"0.5",转换为毫核
|
||||
return (long) (Double.parseDouble(cpuStr) * 1000);
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
log.warn("解析CPU资源失败: {}", cpuStr, e);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析内存资源字符串为字节数
|
||||
* 支持格式:
|
||||
* - "4Gi" -> 4 * 1024 * 1024 * 1024 bytes
|
||||
* - "512Mi" -> 512 * 1024 * 1024 bytes
|
||||
* - "1024Ki" -> 1024 * 1024 bytes
|
||||
* - "4G" -> 4 * 1000 * 1000 * 1000 bytes
|
||||
* - "512M" -> 512 * 1000 * 1000 bytes
|
||||
* - "1024K" -> 1024 * 1000 bytes
|
||||
* - "1000000" -> 1000000 bytes
|
||||
*
|
||||
* @param memoryStr 内存资源字符串
|
||||
* @return 字节数
|
||||
*/
|
||||
public static long parseMemoryToBytes(String memoryStr) {
|
||||
if (memoryStr == null || memoryStr.isEmpty()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
try {
|
||||
// 二进制单位(1024进制)
|
||||
if (memoryStr.endsWith("Gi")) {
|
||||
return Long.parseLong(memoryStr.substring(0, memoryStr.length() - 2)) * 1024L * 1024L * 1024L;
|
||||
} else if (memoryStr.endsWith("Mi")) {
|
||||
return Long.parseLong(memoryStr.substring(0, memoryStr.length() - 2)) * 1024L * 1024L;
|
||||
} else if (memoryStr.endsWith("Ki")) {
|
||||
return Long.parseLong(memoryStr.substring(0, memoryStr.length() - 2)) * 1024L;
|
||||
}
|
||||
// 十进制单位(1000进制)
|
||||
else if (memoryStr.endsWith("G")) {
|
||||
return Long.parseLong(memoryStr.substring(0, memoryStr.length() - 1)) * 1000L * 1000L * 1000L;
|
||||
} else if (memoryStr.endsWith("M")) {
|
||||
return Long.parseLong(memoryStr.substring(0, memoryStr.length() - 1)) * 1000L * 1000L;
|
||||
} else if (memoryStr.endsWith("K")) {
|
||||
return Long.parseLong(memoryStr.substring(0, memoryStr.length() - 1)) * 1000L;
|
||||
} else {
|
||||
// 纯数字,单位为字节
|
||||
return Long.parseLong(memoryStr);
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
log.warn("解析内存资源失败: {}", memoryStr, e);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 格式化CPU资源为K8s格式字符串
|
||||
* 优先使用整数核,如果不能整除则使用毫核或保留小数
|
||||
*
|
||||
* @param millicores 毫核数
|
||||
* @return K8s格式字符串,如"2"、"2.5"、"500m"
|
||||
*/
|
||||
public static String formatCpuResource(long millicores) {
|
||||
if (millicores == 0) {
|
||||
return "0";
|
||||
}
|
||||
|
||||
if (millicores % 1000 == 0) {
|
||||
// 整数核,如2000m -> "2"
|
||||
return String.valueOf(millicores / 1000);
|
||||
} else if (millicores >= 1000) {
|
||||
// 大于1核但不能整除,使用小数表示,如2500m -> "2.5"
|
||||
double cores = millicores / 1000.0;
|
||||
// 如果小数部分为0,显示整数;否则保留1位小数
|
||||
if (cores == Math.floor(cores)) {
|
||||
return String.valueOf((long) cores);
|
||||
} else {
|
||||
return String.format("%.1f", cores);
|
||||
}
|
||||
} else {
|
||||
// 小于1核,使用毫核格式,如"500m"
|
||||
return millicores + "m";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 格式化内存资源为K8s格式字符串(使用二进制单位)
|
||||
* 优先使用能整除的最大单位,如果都不能整除则选择最接近的单位并保留1位小数
|
||||
*
|
||||
* @param bytes 字节数
|
||||
* @return K8s格式字符串,如"4Gi"、"15.6Gi"、"512Mi"
|
||||
*/
|
||||
public static String formatMemoryResource(long bytes) {
|
||||
if (bytes == 0) {
|
||||
return "0";
|
||||
}
|
||||
|
||||
long gi = 1024L * 1024L * 1024L;
|
||||
long mi = 1024L * 1024L;
|
||||
long ki = 1024L;
|
||||
|
||||
// 优先尝试整除转换
|
||||
if (bytes >= gi && bytes % gi == 0) {
|
||||
return (bytes / gi) + "Gi";
|
||||
} else if (bytes >= mi && bytes % mi == 0) {
|
||||
return (bytes / mi) + "Mi";
|
||||
} else if (bytes >= ki && bytes % ki == 0) {
|
||||
return (bytes / ki) + "Ki";
|
||||
}
|
||||
|
||||
// 如果不能整除,选择最接近的单位并保留1位小数
|
||||
if (bytes >= gi) {
|
||||
double value = bytes / (double) gi;
|
||||
return String.format("%.1fGi", value);
|
||||
} else if (bytes >= mi) {
|
||||
double value = bytes / (double) mi;
|
||||
return String.format("%.1fMi", value);
|
||||
} else if (bytes >= ki) {
|
||||
double value = bytes / (double) ki;
|
||||
return String.format("%.1fKi", value);
|
||||
} else {
|
||||
return String.valueOf(bytes);
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user