【发布时间】:2023-02-22 07:02:43
【问题描述】:
我正在研究 gRPC 服务的客户端/服务器实现,其中服务器和客户端都将用 C++ 编写。服务器和客户端将使用双向流进行通信,并且需要发送原始字节作为 gRPC (HTTP) 负载。目标是避免 Protobuf 的开销并使用自定义序列化代码。如何在没有任何序列化的情况下使用 gRPC++?
【问题讨论】:
我正在研究 gRPC 服务的客户端/服务器实现,其中服务器和客户端都将用 C++ 编写。服务器和客户端将使用双向流进行通信,并且需要发送原始字节作为 gRPC (HTTP) 负载。目标是避免 Protobuf 的开销并使用自定义序列化代码。如何在没有任何序列化的情况下使用 gRPC++?
【问题讨论】:
序列化由 SerializationTraits 的特化控制。
有一个built-in one for the grpc::ByteBuffer type。
所以,使用像grpc::ServerAsyncResponseWriter<grpc::ByteBuffer>这样的东西
或者 grpc::ServerWriteReactor<grpc::ByteBuffer> 如果可以的话应该已经可以工作了
使用 grpc::ByteBuffer 作为您的缓冲区类型。
如果没有,您可以提供自己的专业化。
注意:ProtoBuf codegen 写了很多胶水代码来注册
您要公开的各种方法的“处理程序”代码。如果你想
要使用原始字节缓冲区,您需要自己编写此代码。它已经
一段时间以来,我查看了 protoc 生成的内容。我会从跑步开始
helloworld.proto 文件上的 codegen 并查看它为
Greeter::AsyncService 和 Greeter::CallbackService 基类。
我也没有在 C++ 中使用回调/反应器模型,只有
“异步”/完成队列模型。我认为回调/反应器模型使用
还有SerializationTraits。
【讨论】: