Files
any-hub/specs/002-fiber-single-proxy/research.md
2025-11-14 12:11:44 +08:00

27 lines
2.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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**: 文本日志(难以机器解析);延迟到未来阶段再实现(不符成功标准)。