Skip to content

feat: 批量导出配置文件#236

Merged
heqingpan merged 2 commits intonacos-group:masterfrom
a981008:feature/download_config_by_keys
Jul 6, 2025
Merged

feat: 批量导出配置文件#236
heqingpan merged 2 commits intonacos-group:masterfrom
a981008:feature/download_config_by_keys

Conversation

@a981008
Copy link
Copy Markdown
Contributor

@a981008 a981008 commented Jun 30, 2025

新增 POST console/config/download 接口,根据 tenant + group + dataId 导出对应的配置文件
前端 PR r-nacos/rnacos-console-web#37
Refs #212

@lingma-agents
Copy link
Copy Markdown

lingma-agents Bot commented Jun 30, 2025

新增批量导出配置文件功能及权限配置调整

变更概述

新功能

  • 新增 POST /rnacos/api/console/config/download 接口,支持通过 tenantgroupdataId 批量导出配置文件:
    • 后端通过 ConfigActorget_config_info_by_keys 方法从缓存批量获取配置信息
    • 使用 ZipWriter 将多个配置文件打包为 ZIP 格式返回
    • 前端参数通过 ConfigKeyParam 结构体传递(包含租户、分组、数据ID)

重构

  • common/constant.rs 移除了未使用的 HTTP 方法常量注释,保留核心方法定义
  • console/api.rs 整合了 /config/download 路由配置,统一管理 GET/POST 方法

配置调整

  • user/permission.rs 新增对 /rnacos/api/console/config/download POST 方法的权限控制
  • config/core.rs 引入 ConfigKeyParam 结构体类型依赖,提升类型安全

其他

  • 修复 config_api.rs 中重复的 HTTP 方法定义冲突
  • 优化 ZIP 文件生成逻辑,确保临时文件正确关闭
变更文件
文件路径 变更说明
src/common/constant.rs 新增 HTTP POST 方法常量定义,移除未使用的 HTTP 方法注释
src/config/core.rs 新增批量查询配置信息方法及命令处理逻辑
src/console/api.rs 添加 POST 路由支持并整合下载接口配置
src/console/config_api.rs 实现批量导出 ZIP 文件的处理逻辑
src/​console/​model/​config_​model.​rs 新增 ConfigKeyParam 数据结构定义
src/user/permission.rs 增加 POST 方法的接口权限配置
时序图
sequenceDiagram
    participant CR as Console Router
    participant CA as ConfigActor
    participant CW as ConfigWriter
    Frontend->>CR: POST /config/download (keys)
    CR->>CA: QueryInfoByKeys command
    CA->>CA: get_config_info_by_keys()
    CA-->>CR: ConfigInfoDto list
    CR->>CW: Create ZIP package
    CW-->>Frontend: ZIP file response
Loading

💡 小贴士

与 lingma-agents 交流的方式

📜 直接回复评论
直接回复本条评论,lingma-agents 将自动处理您的请求。例如:

  • 在当前代码中添加详细的注释说明。

  • 请详细介绍一下你说的 LRU 改造方案,并使用伪代码加以说明。

📜 在代码行处标记
在文件的特定位置创建评论并 @lingma-agents。例如:

  • @lingma-agents 分析这个方法的性能瓶颈并提供优化建议。

  • @lingma-agents 对这个方法生成优化代码。

📜 在讨论中提问
在任何讨论中 @lingma-agents 来获取帮助。例如:

  • @lingma-agents 请总结上述讨论并提出解决方案。

  • @lingma-agents 请根据讨论内容生成优化代码。

Copy link
Copy Markdown

@lingma-agents lingma-agents Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔎 代码评审报告

🎯 评审意见概览
严重度 数量 说明
🔴 Blocker 1 阻断性问题,需立即修复。例如:系统崩溃、关键功能不可用或严重安全漏洞。
🟠 Critical 1 严重问题,高优先级修复。例如:核心功能异常或性能瓶颈影响用户体验。
🟡 Major 0 主要问题,建议修复。例如:非核心功能缺陷或代码维护性较差。
🟢 Minor 0 次要问题,酬情优化。例如:代码格式不规范或注释缺失。

总计: 2 个问题

⚠️ 需要立即关注的阻断性问题

src/config/core.rs

📋 评审意见详情
💡 代码实现建议
以下是文件级别的代码建议,聚焦于代码的可读性、可维护性和潜在问题。
🦀 src/config/core.rs (1 💬)
🦀 src/console/config_api.rs (1 💬)
🚀 架构设计建议
以下是对代码架构和设计的综合分析,聚焦于跨文件交互、系统一致性和潜在优化空间。
🔍1. 跨文件HTTP方法配置不一致可能导致权限漏洞

在common/constant.rs中删除了HTTP_METHOD_DELETE常量,但在user/permission.rs中新增了POST方法的路径权限配置。需要确认所有HTTP方法常量在权限模块中是否完整覆盖,是否存在未被保护的HTTP方法路径。例如删除操作的权限配置是否被遗漏,可能导致未授权访问风险。

📌 关键代码

pub const HTTP_METHOD_POST: &str = "POST";
// pub const HTTP_METHOD_DELETE:&str= "DELETE";
R::Path("/rnacos/api/console/config/download",HTTP_METHOD_POST),

