gRPC 通过 HTTP/3

主要观点:HTTP/3 在全球前 1000 万网站中的支持率达 30.4%,但后端支持情况不佳。gRPC 推动了 HTTP/2 的采用,而 HTTP/3 对 gRPC 服务有诸多好处,本文将探讨 HTTP/3 与 gRPC 的结合及相关实践。
关键信息

  • HTTP/3 基于 QUIC,可减少连接建立的往返次数,甚至实现 0-RTT,避免 TCP 的一些限制,如头阻塞问题,且强制使用 TLS 1.3 协议,更安全快速。
  • gRPC 在不同语言中的 HTTP/3 实现情况,如 C# 的 grpc-dotnet、Rust 的 Tonic 与 Hyper 传输、Go 的 ConnectRPC 等。
  • 在 Go 中设置支持 HTTP/3 的 gRPC 服务器和客户端的代码示例,包括使用 quic-go 和 ConnectRPC,同时展示了用 curl 测试 HTTP/3 服务器的过程。
  • 发现 quic-go 的 HTTP/3 实现不支持 HTTP trailers,作者为此提交了 PR 并在自己的分支中使 gRPC 与 HTTP/3 配合工作。
    重要细节
  • 连接建立过程:HTTP/1.1 和 HTTP/2 需三次往返,HTTP/3 通常只需一次往返,0-RTT 情况下新连接往返次数可为零,但需客户端有缓存信息且存在安全隐患。
  • Go 中设置服务器时,使用 http3.Server 替代 http.Server,可同时运行 http.Server 和 http3.Server 以支持多种协议。
  • 测试客户端时,需定义 http3.RoundTripper 并传入 http.Client,ConnectRPC 可通过配置 http.Client 实现与 HTTP/3 的无缝通信。
  • curl 测试时,需安装特定版本的 curl 才能支持 HTTP/3,且发现 quic-go 不支持 HTTP trailers 及其相关 PR 情况。
    结论:HTTP/3 对 gRPC 性能提升潜力巨大,虽处于早期阶段但工具已存在,鼓励开发者尝试并分享经验。
阅读 21
0 条评论