protobuf 与 gRPC
protobuf vs gRPC
我尝试了解 protobuf 和 gRPC 以及如何使用这两者。你能帮我理解以下内容吗:
- 考虑 OSI model 什么是第 4 层的 Protobuf?
- 通过消息传输思考“流”如何,gRPC 正在做什么而 protobuf 遗漏了什么?
- 如果发送方使用 protobuf,服务器是否可以使用 gRPC 或者 gRPC 是否添加了只有 gRPC 客户端才能传递的内容?
- 如果 gRPC 可以使同步和异步通信成为可能,那么 Protobuf 只是用于编组,因此与状态没有任何关系 - true 还是 false?
- 我可以在前端应用程序通信中使用 gRPC 而不是 REST 或 GraphQL 吗?
我已经知道 - 或者假设我知道 - 那:
- 数据交换的二进制协议
- 由 Google
设计
- 在客户端和服务器使用生成的“结构”描述来 un-/-marshall 消息
- 使用 protobuf (v3)
- 再次来自 Google
- RPC 调用框架
- 也使用 HTTP/2
- 可以进行同步和异步通信
我再次假设对于已经使用该技术的人来说这是一个简单的问题。我仍然会感谢你对我有耐心并帮助我。我也非常感谢网络对这些技术的深入研究。
实际上,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 手动序列化数据对象
回答问题:
- gRPC 工作在第 5、6 和 7 层。Protobuf 工作在第 6 层。
- 当你说 "message transfer" 时,Protobuf 并不关心传输本身。它仅适用于任何数据传输的两端,将字节转换为对象
- 默认使用 gRPC 意味着您正在使用 Protobuf。您可以编写自己的客户端,使用 Protobuf 但不使用 gRPC 与 gRPC 进行互操作,或者将其他序列化器插入 gRPC - 但使用 gRPC 会更容易
- 正确
- 是的,你可以
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 是另一个(二进制)序列化库的示例。
我尝试了解 protobuf 和 gRPC 以及如何使用这两者。你能帮我理解以下内容吗:
- 考虑 OSI model 什么是第 4 层的 Protobuf?
- 通过消息传输思考“流”如何,gRPC 正在做什么而 protobuf 遗漏了什么?
- 如果发送方使用 protobuf,服务器是否可以使用 gRPC 或者 gRPC 是否添加了只有 gRPC 客户端才能传递的内容?
- 如果 gRPC 可以使同步和异步通信成为可能,那么 Protobuf 只是用于编组,因此与状态没有任何关系 - true 还是 false?
- 我可以在前端应用程序通信中使用 gRPC 而不是 REST 或 GraphQL 吗?
我已经知道 - 或者假设我知道 - 那:
- 数据交换的二进制协议
- 由 Google 设计
- 在客户端和服务器使用生成的“结构”描述来 un-/-marshall 消息
- 使用 protobuf (v3)
- 再次来自 Google
- RPC 调用框架
- 也使用 HTTP/2
- 可以进行同步和异步通信
我再次假设对于已经使用该技术的人来说这是一个简单的问题。我仍然会感谢你对我有耐心并帮助我。我也非常感谢网络对这些技术的深入研究。
实际上,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 手动序列化数据对象
回答问题:
- gRPC 工作在第 5、6 和 7 层。Protobuf 工作在第 6 层。
- 当你说 "message transfer" 时,Protobuf 并不关心传输本身。它仅适用于任何数据传输的两端,将字节转换为对象
- 默认使用 gRPC 意味着您正在使用 Protobuf。您可以编写自己的客户端,使用 Protobuf 但不使用 gRPC 与 gRPC 进行互操作,或者将其他序列化器插入 gRPC - 但使用 gRPC 会更容易
- 正确
- 是的,你可以
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 是另一个(二进制)序列化库的示例。