首页 > 解决方案 > TCP 套接字客户端和 protobuf 可以与 gRPC 服务器通信吗?

问题描述

我有两台机器通过 TCP 相互通信,机器 A 使用机器 B 的服务。理想情况下,我很想为此使用 RPC 框架。想到 gRPC,因为我们已经使用了 protobuf。

但是,机器 A 已经使用了一个包装 TCP 套接字进行通信的外部库,因此客户端应用程序代码只能将原始字节(在 protobuf 中编码)发送到机器 B。所以我想知道我是否可以调整代码以使用 gRPC机器 B 上的服务器。

标签: socketstcpprotocol-buffersgrpc

解决方案


gRPC 建立在 http/2 之上,理论上你可以使用任何类型的连接(例如域套接字、命名管道)来使用 gRPC 进行通信,所以这当然是可能的。事实上,至少在 go 中,gRPC 默认使用 TCP。

如果只要求机器 A 使用 TCP 套接字进行通信,但您可以使用外部库,那么使用您选择的语言的 gRPC 库在原始 TCP 之上实现客户端/服务器交互应该相当容易插座。

另一方面,如果你不能使用 gRPC 库,虽然仍然有可能你必须自己实现 gRPC 协议,如果你不能使用任何外部库,可能还需要实现 http/2 协议;这可能需要大量工作,您最好为您的用例创建一个更简单的临时 RPC 协议。

编辑

更新后的问题使要求更加清晰。如果您需要使用特定的 TCP 库,但您可以在此基础上使用 gRPC,那么我认为该任务的难度实际上取决于编程语言。

例如,在 go 中,它就像创建一个包装器结构一样简单,为它实现接口,并在创建客户端时net.conn将其与选项一起使用。withDialer在 c++ 中,它看起来会更困难,并且需要实现自定义传输(虽然我对 c++ gRPC API 不太熟悉,所以可能有更简单的方法)


推荐阅读