networking - protobuf 与 gRPC

标签 networking protocol-buffers grpc

我尝试了解 protobuf 和 gRPC 以及如何使用两者。你能帮我理解以下内容吗:

  • 考虑到OSI model例如 Protobuf 位于第 4 层?
  • 思考消息传输的“流程”如何,gRPC 做了什么 protobuf 遗漏的事情?
  • 如果发送方使用 protobuf,服务器是否可以使用 gRPC,或者 gRPC 是否添加了只有 gRPC 客户端才能提供的内容?
  • 如果 gRPC 可以实现同步和异步通信,那么 Protobuf 只是用于编码,因此与状态(true 或 false)无关?
  • 我可以在前端应用程序通信中使用 gRPC 而不是 REST 或 GraphQL 吗?

我已经知道 - 或者假设我知道 - :

Protobuf

  • 用于数据交换的二进制协议(protocol)
  • 由 Google 设计
  • 在客户端和服务器上使用生成的“结构”(如描述)来取消/编码消息

gRPC

  • 使用 protobuf (v3)
  • 再次来自 Google
  • RPC 调用框架
  • 也使用 HTTP/2
  • 可以进行同步和异步通信

我再次认为对于已经使用该技术的人来说这是一个简单的问题。我仍然感谢您对我的耐心和帮助。我也非常感谢任何对网络技术的深入研究。

最佳答案

Protocol Buffer 是(是?)接口(interface)定义语言和序列化库:

  • 您在 IDL 中定义数据结构,即描述您要使用的数据对象
  • 它提供了将数据对象与二进制进行转换的例程,例如用于从磁盘写入/读取数据

gRPC 使用相同的 IDL,但添加了语法“rpc”,它允许您使用 Protobuf 数据结构作为数据类型来定义远程过程调用方法签名:

  • 您定义数据结构
  • 您添加 rpc 方法定义
  • 它提供了通过网络提供和调用方法签名的代码
  • 如果需要,您仍然可以使用 Protobuf 手动序列化数据对象

回答问题:

  1. gRPC 在第 5、6 和 7 层工作。Protobuf 在第 6 层工作。
  2. 当你说“消息传输”时,Protobuf 并不关心传输本身。它仅适用于任何数据传输的任一端,将字节转换为对象
  3. 默认情况下使用 gRPC 意味着您正在使用 Protobuf。您可以编写自己的客户端,使用 Protobuf 但不使用 gRPC 来与 gRPC 进行互操作,或者将其他序列化器插入 gRPC - 但使用 gRPC 会更容易
  4. 正确
  5. 是的,可以

关于networking - protobuf 与 gRPC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48330261/

相关文章:

python - 有没有办法在 pypy 上使用 Google Protobuf?

grpc - 解决在 bazel 中使用 gRPC cpp 时的依赖问题

c# - .Net Core 2.1 是否支持 HTTP/2 请求?

c - 通过丢失保护加速基于 UDP 的文件传输?

database - AWS 数据库连接被拒绝

c++ - 从protobuf继承C++类

java - 如何在 Java 中捕获所有传入的 gRPC 消息?

java - 如何使用公共(public)池创建连接池?

performance - 模拟不同国家的访问

protocol-buffers - gRPC 中的异常处理