Rust in Everything
基于 hyper-util 0.1.21

hyper-util 服务端

hyper 1.0 拿掉了 0.14 的 Server,服务端只剩 http1::Builder 和 http2::Builder 两个入口,每次服务一条连接、一种协议。accept 循环、协议判断、整个服务器的停机都留给了使用者。hyper-util 的 server 模块补上了其中两块,axum 的 axum::serve 就建在它们上面(auto 直接用,停机自己用同样的结构实现了一遍)。

  1. auto:一个端口两个协议:ReadVersion 读最多 24 个字节和 HTTP/2 连接前言比对,一个字节不符或 EOF 就走 HTTP/1,读过的字节由 Rewind 塞回去;这一步没有超时。http1_only / http2_only 跳过判断,但在 serve_connection_with_upgrades 下不起作用;经过 auto 的升级连接要用 auto::upgrade::downcast。
  2. 优雅停机:GracefulShutdown 是一个 tokio watch 通道,watch 给每条连接配一个接收端,shutdown 发信号后等所有接收端消失;长连接会让它一直等下去,要自己加超时;drop 掉它同样会触发停机。
flowchart TB
  acc["accept 循环(你写的)"] --> auto["auto::Builder"]
  auto --> rv["ReadVersion"]
  rv --> h1["http1::Connection"]
  rv --> h2["http2::Connection"]
  acc --> gs["GracefulShutdown::watch"]
  h1 --> gs
  h2 --> gs
  gs --> sd["shutdown:通知并等待"]

💬 关联讨论

发起讨论
加载中...