主要观点: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 性能提升潜力巨大,虽处于早期阶段但工具已存在,鼓励开发者尝试并分享经验。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。