最后我们在 #dstack 中成功运行了 gRPC,花了一整天的时间! 由于 dstack 网关可以将任意 TCP 包装在 TLS 中,我以为它会正常工作。 结果并没有。
关键细节:gRPC 运行在 HTTP/2 上。 HTTP/2 通常在 TLS 握手期间依赖 ALPN(应用层协议协商)。
将ALPN视为双方在交换任何实际数据之前达成一致的协议(h2代表HTTP/2)。 如果此步骤失败,连接将回退到HTTP/1.1——gRPC无法使用该协议。
要正确处理 gRPC,网关必须: 1️⃣ 支持 HTTP/2 端到端 2️⃣ 在 TLS 握手期间通过 ALPN 协商 h2 3️⃣ 保留 gRPC 的二进制帧和尾部 如果缺少其中任何一项,您将会看到奇怪的挂起、缺失的错误或损坏的流。
677