xiaohucoding #13

Manually merged
lpz merged 5 commits from xiaohucoding into main 2025-05-29 09:36:32 +08:00
6 changed files with 105 additions and 100 deletions
Showing only changes of commit 28b5ca1dfc - Show all commits

78
pom.xml
View File

@ -2,34 +2,51 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.5</version>
<version>3.1.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.bipt</groupId>
<artifactId>intelligent-application-orchestration-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>intelligent-application-orchestration-service</name>
<description>intelligent-application-orchestration-service</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>21</java.version>
<!-- 添加 Spring Cloud 版本控制 -->
<spring-cloud.version>2022.0.4</spring-cloud.version>
</properties>
<!-- 依赖管理:统一控制 Spring Cloud 和 Alibaba 版本 -->
<dependencyManagement>
<dependencies>
<!-- Spring Cloud 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring Cloud Alibaba 依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2022.0.0.0</version> <!-- 适配 Spring Boot 3.1.x 的正确版本 -->
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- Spring Boot 基础依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
@ -38,42 +55,53 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.kingbase8</groupId>
<artifactId>kingbase8</artifactId>
<version>9.0.0</version>
</dependency>
<!-- 工具类依赖 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.38</version>
<optional>true</optional>
</dependency>
<!--分页查询-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.7</version>
</dependency>
<!--swagger相关依赖生成接口文档-->
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.3.0</version> <!-- 最新稳定版 -->
<version>2.3.0</version>
</dependency>
<!--KingbaseES V8/V9 数据库 JDBC 驱动-->
<!-- Nacos 配置依赖(移除手动版本,由上方依赖管理控制) -->
<dependency>
<groupId>com.kingbase8</groupId>
<artifactId>kingbase8</artifactId>
<version>9.0.0</version>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- Spring Boot 3.x 必须的 Bootstrap 依赖(无需版本号) -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!-- 测试依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
@ -98,6 +126,9 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<!-- 显式指定 Java 21 编译 -->
<source>${java.version}</source>
<target>${java.version}</target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
@ -121,5 +152,4 @@
</plugin>
</plugins>
</build>
</project>
</project>

View File

