本地与远程连接的 gRPC 序列化行为

gRPC serialization behavior for local vs remote connections

在 gRPC Java 实现中,当从同一进程中具有本地连接的 gRPC 服务发送对象时,对象是否被序列化?

假设我们有一个 java 进程,有两个 classes A 和 B。如果 class A 使用 gRPC 客户端将数据发送到由 [=17 支持的 gRPC 服务器=] B,客户端和服务器是否共享一个 Java 对象引用,或者数据是否序列化并通过已建立的本地 Netty 连接发送?

使用进程内传输时,通常会避免 Protobuf serialization/deserialization。

gRPC 中的 Protobuf 编组器在序列化消息时生成 InputStream。使用进程内传输时,InputStreamback 传递给 Protobuf 编组器以反序列化消息。 Protobuf 编组器直接实现 InputStream 并且仅在实际从流中读取字节时才序列化消息。反序列化时,the marshaller checks whether it generated the InputStream and, if so, grabs the message directly and returns it 从未将消息转换为字节。这是安全的,因为 Java 中的 Protobuf 对象是不可变的。

这种方法对于 grpc-java 具有进程内传输是独一无二的。大多数其他实现 需要 序列化为字节并使用可变协议缓冲区。 grpc-netty 编码为 HTTP/2,因此总是序列化为字节。