⚠️ 潜在风险

若HTTP_METHOD_DELETE等常量被移除但未同步更新权限配置,可能导致未授权访问删除接口,或新增接口未正确限制方法类型

🔍2. 批量导出功能存在潜在内存泄漏风险

在src/console/config_api.rs的download_config_by_keys函数中,使用tempfile创建临时文件后,未明确调用drop或close操作。虽然seek和read_to_end会消耗文件内容,但未确保文件句柄正确释放,可能在高并发场景下导致文件描述符泄漏。

📌 关键代码

let mut tmpfile: File = tempfile::tempfile().unwrap();
{
    ...
}
tmpfile.seek(...)

⚠️ 潜在风险

长时间运行的服务可能发生文件句柄泄漏,导致系统资源耗尽或无法删除临时文件

🔍3. 批量查询缓存访问未考虑并发竞争

在src/config/core.rs的get_config_info_by_keys方法中,直接通过self.cache.get()访问缓存,但未说明缓存的并发访问机制。若配置项在查询期间被其他线程修改,可能导致数据不一致或缓存击穿问题。

📌 关键代码

if let Some(value) = self.cache.get(&key) {

⚠️ 潜在风险

高并发场景下可能出现脏读或缓存雪崩,影响系统稳定性

🔍4. ZIP文件生成逻辑存在重复代码

src/console/config_api.rs中的download_config和download_config_by_keys两个函数都包含ZIP文件生成逻辑,但未提取公共方法。这会导致代码维护困难,当需要修改压缩策略时需同步修改多处代码。

📌 关键代码

zip_file(zip, list).ok();
(...)

⚠️ 潜在风险

违反DRY原则,增加维护成本和潜在逻辑不一致风险

🔍5. 批量导出接口缺乏参数校验机制

在download_config_by_keys接口中仅校验keys是否为空,但未对单个ConfigKeyParam参数进行有效性验证(如租户/分组/数据ID格式)。若接受非法参数可能引发内部错误或越权访问。

📌 关键代码

if keys.is_empty() {
    return HttpResponse::BadRequest().body("keys cannot be empty");
}

⚠️ 潜在风险

可能导致无效参数引发服务端错误,或越权访问其他用户的配置数据

审查详情
📒 文件清单 (6 个文件)
📝 变更: 6 个文件

📝 变更文件:

  • src/common/constant.rs
  • src/config/core.rs
  • src/console/api.rs
  • src/console/config_api.rs
  • src/console/model/config_model.rs
  • src/user/permission.rs

💡 小贴士

与 lingma-agents 交流的方式

📜 直接回复评论
直接回复本条评论,lingma-agents 将自动处理您的请求。例如:

  • 在当前代码中添加详细的注释说明。

  • 请详细介绍一下你说的 LRU 改造方案,并使用伪代码加以说明。

📜 在代码行处标记
在文件的特定位置创建评论并 @lingma-agents。例如:

  • @lingma-agents 分析这个方法的性能瓶颈并提供优化建议。

  • @lingma-agents 对这个方法生成优化代码。

📜 在讨论中提问
在任何讨论中 @lingma-agents 来获取帮助。例如:

  • @lingma-agents 请总结上述讨论并提出解决方案。

  • @lingma-agents 请根据讨论内容生成优化代码。

Comment thread src/config/core.rs
Comment on lines +912 to +913
.into_actor(self)
.map(|r, _act, _ctx| r);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

修正Actor消息处理语法错误

🔴 Blocker | 🐞 Bugs

📋 问题详情

在ConfigActor的消息处理逻辑中,.into_actor(self).map(...)的代码块缩进存在语法问题,可能导致编译失败。

💡 解决方案

修正语法错误:

+    .into_actor(self)
+    .map(|r, _act, _ctx| r);
-            .into_actor(self)
-            .map(|r, _act, _ctx| r);

确保代码块与前序代码正确缩进对齐


您的反馈对我们很重要!(建议右键在新标签页中打开以下链接)

有用意见👍无用意见👎错误意见❌

Comment thread src/console/config_api.rs
Comment on lines +248 to +252
{
let write = std::io::Write::by_ref(&mut tmpfile);
let zip = ZipWriter::new(write);
zip_file(zip, list).ok();
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

改进错误处理避免panic

🟠 Critical | 🐞 Bugs

📋 问题详情

在download_config_by_keys函数中,tempfile::tempfile().unwrap()的错误未被处理,可能导致程序panic。此外,zip_file(zip, list).ok()会忽略压缩失败的错误,无法正确反馈错误信息。

💡 解决方案

改进错误处理:

- let mut tmpfile: File = tempfile::tempfile().unwrap();
+ let mut tmpfile = match tempfile::tempfile() {
+     Ok(f) => f,
+     Err(e) => return HttpResponse::InternalServerError().body(e.to_string()),
+ };

修改建议:
1. 使用match处理临时文件创建失败
2. 将zip_file的错误返回给客户端
3. 优化ZipWriter的生命周期管理

您的反馈对我们很重要!(建议右键在新标签页中打开以下链接)

有用意见👍无用意见👎错误意见❌

@heqingpan heqingpan merged commit 1b829ae into nacos-group:master Jul 6, 2025
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants