全景
这一部分先回答「reqwest 比直接用下层多给了什么、多花了什么」,再把请求、连接、响应三条主线在本机上从头到尾各走一遍,最后看一个 Client 里装了什么、为什么要共享而不是每次新建。每一步只讲到能看清全貌的深度,细节链到 02 到 04。实验都在 M2 Max、macOS 27、rustc 1.99.0 上跑,reqwest 0.13.5,请求只打到 127.0.0.1 上的本机服务器。
- reqwest 解决什么问题:README 的定位逐条对到代码;同一批请求用 reqwest、hyper-util、ureq 各写一遍:客户端代码 15 / 53 / 17 行,依赖 98 / 55 / 27 个 crate,剥离后二进制 5.4 / 4.5 / 2.3 MB;单连接顺序请求 reqwest 比 hyper-util 每个多约 5 µs。
- 一次请求:两次 HTTPS 请求的
tracing日志:localhost先试[::1]被拒再连127.0.0.1,ALPN 协商出 h2,连接在响应回来之前就进了池;第一次 34 ms 里约 26 ms 是 aws-lc-rs 在进程里第一次被用到,第二次复用连接只要 0.24 ms,服务端只接受了一个连接、一次握手。 - 一个 Client:
Client是一个 8 字节的Arc<ClientRef>,克隆约 4 ns;ClientBuilder::build按顺序拼出代理、resolver、TLS 配置、连接器、hyper-util 客户端和四层 tower;build本身不到 10 µs,但新Client意味着空的连接池和新的 TLS 握手,本机每个请求从约 0.09 ms 变成约 2.5 ms。
flowchart TB why[reqwest 解决什么问题] --> one[一次请求] one --> shape[一个 Client] one --> req["02 发请求"] one --> conn["03 连接"] shape --> pool["连接池与 HTTP 版本"] one --> resp["04 响应与策略"]
💬 关联讨论
发起讨论加载中...