首页 > 解决方案 > grpc-java 的 TCP 传输

问题描述

grpc-java 是否有原始 TCP 传输的实现?我需要 grpc 用于内部网络服务并且没有防火墙问题,所以我想在构建基于 grpc 的服务时避免 HTTP/2 开销。

标签: javagrpcgrpc-java

解决方案


“原始” TCP 实际上并不是一个东西。你需要在上面构建一个协议。碰巧 HTTP/2 非常接近 gRPC 可能制定的任何专有协议。我还要注意 gRPC 与 HTTP/2 紧密集成,因此 HTTP/2 在许多实现中被视为 gRPC 的一部分,并且可以作为一个单元进行优化。

gRPC 需要多路复用、流控制、基于字节的帧(不是基于消息)和元数据。这基本上就是 HTTP/2 的核心所在。您可以制定更简单的协议,但随后您开始遇到大型消息问题,这些问题会导致队列阻塞、内存使用或频繁的 TLS 连接建立成本。

制作具有这些特性的协议是一个很好理解的问题。HTTP/2 实际上在许多方面看起来比 HTTP/1 更类似于 TCP。它以与 SSH-2 大致相同的方式解决了这些问题。

选择 HTTP/2 的“损失”很小。grpc 中使用的所需标头之类的东西,例如方法名称和状态代码,不能作为结构而不是通用元数据直接优化到协议中。但是 HPACK 可以帮助一些人。原生二进制标头非常好,可以避免使用 base64 编码元数据,尽管通过 SETTINGS 协商扩展 HTTP/2 以支持它相对容易。


推荐阅读