Rust in Everything
基于 reqwest 0.13.5

全景

这一部分先回答「reqwest 比直接用下层多给了什么、多花了什么」,再把请求、连接、响应三条主线在本机上从头到尾各走一遍,最后看一个 Client 里装了什么、为什么要共享而不是每次新建。每一步只讲到能看清全貌的深度,细节链到 02 到 04。实验都在 M2 Max、macOS 27、rustc 1.99.0 上跑,reqwest 0.13.5,请求只打到 127.0.0.1 上的本机服务器。

  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。
  2. 一次请求:两次 HTTPS 请求的 tracing 日志:localhost 先试 [::1] 被拒再连 127.0.0.1,ALPN 协商出 h2,连接在响应回来之前就进了池;第一次 34 ms 里约 26 ms 是 aws-lc-rs 在进程里第一次被用到,第二次复用连接只要 0.24 ms,服务端只接受了一个连接、一次握手。
  3. 一个 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 响应与策略"]

💬 关联讨论

发起讨论
加载中...