UVHTTP 路线图
愿景
一个轻量级、生产级的 C 语言 HTTP/1.1 服务器库 —— 应用与 libuv 之间没有任何隐藏的抽象层。
职责边界
本库刻意不负责的事。每一条都经过评估后排除;协议类决策的理由记录在 PHILOSOPHY。
| 关注点 | 不在本库范围内的原因 |
|---|---|
| HTTP/2 | 多路复用与 libuv「每连接透明复用」的事件模型不兼容 |
| HTTP/3(QUIC) | 需要完全不同的传输层,超出轻量级 C 库的范围 |
| IPv6 监听 | 网关 / 网络栈职责。客户端侧 IPv6 地址提取已支持 |
| YAML/JSON 配置文件 | 嵌入本库的框架或应用自行拥有其配置格式 |
| 每用户 / 每 IP 限流 | 网关 / 反向代理职责。全局令牌桶 + 白名单已提供 |
| 可观测性(指标、追踪、仪表盘) | Prometheus / OpenTelemetry 的领域 |
| 认证、DDoS 防护、证书管理 | 网关 / 安全层职责 |
| 插件系统、微服务、云原生、serverless | 基础设施。能力需求由编译期裁剪(27 个 CMake 选项)覆盖 |
| 热重载 | 进程 / 监管者职责 |
当前状态(v2.9.1)
已交付
- HTTP/1.1 —— CI runner 上约 85K RPS(配对门禁实测)
- WebSocket —— 全双工、RFC 6455、带心跳的 Ping/Pong
- TLS 1.2/1.3 —— 经 mbedtls,含会话缓存(2048 条目 / 24h)
- 静态文件 ——
sendfile零拷贝 + 分块回退;路径解析经 fuzz 验证 - gzip 压缩 + LRU 缓存
- 限流 —— 全局令牌桶 + 白名单
- 中间件 —— 编译期实现,零运行时开销
- 32 位嵌入式支持
- 27 个编译期选项用于能力裁剪
质量基础设施
- 102 个单元测试,全绿
- 每个 PR 跑 ASan 门禁;UBSan、压力测试与覆盖率夜间跑
- 4 个 libFuzzer harness(router / request / websocket / static-path)
- 同 runner 配对性能门禁:head vs base,10% 阈值,fail-closed
- cppcheck 静态分析,零告警
- CI
GITHUB_TOKEN最小化为contents: read
待办工作
真实缺口,按价值排序。
性能
- [ ] 连接池优化
- [ ] 每请求内存占用降低
- [ ] 热路径 CPU 效率
开发者体验
- [ ] 日志框架增强(结构化级别、可插拔输出)
- [ ] API 参考补全
文档
- [ ] 架构图
- [ ] 性能调优指南
平台 —— 无排期,按需
- [ ] macOS
- [ ] FreeBSD
技术栈
| 层 | 选型 |
|---|---|
| 核心 | C99、libuv 1.52、llhttp |
| TLS | mbedtls |
| 内存 | mimalloc(可选) |
| 哈希 | xxHash |
| JSON | cJSON(可选) |
| 测试 | Google Test、libFuzzer |
实测性能
取自配对门禁(同 runner,head vs base,10 轮交替测量):
| 端点 | RPS | 说明 |
|---|---|---|
/ | 约 85K | 内存响应 |
/json | 约 85K | JSON 序列化 |
/large | 约 9.6K | 100KB body |
绝对值在共享 runner 上跨 run 漂移约 40%,因此只有配对比值有意义。门禁在配对比值中位数低于 90% 且多数单轮配对也低于 90% 时判失败 —— 绝对 RPS 阈值 gate 的是机器运气而非代码。