hyper-util 服务端
hyper 1.0 拿掉了 0.14 的 Server,服务端只剩 http1::Builder 和 http2::Builder 两个入口,每次服务一条连接、一种协议。accept 循环、协议判断、整个服务器的停机都留给了使用者。hyper-util 的 server 模块补上了其中两块,axum 的 axum::serve 就建在它们上面(auto 直接用,停机自己用同样的结构实现了一遍)。
- auto:一个端口两个协议:
ReadVersion读最多 24 个字节和 HTTP/2 连接前言比对,一个字节不符或 EOF 就走 HTTP/1,读过的字节由Rewind塞回去;这一步没有超时。http1_only/http2_only跳过判断,但在serve_connection_with_upgrades下不起作用;经过auto的升级连接要用auto::upgrade::downcast。 - 优雅停机:
GracefulShutdown是一个 tokiowatch通道,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:通知并等待"]
💬 关联讨论
发起讨论加载中...