Rust in Everything
基于 pingora 0.9.0

全景

这一部分先回答「pingora 是什么」,再把请求主线和服务主线从头到尾走一遍,每一步只讲到能看清全貌的深度,细节链到 02 到 05 的页面。三页的实验都在 M2 Max、macOS 27、rustc 1.99.0 上跑,pingora 0.9.0、tokio 1.53.2。

  1. pingora 解决什么问题:写一个代理要定下哪些事;README 的七条特性逐条落到代码上,40 million 这类规模数字离线核实不了,不讲;和 hyper 搭的代理比,四处能核实的差别:自己的 HTTP/1(请求头原样保留大小写,实测)、固定阶段的钩子、服务级共享的上游连接池、自带进程管理与平滑升级。
  2. 一次请求:给 ProxyHttp 的每个钩子打日志,一个普通 GET 依次调到 18 个方法;同一个下游连接上的第二个请求先调 on_connection_reuse;上游打印对端端口,证明第二、第三个请求复用同一条上游连接,换了下游连接也一样;两个并发请求开两条上游连接,之后按先进先出轮流取用。
  3. 一个 Server 的一生:ServerConf 的默认值;每个服务一个以服务名命名的运行时,sample 列出线程名;SIGTERM 后同一毫秒内停 accept、关空闲 keep-alive 连接、后台服务退出,在途请求在宽限期内完成,新连接被拒绝;默认宽限期是 300 秒;超过宽限期的请求被直接切断,连 logging 都不调;SIGINT 不通知服务。
flowchart TB
  why[解决什么问题] --> req[一次请求]
  why --> srv["一个 Server 的一生"]
  req --> proto[03 协议]
  req --> conn[04 连接上游]
  req --> proxy[05 代理]
  srv --> server[02 服务器]

💬 关联讨论

发起讨论
加载中...