This commit is contained in:
2025-11-14 12:11:44 +08:00
commit 39ebf61572
88 changed files with 9999 additions and 0 deletions

View File

@@ -0,0 +1,26 @@
# Research: HTTP 服务与单仓代理
## Host → Hub 路由策略
- **Decision**: 使用 Fiber 自定义中间件读取 `Host` Header 与监听端口,查询预构建的 `HubRegistry`,命中才放行,未命中返回 404 并记录 `host_unmapped`
- **Rationale**: 保持单一入口、避免误路由带来安全风险,同时兼容将来多 Hub 扩展。
- **Alternatives considered**: 依赖 Fiber 原生多 App导致重复配置/资源浪费);将未知 Host 回退到默认 Hub难以追踪错误
## 缓存与条件回源
- **Decision**: 采用磁盘文件 + `.meta` 元数据,写入时使用临时文件 + rename记录 `ETag/Last-Modified/StoredAt`,并在重验证时携带 `If-None-Match`/`If-Modified-Since`
- **Rationale**: 磁盘缓存简单可靠,临时文件避免半写入;条件请求可显著降低带宽,满足 SC-001/SC-004。
- **Alternatives considered**: 内存缓存(受限于 256MB数据库存储超出 Phase 1 范畴)。
## 上游 HTTP 客户端
- **Decision**: 共享 `http.Client`,启用 `Transport` 连接复用、超时/Proxy/Retry 设置来自 config`internal/proxy/upstream.go` 中封装请求构造。
- **Rationale**: 避免为每个请求重建 client提高吞吐并可统一超时复用 config 中 Proxy 设定。
- **Alternatives considered**: 每 Hub 创建独立 client增加内存占用、第三方 HTTP 库(违背依赖约束)。
## 示例仓库选择
- **Decision**: 默认提供 Docker Hub 示例manifest + layer和 NPM 示例package metadata在 quickstart 中支持切换到本地 fake upstreamtests/integration/stub
- **Rationale**: Docker/NPM 覆盖二进制/JSON 两类典型仓库fake upstream 便于离线/CI满足 spec 对示例的要求。
- **Alternatives considered**: 只做 Docker覆盖面不足、引入真实 registry 模拟器(复杂度高)。
## 观测性与性能指标
- **Decision**: 在 proxy handler 中记录 `hub`, `domain`, `cache_hit`, `upstream_status`, `elapsed_ms`; 通过 `logrus.WithFields` 输出 JSON同时统计请求计数后续可暴露 metrics
- **Rationale**: 满足 FR-006 / SC-001/002方便后续扩展 metricsJSON 便于日志采集。
- **Alternatives considered**: 文本日志(难以机器解析);延迟到未来阶段再实现(不符成功标准)。