protobuf vs gRPC

时间:2018-01-18 21:03:42

标签: networking protocol-buffers grpc

我尝试了解protobuf和gRPC,以及如何使用它们。你能帮我理解一下:

  • 考虑OSI模型是什么,例如第4层的Protobuf?
  • 通过消息传递思考如何“流动”gRPC做什么是protobuf错过了什么?
  • 如果发件人使用protobuf,服务器可以使用gRPC还是gRPC添加只有gRPC客户端可以提供的内容?
  • 如果gRPC可以进行同步和异步通信,Protobuf只是用于编组,因此与状态无关 - 是真还是假?
  • 我可以在前端应用程序中使用gRPC而不是REST或GraphQL吗?

我已经知道 - 或者假设我这样做 - 那个:

Protobuf

  • 数据交换的二进制协议
  • 由Google设计
  • 在客户端和服务器上使用生成的“Struct”描述,以取消 - / - marshall消息

gRPC

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

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

3 个答案:

答案 0 :(得分:37)

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

  • gRPC管理客户端和服务器可以交互的方式(就像带有REST API的Web客户端/服务器)
  • protobuf只是一个序列化/反序列化工具(就像JSON一样)

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

您可以在任何程序中使用protobuf,无需客户端/服务器。如果你需要交换数据,并希望它们是强类型的,protobuf是一个不错的选择(快速和可靠)。

话虽如此,您可以将两者结合起来构建一个不错的客户端/服务器系统:gRPC将是您的客户端/服务器代码,并且是您的数据协议的原型。

PS:我写了这个paper来说明如何使用Go逐步构建带有gRPC和protobuf的客户端/服务器。

答案 1 :(得分:33)

协议缓冲区是(是?)接口定义语言和序列化库:

  • 您可以在其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. 是的,你可以

答案 2 :(得分:3)

grpc 是由Google构建的框架,用于google本身的生产项目中,而#HyperledgerFabric是由grpc构建的,有许多由grpc构建的开源应用程序

protobuff 是类似于 json 的数据表示形式,它也是由Google提供的,实际上他们在其生产项目中生成了数千个原型文件

grpc

  • gRPC是Google开发的开源框架
  • 它允许我们为RPC创建请求和响应并通过框架处理其余部分
  • REST面向CRUD,但grpc面向API(无限制)
  • 基于HTTP / 2构建
  • 提供>>>>>身份验证,负载平衡,监视,日志记录
  • [HTTP / 2]
    • HTTP1.1早在1997年就发布了
    • HTTP1在每次请求时打开与服务器的新TCP连接
    • 它不压缩标题
    • 没有服务器推送,仅适用于Req,Res
    • 2015年发布的HTTP2(SPDY)
    • 支持多路复用
    • 客户端和服务器可以通过同一TCP连接并行推送消息
    • 大大减少了延迟
    • HTTP2支持标头压缩
    • HTTP2是二进制的
      • proto buff是二进制的,因此非常适合HTTP2
  • [TYPES]
    • 一元
    • 客户端流
    • 服务器流
    • 双向流
    • grpc服务器默认为异步
    • grpc客户端可以同步或异步

probbuff

  • 协议缓冲区与语言无关
  • 解析协议缓冲区(二进制格式)占用的CPU较少
  • [命名]
    • 使用驼峰大小写作为邮件名称
    • 在字段中使用underscore_seperated
    • 将驼峰式用于枚举,并将CAPITAL_WITH_UNDERSCORE用于值名称
  • [评论]
    • 支持//
    • 支持/ * * /
  • [优势]
    • 数据已完全输入
    • 数据已完全压缩(CPU使用率更低)
    • 需要架构(消息)来生成代码和读取代码
    • 文档可以嵌入架构中
    • 可以用任何一种语言读取数据
    • 架构可以随时以安全的方式发展
    • 比XML快
    • 代码会自动为您生成
    • Google发明了原型爱好者,他们使用48000条protobuf消息和12000.proto文件
    • 包括RPC在内的许多RPC框架都使用协议缓冲区来交换数据