protobuf 与 gRPC

protobuf vs gRPC

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

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

Protobuf

gRPC

我再次假设对于已经使用该技术的人来说这是一个简单的问题。我仍然会感谢你对我有耐心并帮助我。我也非常感谢网络对这些技术的深入研究。

实际上,gRPC 和 Protobuf 是两个完全不同的东西。让我简化一下:

  • gRPC 管理客户端和服务器交互的方式(就像 Web client/server 与 REST API)
  • protobuf 只是一个 serialization/deserialization 工具(就像 JSON)

gRPC 有两个方面:服务器端和客户端,可以调用服务器。服务器公开 RPC(即可以远程调用的函数)。你有很多选择:你可以保护通信(使用 TLS),添加身份验证层(使用拦截器),...

您可以在任何程序中使用 protobuf,不必是 client/server。如果您需要交换数据,并希望它们是强类型的,protobuf 是一个不错的选择(快速且可靠)。

也就是说,您可以将两者结合起来构建一个不错的 client/server 系统:gRPC 将成为您的 client/server 代码,而 protobuf 将成为您的数据协议。

PS:我写这个 paper 是为了展示如何使用 Go 逐步构建 client/server 和 gRPC 和 protobuf。

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

  • 您在其 IDL 中定义您的数据结构,即描述您要使用的数据对象
  • 它提供了将数据对象与二进制文件相互转换的例程,例如writing/reading 来自磁盘的数据

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

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

回答问题:

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

grpc 是由 google 构建的框架,它用于 google 本身的生产项目,#HyperledgerFabric 是用 grpc 构建的,有很多使用 grpc

构建的开源应用程序

protobuff是像json这样的数据表示,这也是google其实他们有一些在他们的生产项目中生成了数千个 proto 文件

grpc

  • gRPC 是由 google
  • 开发的 open-source 框架
  • 它允许我们为 RPC 创建 Request & Response 并由框架处理 rest
  • REST 是面向 CRUD 但 grpc 是面向 API(无约束)
  • 建立在HTTP/2
  • 之上
  • 提供 >>>>> 身份验证、负载平衡、监控、日志记录
  • [HTTP/2]
    • 很久以前1997年HTTP1.1就发布了
    • HTTP1 在每次请求时打开到服务器的新 TCP 连接
    • 不压缩 headers
    • 无服务器推送,仅适用于 Req、Res
    • 2015 年发布的 HTTP2 (SPDY)
    • 支持多路复用
    • 客户端和服务器可以通过同一个 TCP 连接并行推送消息
    • 大大减少延迟
    • HTTP2 支持header压缩
    • HTTP2 是二进制的
      • proto buff 是二进制的,因此非常适合 HTTP2
  • [类型]
    • 一元
    • 客户端流
    • 服务器流
    • 双向流
    • grpc 服务器默认是异步的
    • grpc 客户端可以同步或异步

原型增益

  • 协议缓冲区与语言无关
  • 解析协议缓冲区(二进制格式)较少CPU密集
  • [命名]
    • 邮件名称使用驼峰式大小写
    • underscore_seperated 字段
    • 枚举使用驼峰式命名,值名称使用 CAPITAL_WITH_UNDERSCORE
  • [评论]
    • 支持//
    • 支持/* */
  • [优点]
    • 数据完全输入
    • 数据被完全压缩(更少的带宽使用)
    • 生成代码和读取代码需要Schema(message)
    • 文档可以嵌入到架构中
    • 可以跨任何语言读取数据
    • 架构可以随时以安全的方式发展
    • 比XML
    • 自动为您生成代码
    • Google 发明了 proto buff,他们使用了 48000 条 protobuf 消息和 12000.proto 文件
    • 很多 RPC 框架,包括 grpc 使用协议缓冲区来交换数据

在最简单的形式中,grpc 就像一个 public vechicle.It 将在客户端和服务器之间交换数据。

协议缓冲区就像你的公交车票一样,它决定了你应该去哪里或不应该去哪里。

gRPC 是基于protobuf 序列化库的RPC 集成样式的实例化。 有五种集成方式:RPC、文件传输、MOM、分布式对象和共享数据库。 RMI 是 RPC 集成风格实例化的另一个例子。还有很多其他的。 MQ 是 MOM 集成样式的实例化。 RabbitMQ 也是如此。 Oracle 数据库模式是共享数据库集成样式的一个实例。 CORBA 是分布式对象集成样式的实例化。等等。 Avro 是另一个(二进制)序列化库的示例。