7.3 KiB
7.3 KiB
代理工具孵化记录
状态:孵化中 | 更新:2026-03-27
工具列表
| 工具 | 端口 | 状态 | 项目目录 |
|---|---|---|---|
| mysql-proxy | 3307 | 可用 | mysql-proxy |
| ssh-proxy | 3308 | 可用 | ssh-proxy |
| mongo-proxy | 3309 | 可用 | mongo-proxy |
| redis-proxy | 3310 | 可用 | redis-proxy |
新增功能
2026-03-24
-
redis-proxy (新工具)
- Redis HTTP 代理,会话复用
- 支持 run/get/set/del/keys/info
- CLI 模式 + HTTP API 双模式
- 连接: flux_dev
-
mongo-proxy (新工具)
- MongoDB HTTP 代理,会话复用
- 支持 find/insert/update/delete/aggregate/count
- CLI 模式 + HTTP API 双模式
- 连接: suke_dev, suke_pro
2026-03-21
-
ssh-proxy 断线重连 (P0)
- exec 方法检测到会话失效时自动清除并重连
- 修复 get_or_create_session TOCTOU 竞态条件
-
日志智能分级 (P1)
- 慢请求告警: >3s WARN, >10s ERROR
- 退出码识别: exitCode 0/1/-1 视为正常,>=2 或 127 标记 ERROR
- UTF-8 安全截断
-
服务器配置扩展 (P1)
- 新增 server1 (一号机)、server2 (二号机)、ai_sg (新加坡 AI 机器)
- 共 5 台服务器
-
代码优化 (P2)
- 移除未使用的 async-trait 依赖
- 用 time crate 替换 40 行手写日期计算
- 清理未使用字段
2026-03-20
- ssh-proxy russh 迁移 (P0)
- 从 ssh2 迁移到 russh,原生支持 ed25519 密钥
- 修复了 ed25519 认证失败问题
- 使用 async/await 原生 API
2026-03-19
-
请求日志 (P0)
- 设置环境变量启用:
MYSQL_PROXY_LOG/SSH_PROXY_LOG - 日志格式:JSON,每行一条记录
- 设置环境变量启用:
-
ssh-proxy CLI JSON 输出 (P1)
ssh-proxy exec -n flux_dev -c "docker ps" -F json -
ssh-proxy 动态添加服务器 (P2)
ssh-proxy add-server -n myserver -H 192.168.1.100 -u root -p password # 或 API curl -X POST http://127.0.0.1:3308/servers/add \ -H "Content-Type: application/json" \ -d '{"name":"myserver","host":"192.168.1.100","user":"root","password":"secret"}' -
API 错误友好提示
- 错误时返回
usage字段,引导正确使用
- 错误时返回
2026-03-18
- mysql-proxy 动态添加连接 API
- ssh-proxy Windows 路径修复
- ssh-proxy 读取错误日志修复
实测性能
| 操作 | 代理 | 直连 | 提升 |
|---|---|---|---|
| mysql 首次查询 | ~150ms | ~500ms | 3x |
| mysql 复用会话 | ~50ms | ~500ms | 10x |
| ssh 首次执行 | ~900ms | ~1500ms | 1.7x |
| ssh 复用会话 | ~100-200ms | ~1500ms | 7-15x |
AI 推荐使用方式
优先使用 CLI 模式,命令简洁
# MySQL 查询 (CLI 优先)
mysql-proxy cli -c flux_dev -e "SELECT VERSION()"
# MySQL JSON 输出
mysql-proxy cli -c flux_dev -e "SHOW TABLES" -F json
# MySQL 执行 DML
mysql-proxy cli -c flux_dev -e "UPDATE users SET status=1" -x
# SSH 执行 (CLI 优先)
ssh-proxy exec -n flux_dev -c "docker ps"
# SSH JSON 输出
ssh-proxy exec -n flux_dev -c "docker ps" -F json
# 列出服务器
ssh-proxy servers
mysql-proxy connections
HTTP API (复杂场景):
# MySQL
curl -X POST http://127.0.0.1:3307/query \
-H "Content-Type: application/json" \
-d '{"conn":"flux_dev","sql":"SELECT VERSION()"}'
# SSH
curl -X POST http://127.0.0.1:3308/exec \
-H "Content-Type: application/json" \
-d '{"server":"flux_dev","command":"docker ps"}'
降级方案 (代理不可用):
mysql -h<host> -u<user> -p<password> -D<database> -e "<SQL>"
ssh <user>@<host> "<command>"
优势:
- CLI 命令简洁,AI 友好
- JSON 格式输出,易于解析
- 会话复用,响应快
- 错误提示友好
代码审查 (2026-03-27)
12 维度并行审查:架构一致性、错误处理、安全性、性能、DRY、日志、配置管理、CLI 一致性、边界条件、依赖、资源清理、代码度量
必须修复
| # | 问题 | 文件 | 说明 | 状态 |
|---|---|---|---|---|
| 1 | .gitignore 未覆盖 mongo/redis 配置 | .gitignore |
含真实密码,随时可能被 git add 提交 |
✅ |
| 2 | Redis 密码无 URL 编码 | redis-proxy/src/config.rs |
密码含 @ : 时 URL 解析失败 |
✅ |
| 3 | mongo urlencoding 不完整 | mongo-proxy/src/config.rs |
只编码 5 字符,mysql 编码 19 字符 | ✅ |
| 4 | Redis 无重连机制 | redis-proxy/src/db.rs |
Redis 重启后持续失败 5 分钟直到 idle timeout | ✅ |
| 5 | mysql-proxy handler 阻塞 tokio runtime | mysql-proxy/src/handler.rs |
同步 DB 操作未用 spawn_blocking,阻塞 worker 线程 | ✅ |
| 6 | 全部失败路径无日志 | 所有 handler.rs (4 项目) | 约 36 个 map_err/?? 路径跳过 logger.log() | ✅ |
| 7 | with_error() 从未调用 | 所有 logger.rs (4 项目) | 错误日志 level 永远是 INFO | ✅ |
建议改进
| # | 问题 | 文件 | 说明 |
|---|---|---|---|
| 8 | get_conn TOCTOU 竞态 | mysql/mongo/redis db.rs |
释放锁后重建,可能重复创建连接 |
| 9 | mysql --config 占用 -c |
mysql-proxy/src/main.rs:22 |
与 --conn 冲突 |
| 10 | LogEntry 字段不一致 | 4 个 logger.rs |
server/sql/rows/exitCode 各有缺失 |
| 11 | logger.rs 等 ~300 行重复 | 4 个项目 | RequestLogger/LogEntry/辅助函数高度重复 |
| 12 | ssh-proxy 无 SSH disconnect | ssh-proxy/src/session.rs |
cleanup 只移除 HashMap 不发 disconnect |
| 13 | 无 graceful shutdown | 4 个 main.rs |
Ctrl+C 不等待进行中请求 |
| 14 | redis-proxy 降级提示单行 | redis-proxy/src/main.rs:52 |
其他 3 个用多行格式 |
| 15 | mongo-proxy JSON 模式打印耗时 | mongo-proxy/src/cli.rs:86 |
破坏 JSON 输出纯度 |
| 16 | redis-proxy 无 JSON 输出 | redis-proxy/src/cli.rs |
其他 3 个都支持 -F json |
| 17 | mongo insert/update 缺 usage 连接列表 | mongo-proxy/src/handler.rs:224,256 |
find/count 有但 insert/update 没有 |
| 18 | ssh-proxy 未使用 russh-keys 依赖 | ssh-proxy/Cargo.toml |
beta 版本,代码用 russh::keys |
| 19 | tokio features = ["full"] 过宽 | 4 个 Cargo.toml |
实际只需 rt-multi-thread/net/time/sync |
| 20 | 日志写入阻塞 tokio | 4 个 logger.rs |
同步 writeln 阻塞 worker 线程 |
代码度量
| 项目 | 行数 | 文件数 | 最长函数 | unwrap | clone | unsafe | |------|------|--------|---------|-------|-------| | mysql-proxy | 1,209 | 6 | query() 74行 | 10 | 18 | 0 | | ssh-proxy | 997 | 6 | exec() 49行 | 0 | 17 | 0 | | mongo-proxy | 1,422 | 6 | find() 38行 | 9 | 11 | 0 | | redis-proxy | 964 | 6 | run_cmd() 19行 | 10 | 30 | 0 | | 合计 | 4,592 | 24 | -- | 29 | 76 | 0 |
无 unsafe 代码,无 TODO/FIXME,嵌套深度最大 3 层,函数最长 74 行。代码质量良好。
已知问题
ssh-proxy
- 暂无 (ed25519 已支持)
mysql-proxy
- 暂无
待优化
- 提取 proxy-common 公共 crate (logger/config/error/cli 基础)
- HTTP API 认证机制 (当前仅依赖 127.0.0.1 绑定)
- SSH 主机密钥验证 (当前无条件信任)
- redis-proxy 改用 redis::aio::ConnectionManager (避免 spawn_blocking)
- 日志写入改为 channel + 后台线程 (避免阻塞 tokio)
- 统一 graceful shutdown (with_graceful_shutdown)
- .gitignore 补充 mongo/redis 配置文件
- redis/mongo URL 编码对齐 mysql