@ -4,11 +4,13 @@ import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@MapperScan("com.bipt.intelligentapplicationorchestrationservice.mapper")//指定扫描Mapper接口的包
@SpringBootApplication
@EnableTransactionManagement
@EnableDiscoveryClient
@Slf4j
public class IntelligentApplicationOrchestrationServiceApplication {

View File

@ -1,8 +1,8 @@
package com.bipt.intelligentapplicationorchestrationservice.controller;
import com.bipt.intelligentapplicationorchestrationservice.config.RedisConfiguration;
import com.bipt.intelligentapplicationorchestrationservice.pojo.*;
import com.bipt.intelligentapplicationorchestrationservice.service.PublishService;
import com.bipt.intelligentapplicationorchestrationservice.util.NacosServiceUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
@ -24,11 +24,9 @@ public class publishController {
@Autowired
private RedisTemplate redisTemplate;
/**
* 新增请求发布
* @param servicePublishDTO
* @return
*/
@Autowired
private NacosServiceUtil nacosServiceUtil;
@PostMapping
@Operation(summary ="新增发布请求")
@Transactional
@ -37,70 +35,22 @@ public class publishController {
publishService.save(servicePublishDTO);
Long modelId = servicePublishDTO.getModelId();
String key = "Model_" + modelId;
//查询redis是否存在GPU相关资源数据
List<ServicePublishVO> list;
list = (List<ServicePublishVO>) redisTemplate.opsForValue().get(key);
//如果存在,直接返回,无须查询数据库
if (list != null) {
return OptResult.success(list);
}else {
list = new ArrayList<>();
}
String modelConfig = publishService.getByModelId(modelId);
if (modelConfig == null) {
log.error("模型配置为空modelId={}", modelId);
}
String[] keyValuePairs = modelConfig.split("\\|");
String GPUMemorySize = null;
String GPUModel = null;
for (String pair : keyValuePairs) {
pair = pair.trim();
if (pair.startsWith("GPU")) {
GPUModel = pair.split(";", 2)[1];
} else if (pair.startsWith("Memory:")) {
GPUMemorySize = pair.split(":", 2)[1];
}
}
ServicePublishVO servicePublishVO = new ServicePublishVO();
servicePublishVO.setIp(servicePublishDTO.getIp());
servicePublishVO.setModelId(servicePublishDTO.getModelId());
servicePublishVO.setGPUMemorySize(GPUMemorySize);
servicePublishVO.setGPUModel(GPUModel);
//todo 调用模型部署,传递信息
servicePublishVO.setApiUrl(servicePublishDTO.getApiUrl());
list.add(servicePublishVO);
redisTemplate.opsForValue().set(key,list);
//一个ip上有多个机器
// 假设从 Redis 获取的列表元素是 MachineInfo 类型
String ip = servicePublishVO.getIp();
String key1 = ip;
List<MachineInfo> machineList = (List<MachineInfo>) redisTemplate.opsForValue().get(key1);
// 模型所需的 GPU 资源
String requiredGPUModel = servicePublishVO.getGPUModel();
Integer requiredGPUMemory = Integer.valueOf(servicePublishVO.getGPUMemorySize());
if (machineList != null) {
for (MachineInfo machine : machineList) {
// 获取机器的 GPU 资源
String machineGPUModel = machine.getGPUModel();
Integer machineGPUMemory = machine.getGPUMemorySize();
// 判断机器是否满足模型需求
if (requiredGPUModel.equals(machineGPUModel) &&
machineGPUMemory >= requiredGPUMemory) {
return OptResult.success(list);
}
}
String key3 = "wait_queue";
redisTemplate.opsForValue().set(key3,list);
//todo资源释放时候优先分配等待队列中任务
try {
nacosServiceUtil.registerService(
servicePublishDTO.getModelId().toString(),
servicePublishDTO.getIp(),
8080
);
log.info("Nacos服务注册成功");
} catch (Exception e) {
log.error("Nacos服务注册失败", e);
}
return OptResult.success(list);
return OptResult.success();
}

View File

@ -0,0 +1,21 @@
package com.bipt.intelligentapplicationorchestrationservice.util;
import com.alibaba.nacos.api.naming.NamingFactory;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class NacosServiceUtil {
@Value("${spring.cloud.nacos.discovery.server-addr}")
private String nacosServerAddr;
public void registerService(String serviceName, String ip, int port) throws Exception {
NamingService naming = NamingFactory.createNamingService(nacosServerAddr);
Instance instance = new Instance();
instance.setIp(ip);
instance.setPort(port);
naming.registerInstance(serviceName, instance);
}
}

View File

@ -1,5 +1,3 @@
spring.application.name=intelligent-application-orchestration-service
# 数据库配置
spring.datasource.url=jdbc:kingbase8://116.205.121.200:54321/Ipz
@ -10,20 +8,14 @@ spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.connection-timeout=30000
# SQL映射文件路径配置
# MyBatis配置
mybatis.mapper-locations=classpath:mapper/*.xml
# 配置实体类别名所在包
mybatis.type-aliases-package=com.bipt.intelligentapplicationorchestrationservice.pojo
# 开启驼峰命名转换
mybatis.configuration.map-underscore-to-camel-case=true
# Redis服务器地址
# Redis配置
spring.data.redis.host=116.205.121.200
# Redis服务器端口
spring.data.redis.port=6379
# Redis密码如果有
spring.data.redis.password=Jbjhhzstsl97@
# Redis数据库索引默认为0
spring.data.redis.database = 0
# 连接超时时间(毫秒)
spring.data.redis.timeout = 3000
spring.data.redis.database=0
spring.data.redis.timeout=3000

View File

@ -0,0 +1,10 @@
# 应用名称必须与Nacos配置的dataId前缀一致
spring.application.name=intelligent-application-orchestration-service
# Nacos配置中心地址引导阶段加载配置
spring.cloud.nacos.config.server-addr=192.168.100.1:8848
spring.cloud.nacos.config.data-id=${spring.application.name}.properties
spring.cloud.nacos.config.group=DEFAULT_GROUP
# Nacos服务注册地址引导阶段注册服务
spring.cloud.nacos.discovery.server-addr=192.168.100.1:8848