From 28b5ca1dfcb5db21b84a7ed5fa059460f8d44567 Mon Sep 17 00:00:00 2001
From: xiaohucoding <2307520758@qq.com>
Date: Sun, 25 May 2025 17:24:57 +0800
Subject: [PATCH 1/5] =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=8F=91=E5=B8=83?=
=?UTF-8?q?=EF=BC=88nacos=E7=89=88=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 78 +++++++++++++------
...cationOrchestrationServiceApplication.java | 2 +
.../controller/publishController.java | 78 ++++---------------
.../util/NacosServiceUtil.java | 21 +++++
src/main/resources/application.properties | 16 +---
src/main/resources/bootstrap.properties | 10 +++
6 files changed, 105 insertions(+), 100 deletions(-)
create mode 100644 src/main/java/com/bipt/intelligentapplicationorchestrationservice/util/NacosServiceUtil.java
create mode 100644 src/main/resources/bootstrap.properties
diff --git a/pom.xml b/pom.xml
index 8255ccc..7b91012 100644
--- a/pom.xml
+++ b/pom.xml
@@ -2,34 +2,51 @@
4.0.0
+
org.springframework.boot
spring-boot-starter-parent
- 3.2.5
+ 3.1.5
+
com.bipt
intelligent-application-orchestration-service
0.0.1-SNAPSHOT
intelligent-application-orchestration-service
intelligent-application-orchestration-service
-
-
-
-
-
-
-
-
-
-
-
-
+
21
+
+ 2022.0.4
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring-cloud.version}
+ pom
+ import
+
+
+
+ com.alibaba.cloud
+ spring-cloud-alibaba-dependencies
+ 2022.0.0.0
+ pom
+ import
+
+
+
+
+
org.springframework.boot
spring-boot-starter-jdbc
@@ -38,42 +55,53 @@
org.springframework.boot
spring-boot-starter-web
-
org.springframework.boot
spring-boot-starter-data-redis
+
+
org.postgresql
postgresql
runtime
+
+ com.kingbase8
+ kingbase8
+ 9.0.0
+
+
+
org.projectlombok
lombok
1.18.38
true
-
-
com.github.pagehelper
pagehelper-spring-boot-starter
1.4.7
-
org.springdoc
springdoc-openapi-starter-webmvc-ui
- 2.3.0
+ 2.3.0
-
+
- com.kingbase8
- kingbase8
- 9.0.0
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-config
+
+
+ org.springframework.cloud
+ spring-cloud-starter-bootstrap
+
+
+
org.springframework.boot
spring-boot-starter-test
@@ -98,6 +126,9 @@
org.apache.maven.plugins
maven-compiler-plugin
+
+ ${java.version}
+ ${java.version}
org.projectlombok
@@ -121,5 +152,4 @@
-
-
+
\ No newline at end of file
diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/IntelligentApplicationOrchestrationServiceApplication.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/IntelligentApplicationOrchestrationServiceApplication.java
index 1e18dc6..5d34a0f 100644
--- a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/IntelligentApplicationOrchestrationServiceApplication.java
+++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/IntelligentApplicationOrchestrationServiceApplication.java
@@ -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 {
diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/publishController.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/publishController.java
index ea333da..6d98284 100644
--- a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/publishController.java
+++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/publishController.java
@@ -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 list;
- list = (List) 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 machineList = (List) 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();
}
diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/util/NacosServiceUtil.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/util/NacosServiceUtil.java
new file mode 100644
index 0000000..53861a1
--- /dev/null
+++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/util/NacosServiceUtil.java
@@ -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);
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 2b97d0a..d8ff972 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -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
\ No newline at end of file
diff --git a/src/main/resources/bootstrap.properties b/src/main/resources/bootstrap.properties
new file mode 100644
index 0000000..b24d590
--- /dev/null
+++ b/src/main/resources/bootstrap.properties
@@ -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
\ No newline at end of file
From 60a71a121c15a1bc56c1155e7c6e29b6732d1a0a Mon Sep 17 00:00:00 2001
From: xiaohucoding <2307520758@qq.com>
Date: Sun, 25 May 2025 20:38:36 +0800
Subject: [PATCH 2/5] =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=8F=91=E5=B8=83?=
=?UTF-8?q?=EF=BC=88nacos=E7=89=88=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../config/WebMvcConfiguration.java | 18 ++++-----------
.../controller/publishController.java | 13 ++++++-----
.../util/NacosServiceUtil.java | 23 ++++++++++++++++++-
3 files changed, 33 insertions(+), 21 deletions(-)
diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/config/WebMvcConfiguration.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/config/WebMvcConfiguration.java
index 8efb176..003a69a 100644
--- a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/config/WebMvcConfiguration.java
+++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/config/WebMvcConfiguration.java
@@ -4,20 +4,18 @@ import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.servers.Server;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
-import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.ArrayList;
import java.util.List;
-/**
- * 配置类,注册web层相关组件
- */
@Configuration
@Slf4j
-public class WebMvcConfiguration{
+public class WebMvcConfiguration implements WebMvcConfigurer {
/**
* 配置OpenAPI信息
@@ -36,12 +34,4 @@ public class WebMvcConfiguration{
.servers(servers);
}
-// /**
-// * 设置静态资源映射(Springdoc不需要特殊配置,保留可能的其他资源映射)
-// */
-// @Override
-// protected void addResourceHandlers(ResourceHandlerRegistry registry) {
-// // 保留其他静态资源映射(如果有)
-// // registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
-// }
}
\ No newline at end of file
diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/publishController.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/publishController.java
index 6d98284..ebfe15f 100644
--- a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/publishController.java
+++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/publishController.java
@@ -12,7 +12,10 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
@Tag(name ="服务发布相关接口")
@RestController
@@ -33,17 +36,15 @@ public class publishController {
public OptResult> save(@RequestBody ServicePublishDTO servicePublishDTO) {
log.info("模型发布请求:{}", servicePublishDTO);
publishService.save(servicePublishDTO);
- Long modelId = servicePublishDTO.getModelId();
- String key = "Model_" + modelId;
-
-
-
+ //todo 调用模型部署
try {
+ // 新增传递apiUrl参数
nacosServiceUtil.registerService(
servicePublishDTO.getModelId().toString(),
servicePublishDTO.getIp(),
- 8080
+ 8080,
+ servicePublishDTO.getApiUrl()
);
log.info("Nacos服务注册成功");
} catch (Exception e) {
diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/util/NacosServiceUtil.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/util/NacosServiceUtil.java
index 53861a1..bc1a665 100644
--- a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/util/NacosServiceUtil.java
+++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/util/NacosServiceUtil.java
@@ -6,16 +6,37 @@ import com.alibaba.nacos.api.naming.pojo.Instance;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
@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 {
+ public void registerService(String serviceName, String ip, int port, String url) throws Exception { // 新增url参数
NamingService naming = NamingFactory.createNamingService(nacosServerAddr);
Instance instance = new Instance();
instance.setIp(ip);
instance.setPort(port);
+ // 添加元数据存储URL
+ Map metadata = new HashMap<>();
+ metadata.put("url", url); // 将URL存入元数据
+ instance.setMetadata(metadata);
naming.registerInstance(serviceName, instance);
}
+
+ /**
+ * 获取服务所有实例IP
+ */
+ public List getServiceInstances(String serviceName) throws Exception {
+ NamingService naming = NamingFactory.createNamingService(nacosServerAddr);
+ List instances = naming.getAllInstances(serviceName);
+ return instances.stream()
+ .map(Instance::getIp)
+ .collect(Collectors.toList());
+ }
}
\ No newline at end of file
From 5692cca3e73610a5c4d1d952c649f68a45dc4405 Mon Sep 17 00:00:00 2001
From: xiaohucoding <2307520758@qq.com>
Date: Sun, 25 May 2025 20:42:25 +0800
Subject: [PATCH 3/5] =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=8F=91=E5=B8=83?=
=?UTF-8?q?=EF=BC=88nacos=E7=89=88=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
doc/WorkReport/2025-05-hky.md | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/doc/WorkReport/2025-05-hky.md b/doc/WorkReport/2025-05-hky.md
index 7fc9fad..6744694 100644
--- a/doc/WorkReport/2025-05-hky.md
+++ b/doc/WorkReport/2025-05-hky.md
@@ -90,4 +90,17 @@ redis的服务器配置
### 📅 明日计划
完成拦截器功能
+## 2025年5月25日
+### ✅ 今日完成
+服务发布可注册到nacos上
+
+### 🚧 进行中
+拦截器开发
+
+### ⚠️ 问题/障碍
+模型api请求不知道是什么
+
+### 📅 明日计划
+开发拦截器功能
+
From 77fb43e95da2233fc8f92b7a1024227b92b061b5 Mon Sep 17 00:00:00 2001
From: xiaohucoding <2307520758@qq.com>
Date: Mon, 26 May 2025 21:49:13 +0800
Subject: [PATCH 4/5] =?UTF-8?q?=E8=B0=83=E5=BA=A6=E8=AF=B7=E6=B1=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 8 +-
...Controller.java => PublishController.java} | 38 ++--
.../controller/ServiceAPIController.java | 178 ++++++++++++++++++
.../mapper/PublishMapper.java | 3 +-
.../mapper/ServiceAPIMapper.java | 11 ++
.../service/Impl/PublishServiceImpl.java | 12 +-
.../service/Impl/ServiceAPIImpl.java | 23 +++
.../service/PublishService.java | 1 -
.../service/ServiceAPIService.java | 5 +
src/main/resources/application.properties | 8 +-
10 files changed, 259 insertions(+), 28 deletions(-)
rename src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/{publishController.java => PublishController.java} (57%)
create mode 100644 src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/ServiceAPIController.java
create mode 100644 src/main/java/com/bipt/intelligentapplicationorchestrationservice/mapper/ServiceAPIMapper.java
create mode 100644 src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/Impl/ServiceAPIImpl.java
create mode 100644 src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/ServiceAPIService.java
diff --git a/pom.xml b/pom.xml
index 7b91012..5aac308 100644
--- a/pom.xml
+++ b/pom.xml
@@ -51,10 +51,10 @@
org.springframework.boot
spring-boot-starter-jdbc
-
+
org.springframework.boot
spring-boot-starter-data-redis
@@ -100,6 +100,10 @@
org.springframework.cloud
spring-cloud-starter-bootstrap
+
+ org.springframework.cloud
+ spring-cloud-starter-gateway
+
diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/publishController.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/PublishController.java
similarity index 57%
rename from src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/publishController.java
rename to src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/PublishController.java
index ebfe15f..5cdf455 100644
--- a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/publishController.java
+++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/PublishController.java
@@ -11,17 +11,13 @@ import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
-import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
@Tag(name ="服务发布相关接口")
@RestController
@RequestMapping("/publish")
@Slf4j
-public class publishController {
+public class PublishController {
@Autowired
private PublishService publishService;
@@ -38,19 +34,35 @@ public class publishController {
publishService.save(servicePublishDTO);
//todo 调用模型部署
+ // 获取前端传来的IP字符串
+ String ipListStr = servicePublishDTO.getIp();
+ if (ipListStr == null || ipListStr.trim().isEmpty()) {
+ log.warn("IP列表为空,不进行Nacos注册");
+ return OptResult.success();
+ }
+
try {
- // 新增传递apiUrl参数
- nacosServiceUtil.registerService(
- servicePublishDTO.getModelId().toString(),
- servicePublishDTO.getIp(),
- 8080,
- servicePublishDTO.getApiUrl()
- );
- log.info("Nacos服务注册成功");
+ // 使用逗号分割IP字符串
+ String[] ipArray = ipListStr.split(",");
+ // 循环注册每个IP到Nacos
+ for (String ip : ipArray) {
+ String trimmedIp = ip.trim();
+ if (!trimmedIp.isEmpty()) {
+ nacosServiceUtil.registerService(
+ servicePublishDTO.getModelId().toString(),
+ trimmedIp,
+ 8080,
+ servicePublishDTO.getApiUrl()
+ );
+ log.info("Nacos服务注册成功: {}", trimmedIp);
+ }
+ }
} catch (Exception e) {
log.error("Nacos服务注册失败", e);
+ return OptResult.error("Nacos服务注册失败"); // 根据业务需求返回错误
}
+
return OptResult.success();
}
diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/ServiceAPIController.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/ServiceAPIController.java
new file mode 100644
index 0000000..f08513e
--- /dev/null
+++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/controller/ServiceAPIController.java
@@ -0,0 +1,178 @@
+package com.bipt.intelligentapplicationorchestrationservice.controller;
+
+
+import com.bipt.intelligentapplicationorchestrationservice.pojo.OptResult;
+import com.bipt.intelligentapplicationorchestrationservice.service.ServiceAPIService;
+import com.bipt.intelligentapplicationorchestrationservice.util.NacosServiceUtil;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.models.security.SecurityScheme;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+@Tag(name ="服务API相关接口")
+@RestController
+@RequestMapping("/API")
+@Slf4j
+public class ServiceAPIController {
+
+ @Autowired
+ private ServiceAPIService serviceAPIService;
+
+ @Autowired
+ private NacosServiceUtil nacosServiceUtil;
+
+ @Autowired
+ private RedisTemplate redisTemplate;
+ @PostMapping("/release")
+ @Operation(summary = "结束访问")
+ @Transactional
+ public OptResult releaseResource(@PathVariable Long modelId) {
+ String key = "modelId:" + modelId;
+ String modelConfig = (String) redisTemplate.opsForValue().get(key);
+ int userMemorySize = parseGpuMemorySize(modelConfig);
+ List instanceIps;
+ try {
+ instanceIps = nacosServiceUtil.getServiceInstances(modelId.toString());
+ } catch (Exception e) {
+ log.error("获取Nacos实例失败", e);
+ return OptResult.error("获取实例失败");
+ }
+ int memorySize;
+ for (String ip : instanceIps) {
+ String ipKey = "ip:" + ip;
+ Integer nowMemorySizeOBJ = (Integer) redisTemplate.opsForValue().get(ipKey);
+ int nowMemorySize = nowMemorySizeOBJ;
+ memorySize = nowMemorySize + userMemorySize;
+ // 更新IP对应的资源值
+ redisTemplate.opsForValue().set(ipKey, memorySize);
+ // 设置缓存过期时间(3600秒)
+ redisTemplate.expire(ipKey, 3600, TimeUnit.SECONDS);
+ }
+
+ // 处理等待队列(先来先服务)
+ String waitQueueKey = "waitQueue:" + modelId;
+ // 取出队列头部的任务(最早加入的)
+ Long waitModelId = (Long) redisTemplate.opsForList().leftPop(waitQueueKey);
+ if (waitModelId != null) {
+ log.info("检测到等待队列任务,尝试调度模型ID: {}", waitModelId);
+ return schedule(waitModelId); // 重新调度最早的任务
+ } else {
+ log.info("等待队列为空,无任务需要处理");
+ }
+
+ return OptResult.success("资源释放成功");
+ }
+
+ @PostMapping("/request")
+ @Operation(summary = "请求调度")
+ @Transactional
+ public OptResult schedule(@PathVariable Long modelId) {
+ // 1. 存储modelConfig到缓存
+ String modelConfig = serviceAPIService.getByModelId(modelId);
+ int requestMemorySize = parseGpuMemorySize(modelConfig);
+ String modelConfigKey = "modelConfig:" + modelId;
+ redisTemplate.opsForValue().set(modelConfigKey, modelConfig);
+ // 2. 获取Nacos实例IP列表
+ List instanceIps;
+ try {
+ instanceIps = nacosServiceUtil.getServiceInstances(modelId.toString());
+ } catch (Exception e) {
+ log.error("获取Nacos实例失败", e);
+ return OptResult.error("获取实例失败");
+ }
+ Set gpuKeys = redisTemplate.keys("gpu:*");
+ //根据IP列表查找资源
+ for (String instanceIp : instanceIps) {
+ for (String gpuKey : gpuKeys) {
+ String GPUConfig = (String) redisTemplate.opsForValue().get(gpuKey);
+ if (GPUConfig != null) {
+ // 分割键值对
+ String[] pairs = GPUConfig.split(",");
+ String ip = null;
+ int memorySize = 0;
+ for (String pair : pairs) {
+ String[] keyValue = pair.split(":", 2);
+ if (keyValue.length == 2) {
+ String key = keyValue[0].trim();
+ String value = keyValue[1].trim();
+ if ("IP".equalsIgnoreCase(key)) {
+ ip = value;
+ } else if ("GPUMemorySize".equalsIgnoreCase(key)) {
+ memorySize = Integer.parseInt(value);
+ }
+ }
+ }
+ // 检查解析出的 IP 是否在 Nacos 实例列表中
+ if (instanceIp.equals(ip)) {
+ log.info("找到 IP {} 对应的 GPU 内存: {} ", ip, memorySize);
+ if (memorySize>=requestMemorySize){
+ int newMemorySize = memorySize - requestMemorySize;
+ String ipKey = "ip:" + ip;
+ redisTemplate.opsForValue().set(ipKey,newMemorySize);
+ //访问请求最大时间为3600s
+ redisTemplate.expire(ipKey, 3600, TimeUnit.SECONDS);
+ }
+ return OptResult.success("资源分配成功,使用ip:" + ip);
+ }else {
+ log.info("资源不足");
+ }
+ }
+ }
+ }
+ // 所有实例检查完毕未找到足够资源
+ String waitQueueKey = "waitQueue:" + modelId;
+ // 改为右插入,保证队列顺序为FIFO(最早的任务在列表头部)
+ redisTemplate.opsForList().rightPush(waitQueueKey, modelId);
+ log.info("未找到足够资源,任务 {} 加入等待队列", modelId);
+ return OptResult.error("资源不足,等待中");
+ }
+ /**
+ * 从模型配置字符串中解析GPU内存需求
+ * @param modelConfig 模型配置字符串,格式如 "GPUMemorySize:8000,version:1"
+ * @return 解析到的GPU内存大小(MB),若解析失败返回-1
+ */
+ private int parseGpuMemorySize(String modelConfig) {
+ if (modelConfig == null || modelConfig.isEmpty()) {
+ log.error("模型配置为空,无法解析GPU内存需求");
+ return -1;
+ }
+ int requestMemorySize = 0;
+ String[] config = modelConfig.split(",");
+ for (String pair : config) {
+ // 按冒号分割键值对
+ String[] keyValue = pair.split(":", 2);
+ if (keyValue.length == 2) {
+ String key = keyValue[0].trim();
+ String value = keyValue[1].trim();
+ // 匹配 GPUMemorySize 字段(忽略大小写)
+ if ("GPUMemorySize".equalsIgnoreCase(key)) {
+ try {
+ requestMemorySize = Integer.parseInt(value);
+ log.info("模型GPU内存: {} MB", requestMemorySize);
+ break; // 找到后即可退出循环
+ } catch (NumberFormatException e) {
+ log.error("解析GPUMemorySize失败,值: {}", value, e);
+ return -1;
+ }
+ }
+ }
+ }
+ if (requestMemorySize <= 0) {
+ log.error("模型需求GPU内存未配置或无效");
+ return -1;
+ }
+ return requestMemorySize;
+ }
+
+}
diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/mapper/PublishMapper.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/mapper/PublishMapper.java
index 5582b45..38c48a6 100644
--- a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/mapper/PublishMapper.java
+++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/mapper/PublishMapper.java
@@ -14,7 +14,6 @@ public interface PublishMapper {
void insert(ServicePublishDTO servicePublishDTO);
Long getByApiUrl(String apiUrl);
- @Select("select model_config from model_version where model_id=#{modelId} and status = 1")
- String getById(Long modelId);
+
}
diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/mapper/ServiceAPIMapper.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/mapper/ServiceAPIMapper.java
new file mode 100644
index 0000000..c27b445
--- /dev/null
+++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/mapper/ServiceAPIMapper.java
@@ -0,0 +1,11 @@
+package com.bipt.intelligentapplicationorchestrationservice.mapper;
+
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+
+@Mapper
+public interface ServiceAPIMapper {
+ @Select("select model_config from model_version where model_id=#{modelId} and status = 1")
+ String getById(Long modelId);
+}
diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/Impl/PublishServiceImpl.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/Impl/PublishServiceImpl.java
index 52b422a..4788340 100644
--- a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/Impl/PublishServiceImpl.java
+++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/Impl/PublishServiceImpl.java
@@ -29,18 +29,12 @@ public class PublishServiceImpl implements PublishService {
if (id != null){
throw new IllegalArgumentException("请求已存在: " + apiUrl);
}
+
+ //todo调用服务部署
+
publishMapper.insert(servicePublishDTO);
}
- /**
- * 根据id查找配置信息
- * @param modelId
- * @return
- */
- @Override
- public String getByModelId(Long modelId) {
- return publishMapper.getById(modelId);
- }
}
diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/Impl/ServiceAPIImpl.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/Impl/ServiceAPIImpl.java
new file mode 100644
index 0000000..b2a0d54
--- /dev/null
+++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/Impl/ServiceAPIImpl.java
@@ -0,0 +1,23 @@
+package com.bipt.intelligentapplicationorchestrationservice.service.Impl;
+
+import com.bipt.intelligentapplicationorchestrationservice.mapper.ServiceAPIMapper;
+import com.bipt.intelligentapplicationorchestrationservice.service.ServiceAPIService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+@Slf4j
+public class ServiceAPIImpl implements ServiceAPIService {
+ @Autowired
+ private ServiceAPIMapper serviceAPIMapper;
+ /**
+ * 根据id查找配置信息
+ * @param modelId
+ * @return
+ */
+ @Override
+ public String getByModelId(Long modelId) {
+ return serviceAPIMapper.getById(modelId);
+ };
+}
diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/PublishService.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/PublishService.java
index 4d3b410..851891f 100644
--- a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/PublishService.java
+++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/PublishService.java
@@ -9,5 +9,4 @@ public interface PublishService {
- String getByModelId(Long modelId);
}
diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/ServiceAPIService.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/ServiceAPIService.java
new file mode 100644
index 0000000..4c95bb4
--- /dev/null
+++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/service/ServiceAPIService.java
@@ -0,0 +1,5 @@
+package com.bipt.intelligentapplicationorchestrationservice.service;
+
+public interface ServiceAPIService {
+ String getByModelId(Long modelId);
+}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index d8ff972..aa70b38 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -18,4 +18,10 @@ spring.data.redis.host=116.205.121.200
spring.data.redis.port=6379
spring.data.redis.password=Jbjhhzstsl97@
spring.data.redis.database=0
-spring.data.redis.timeout=3000
\ No newline at end of file
+spring.data.redis.timeout=3000
+
+# 服务路由配置
+spring.cloud.gateway.routes[0].id=request-service-route
+spring.cloud.gateway.routes[0].uri=lb://intelligent-application-orchestration-service
+spring.cloud.gateway.routes[0].predicates[0]=Path=/request
+
From 2aaf3d96f05f5c2bfdcf96497afb5697765affeb Mon Sep 17 00:00:00 2001
From: xiaohucoding <2307520758@qq.com>
Date: Mon, 26 May 2025 21:50:27 +0800
Subject: [PATCH 5/5] =?UTF-8?q?=E5=85=A8=E5=B1=80=E6=8B=A6=E6=88=AA?=
=?UTF-8?q?=E5=99=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../filter/ApiRequestGlobalFilter.java | 36 +++++++++++++++++++
1 file changed, 36 insertions(+)
create mode 100644 src/main/java/com/bipt/intelligentapplicationorchestrationservice/filter/ApiRequestGlobalFilter.java
diff --git a/src/main/java/com/bipt/intelligentapplicationorchestrationservice/filter/ApiRequestGlobalFilter.java b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/filter/ApiRequestGlobalFilter.java
new file mode 100644
index 0000000..41eb59c
--- /dev/null
+++ b/src/main/java/com/bipt/intelligentapplicationorchestrationservice/filter/ApiRequestGlobalFilter.java
@@ -0,0 +1,36 @@
+package com.bipt.intelligentapplicationorchestrationservice.filter;
+
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.core.Ordered;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.stereotype.Component;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+@Component
+public class ApiRequestGlobalFilter implements GlobalFilter, Ordered {
+
+ @Override
+ public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+ ServerHttpRequest request = exchange.getRequest();
+
+ // 检查请求路径和方法
+ if (request.getURI().getPath().equals("/request") &&
+ request.getMethod() == HttpMethod.POST) {
+
+ // 在此处添加拦截逻辑
+ System.out.println("拦截到POST /request请求");
+
+ }
+
+ // 继续处理请求
+ return chain.filter(exchange);
+ }
+
+ @Override
+ public int getOrder() {
+ return 1; // 过滤器执行顺序,数值越小越先执行
+ }
+}
\ No newline at end of file