Rust in Everything
基于 hyper 1.12.0

在本站中

本站是开源的,仓库在 yuxuetr/rustineverything。这一部分的链接都指向提交 89a61b1(2026-10-23),行号以它为准。站点的代码不直接 use hyper:服务端经由 dioxus-server 0.7.9 和 axum 0.8.9,客户端经由 reqwest 0.12.28。那个提交的 Cargo.lock 锁的是 hyper 1.10.1、hyper-util 0.1.20,比本卷的 1.12.0 / 0.1.21 早;两页各自在末尾核对了这段差别,在本站用到的路径上行为没有变化。

  1. 服务端路径:release 构建里 dioxus::serve 只调 axum::serve(listener, router),每条连接 auto::Builder::new(TokioExecutor::new()) 加 serve_connection_with_upgrades,不设 timer,header_read_timeout 的默认 30 秒不生效;慢连接靠前面的 Pingora 网关挡,网关用的是 pingora 的默认超时。进程没有处理 SIGTERM,容器停止时 tini 转来的信号直接结束进程,在途请求的客户端得到 IncompleteMessage;本地实验复现了这一点,并给出 with_graceful_shutdown 加排空期限的改法。
  2. 出站客户端:OAuth、支付、LLM 三处都用 reqwest。reqwest 给 legacy Client 配了 pool_timer 和 90 秒空闲超时,但 hyper 客户端不给单个请求计时,reqwest 默认也不计时,所以每处都自己设了超时。OAuth 和支付每次新建 Client,连接池用不上。测试必须 .no_proxy():hyper-util 读 macOS 系统代理时不读例外列表,回环请求会被代理拿走。
flowchart TB
  gw["Pingora 网关"] --> axs["axum::serve"]
  axs --> auto["auto::Builder:无 timer"]
  auto --> router["axum Router"]
  router --> calls["OAuth / 支付 / LLM"]
  calls --> rq["reqwest"]
  rq --> lc["legacy Client"]
  lc --> up["外部 API"]
  term["SIGTERM"] -.->|无处理| axs

💬 关联讨论

发起讨论
加载中...