feat: simplify HTTP client proxy pools and authenticated JSON calls
This commit is contained in:
47
reports/httpcAcceptance.md
Normal file
47
reports/httpcAcceptance.md
Normal file
@@ -0,0 +1,47 @@
|
||||
# v0.21 httpc 验收(2026-09-26)
|
||||
|
||||
目标:让普通项目直接配置代理、连接阶段与空闲池参数,带请求头完成有界 JSON 调用,同时保留标准 Do/Transport 扩展。没有加入业务服务规则,也没有修改业务项目或在线服务器。
|
||||
|
||||
## 功能与安全验证
|
||||
|
||||
- 代理:独立子进程验证环境代理缓存、默认/显式 environment、NO_PROXY;本地代理与本地目标验证固定代理/直连。配置错误不回显凭证。
|
||||
- Transport:克隆池与进程默认池互不修改;可配置建连/keepalive/握手/响应头/100-continue/空闲参数,保留 TLS 证书验证。借用 Transport 不修改、不关闭,混合配置明确失败,typed nil 拒绝。
|
||||
- 实际 socket:慢 TLS 握手、慢响应头、超时后恢复、12 并发下最多 2 条 HTTP/1.1 连接、空闲回收与关闭后的连接释放。
|
||||
- 请求选项:24 个并发调用的认证头独立;WithHeaders 快照源 map、多值头与大小写规范化,重试不丢头,控制字符/分帧头拒绝,错误不会带 Token。
|
||||
- JSON:单次响应限额不影响其他请求,已知/未知长度、chunked、自动 gzip 解压后的限制、空成功体、多 JSON 文档、状态错误、调用后关闭。
|
||||
- 错误响应:已知小体复用连接;读取大小有上限;已知但缓慢的错误体最多花 25ms 尝试读取(标准 Transport 遵守 context),未知流直接关闭,不等完整 body。
|
||||
- 生命周期:Close 不中断已开始的调用,拒绝新调用;借用 Transport 生命周期保持项目所有。既有重试、总超时、请求 body 拒绝时关闭、重定向不跟随测试保留。
|
||||
- 日志不含 URL 路径、查询、URL 密码、Authorization 或响应体;标准返回的 URL 错误不承诺自动脱敏,项目应自行选择安全日志字段。
|
||||
|
||||
全量 `GO_OMNI_SCAFFOLD_INTEGRATION=1 go test -race ./...`:48 个测试包通过,包含实际生成项目回归。另验证 Go 1.22.12 的 httpc/示例、vet、build 与 managedService 生成检查。没有改动生成模板的兼容门槛;CLI 当前版本与最低模板版本分开,v0.20 的生成能力保持兼容。
|
||||
|
||||
请求头 Fuzz:30s / 4 worker,1104189 次执行,无失败,总收尾时间 31.293s。模糊输入上限 8 KiB,验证被接受的头可以由标准 Request writer 序列化;不等同形式化安全证明。
|
||||
|
||||
## 本机性能对比
|
||||
|
||||
Go 1.27.1 / darwin arm64 / Apple M2 Max,关闭请求日志;每项 500ms,三轮取中位数。基线源代码为 `068e85132f74edccb7657629b162505d038154f7`(v0.20 发布后文档提交),使用相同的基准函数。
|
||||
|
||||
前七项使用内存 RoundTripper 测量包装/JSON 开销;Pool 项使用本地 TCP 服务;Headers 项是新增选项。原始记录:[修改前](httpcBaselineBenchmark.txt)、[修改后](httpcBenchmark.txt)。列内单位依次为 ns/op、B/op、allocs/op。
|
||||
|
||||
| 场景 | 修改前 | 修改后 |
|
||||
| --- | ---: | ---: |
|
||||
| Client/128B/decode | 1681 / 2861 / 25 | 1408 / 2348 / 22 |
|
||||
| Client/128B/discard | 1226 / 2856 / 25 | 1070 / 1836 / 21 |
|
||||
| Client/4KiB/decode | 7590 / 17599 / 34 | 7650 / 17085 / 31 |
|
||||
| Client/4KiB/discard | 2775 / 13480 / 33 | 1130 / 1836 / 21 |
|
||||
| Client/64KiB/decode | 82261 / 214437 / 41 | 83673 / 213925 / 38 |
|
||||
| Client/64KiB/discard | 17397 / 148648 / 40 | 2285 / 1836 / 21 |
|
||||
| Client/Do | 843.6 / 1808 / 20 | 712.1 / 1296 / 17 |
|
||||
| Pool/OK | 39726 / 7338 / 79 | 39598 / 6372 / 75 |
|
||||
| Pool/Unauthorized | 42912 / 7333 / 83 | 41195 / 6503 / 77 |
|
||||
| Headers | 新增能力 | 1761 / 3059 / 30 |
|
||||
|
||||
64 KiB discard 的分配从约 149 KB 降到 1.8 KB,不再为丢弃响应整体 ReadAll;普通 Do 少一次请求复制,也不在成功路径计算退避。大 JSON 解码耗时基本持平(4 KiB 约 +0.8%,64 KiB 约 +1.7%),分配略减;本轮没有更换 JSON 实现,也不宣称每个场景都更快。Headers 有独立快照/请求复制成本,见新增场景。
|
||||
|
||||
这些数字不是公网吞吐、冷 DNS、TLS 建连或高压容量承诺。连接容量与超时用确定性本地场景验证,未对线上资源施压。
|
||||
|
||||
## 兼容与使用
|
||||
|
||||
原 JSON 直接调用保持有效;自定义 interface/函数值中的 JSON 方法签名须补 variadic RequestOption。过去自定义 Transport 下被忽略的 MaxConnsPerHost,现在与其他代理/阶段选项一起明确拒绝混配;应配置借用 Transport 本身。
|
||||
|
||||
无新增第三方依赖。出站实现仍是标准 net/http,Do/Transport 保持通用扩展;HTTP 状态与业务响应码由调用项目解释。完整 [httpc 指南](../httpc/README.md)、[运行示例](../examples/httpClient/README.md)。远程固定版本安装验证在发布后追加。
|
||||
33
reports/httpcBaselineBenchmark.txt
Normal file
33
reports/httpcBaselineBenchmark.txt
Normal file
@@ -0,0 +1,33 @@
|
||||
goos: darwin
|
||||
goarch: arm64
|
||||
pkg: git.yuntuo.hk/k2safe/go-omni/httpc
|
||||
cpu: Apple M2 Max
|
||||
BenchmarkHTTPClient/128B/decode-12 386178 2005 ns/op 2861 B/op 25 allocs/op
|
||||
BenchmarkHTTPClient/128B/decode-12 382789 1681 ns/op 2861 B/op 25 allocs/op
|
||||
BenchmarkHTTPClient/128B/decode-12 374196 1561 ns/op 2861 B/op 25 allocs/op
|
||||
BenchmarkHTTPClient/128B/discard-12 453388 1243 ns/op 2856 B/op 25 allocs/op
|
||||
BenchmarkHTTPClient/128B/discard-12 512002 1226 ns/op 2856 B/op 25 allocs/op
|
||||
BenchmarkHTTPClient/128B/discard-12 511116 1221 ns/op 2856 B/op 25 allocs/op
|
||||
BenchmarkHTTPClient/4KiB/decode-12 79958 7905 ns/op 17599 B/op 34 allocs/op
|
||||
BenchmarkHTTPClient/4KiB/decode-12 82110 7590 ns/op 17599 B/op 34 allocs/op
|
||||
BenchmarkHTTPClient/4KiB/decode-12 81975 7333 ns/op 17598 B/op 34 allocs/op
|
||||
BenchmarkHTTPClient/4KiB/discard-12 234456 2796 ns/op 13480 B/op 33 allocs/op
|
||||
BenchmarkHTTPClient/4KiB/discard-12 216720 2764 ns/op 13480 B/op 33 allocs/op
|
||||
BenchmarkHTTPClient/4KiB/discard-12 225117 2775 ns/op 13480 B/op 33 allocs/op
|
||||
BenchmarkHTTPClient/64KiB/decode-12 7014 82261 ns/op 214441 B/op 41 allocs/op
|
||||
BenchmarkHTTPClient/64KiB/decode-12 7381 82513 ns/op 214437 B/op 41 allocs/op
|
||||
BenchmarkHTTPClient/64KiB/decode-12 7546 81872 ns/op 214430 B/op 41 allocs/op
|
||||
BenchmarkHTTPClient/64KiB/discard-12 36520 17397 ns/op 148648 B/op 40 allocs/op
|
||||
BenchmarkHTTPClient/64KiB/discard-12 35896 17424 ns/op 148649 B/op 40 allocs/op
|
||||
BenchmarkHTTPClient/64KiB/discard-12 33877 17195 ns/op 148648 B/op 40 allocs/op
|
||||
BenchmarkHTTPClient/Do-12 640717 846.8 ns/op 1808 B/op 20 allocs/op
|
||||
BenchmarkHTTPClient/Do-12 738248 843.6 ns/op 1808 B/op 20 allocs/op
|
||||
BenchmarkHTTPClient/Do-12 695224 830.3 ns/op 1808 B/op 20 allocs/op
|
||||
BenchmarkHTTPPool/OK-12 15036 40489 ns/op 7338 B/op 79 allocs/op
|
||||
BenchmarkHTTPPool/OK-12 15148 39087 ns/op 7337 B/op 79 allocs/op
|
||||
BenchmarkHTTPPool/OK-12 14715 39726 ns/op 7338 B/op 79 allocs/op
|
||||
BenchmarkHTTPPool/Unauthorized-12 13894 42471 ns/op 7333 B/op 83 allocs/op
|
||||
BenchmarkHTTPPool/Unauthorized-12 14020 43046 ns/op 7351 B/op 83 allocs/op
|
||||
BenchmarkHTTPPool/Unauthorized-12 13992 42912 ns/op 7328 B/op 83 allocs/op
|
||||
PASS
|
||||
ok git.yuntuo.hk/k2safe/go-omni/httpc 20.475s
|
||||
36
reports/httpcBenchmark.txt
Normal file
36
reports/httpcBenchmark.txt
Normal file
@@ -0,0 +1,36 @@
|
||||
goos: darwin
|
||||
goarch: arm64
|
||||
pkg: git.yuntuo.hk/k2safe/go-omni/httpc
|
||||
cpu: Apple M2 Max
|
||||
BenchmarkHTTPClient/128B/decode-12 403567 1408 ns/op 2348 B/op 22 allocs/op
|
||||
BenchmarkHTTPClient/128B/decode-12 462315 1400 ns/op 2348 B/op 22 allocs/op
|
||||
BenchmarkHTTPClient/128B/decode-12 416222 1427 ns/op 2348 B/op 22 allocs/op
|
||||
BenchmarkHTTPClient/128B/discard-12 595370 1041 ns/op 1837 B/op 21 allocs/op
|
||||
BenchmarkHTTPClient/128B/discard-12 583654 1070 ns/op 1836 B/op 21 allocs/op
|
||||
BenchmarkHTTPClient/128B/discard-12 550502 1086 ns/op 1836 B/op 21 allocs/op
|
||||
BenchmarkHTTPClient/4KiB/decode-12 77176 7547 ns/op 17084 B/op 31 allocs/op
|
||||
BenchmarkHTTPClient/4KiB/decode-12 81969 7677 ns/op 17085 B/op 31 allocs/op
|
||||
BenchmarkHTTPClient/4KiB/decode-12 77571 7650 ns/op 17087 B/op 31 allocs/op
|
||||
BenchmarkHTTPClient/4KiB/discard-12 544194 1132 ns/op 1836 B/op 21 allocs/op
|
||||
BenchmarkHTTPClient/4KiB/discard-12 539278 1128 ns/op 1836 B/op 21 allocs/op
|
||||
BenchmarkHTTPClient/4KiB/discard-12 522939 1130 ns/op 1836 B/op 21 allocs/op
|
||||
BenchmarkHTTPClient/64KiB/decode-12 6986 84111 ns/op 213930 B/op 38 allocs/op
|
||||
BenchmarkHTTPClient/64KiB/decode-12 7156 83673 ns/op 213925 B/op 38 allocs/op
|
||||
BenchmarkHTTPClient/64KiB/decode-12 7516 83041 ns/op 213921 B/op 38 allocs/op
|
||||
BenchmarkHTTPClient/64KiB/discard-12 270482 2285 ns/op 1836 B/op 21 allocs/op
|
||||
BenchmarkHTTPClient/64KiB/discard-12 253564 2259 ns/op 1835 B/op 21 allocs/op
|
||||
BenchmarkHTTPClient/64KiB/discard-12 254343 2290 ns/op 1836 B/op 21 allocs/op
|
||||
BenchmarkHTTPClient/Do-12 857305 713.4 ns/op 1296 B/op 17 allocs/op
|
||||
BenchmarkHTTPClient/Do-12 811660 712.1 ns/op 1296 B/op 17 allocs/op
|
||||
BenchmarkHTTPClient/Do-12 861867 708.3 ns/op 1296 B/op 17 allocs/op
|
||||
BenchmarkHTTPPool/OK-12 14582 40133 ns/op 6374 B/op 75 allocs/op
|
||||
BenchmarkHTTPPool/OK-12 15596 38152 ns/op 6372 B/op 75 allocs/op
|
||||
BenchmarkHTTPPool/OK-12 15513 39598 ns/op 6369 B/op 75 allocs/op
|
||||
BenchmarkHTTPPool/Unauthorized-12 14952 41483 ns/op 6503 B/op 77 allocs/op
|
||||
BenchmarkHTTPPool/Unauthorized-12 14442 40927 ns/op 6516 B/op 77 allocs/op
|
||||
BenchmarkHTTPPool/Unauthorized-12 14697 41195 ns/op 6498 B/op 77 allocs/op
|
||||
BenchmarkHTTPHeaders-12 319768 1761 ns/op 3059 B/op 30 allocs/op
|
||||
BenchmarkHTTPHeaders-12 334965 1731 ns/op 3059 B/op 30 allocs/op
|
||||
BenchmarkHTTPHeaders-12 348751 1774 ns/op 3059 B/op 30 allocs/op
|
||||
PASS
|
||||
ok git.yuntuo.hk/k2safe/go-omni/httpc 21.809s
|
||||
Reference in New Issue
Block a user