protobuf与gRPC


101

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

  • 考虑到OSI模型,例如Protobuf在第4层在哪里?
  • 通过消息传递来思考“流”是什么,gRPC在做protobuf遗漏的事情是什么?
  • 如果发送者使用protobuf,则服务器可以使用gRPC还是gRPC添加仅gRPC客户端可以提供的内容?
  • 如果gRPC可以使同步和异步通信成为可能,那么Protobuf仅用于编组,因此与状态无关-是对还是错?
  • 我可以在通信的前端应用程序中使用gRPC而不是REST或GraphQL吗?

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

原虫

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

gRPC

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

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

Answers:


85

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

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

你能告诉我你们人们在说什么“层”吗?请给我链接以详细了解此概念。谢谢。
Millie Hudson

它的OSI模型-在问题中添加了一个链接。gRPC是否属于第5层和第6层,尚有争议,因为它使用第7层协议(HTTP/2),但它确实可以完成这些层的工作。
Peter Wishart

67

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

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

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

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

话虽这么说,您可以将两者结合起来以构建一个不错的客户端/服务器系统:gRPC将是您的客户端/服务器代码,并对您的数据协议进行probubuf。

PS:我写了这篇论文来说明如何逐步使用gRPC和protobuf使用Go构建客户端/服务器。


3
谢谢,这可以帮助我实现一个示例。
lony

7

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

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

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
  • [类型]
    • 一元
    • 客户端流
    • 服务器流
    • 双向流
    • grpc服务器默认为异步
    • grpc客户端可以同步或异步

原型

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

3
压缩不会减少CPU使用率。您必须对其进行压缩和解压缩才能发送或使用序列化中的数据,这会消耗CPU的内存。.压缩为您带来的好处是减少序列化的占用空间,减少潜在的内存压力,减少磁盘使用量(如果用于序列化到磁盘)或超过电线发出信号。
Svartalf

@Svartalf编辑以更正此问题。感谢您指出!
swrobel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.