Probuf 与 gRPC

我试图了解 Protobuf 和 gRPC,以及如何使用它们。你能帮助我理解以下内容吗:

  • 考虑到 OSI 型号,什么是在哪里,例如,在第4层的 Protobuf?
  • 通过消息传输思考“流”是怎样的,什么是 gRPC 在做什么原型程序没有做的事情?
  • 如果发送方使用 Protobuf,服务器是否可以使用 gRPC 或者 gRPC 添加只有 gRPC 客户端才能提供的内容?
  • 如果 gRPC 可以使同步和异步通信成为可能,那么 Protobuf 只是用于编组,因此与 state 没有任何关系—— true 或 false?
  • 我可以在前端应用程序中使用 gRPC 而不是 REST 或 GraphQL 进行通信吗?

我已经知道——或者假设我知道——这一点:

普罗布夫

  • 数据交换的二进制协议
  • 由谷歌设计
  • 在客户端和服务器上使用生成的“ Struct”(类似描述)来解除/-Marshall 消息

GRPC

  • 使用 Protobuf (v3)
  • 又是谷歌的
  • RPC 调用框架
  • 也使用 HTTP/2
  • 可以进行同步和异步通信

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

51214 次浏览

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

  • GRPC 管理客户机和服务器交互的方式(就像 Web 客户机/服务器使用 REST API 一样)
  • Protobuf 只是一个序列化/反序列化工具(就像 JSON 一样)

GRPC 有两个端口: 服务器端和客户端,这两个端口能够拨号服务器。服务器公开 RPC (即。可以远程调用的函数)。您有很多选择: 您可以保护通信(使用 TLS)、添加身份验证层(使用拦截器)、 ..。

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

也就是说,您可以将两者结合起来构建一个很好的客户机/服务器系统: gRPC 将是您的客户机/服务器代码,并且是您的数据协议的原型。

PS: 我编写这个 纸张是为了展示如何使用 gRPC 和 Protobuf 使用 Go 一步一步地构建客户机/服务器。

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

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

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

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

回答问题:

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

Grpc 是 google 构建的一个框架,用于 google 自己的生产项目,# HyperledgerFabric 是用 grpc 构建的有许多用 grpc 构建的开源应用程序

Protobuff 是一个类似于 Json的数据表示,这也是由谷歌实际上他们有几千个原型文件是在他们的生产项目中生成的

Grpc

  • GRPC 是由 google 开发的一个开源框架
  • 它允许我们为 RPC 创建请求和响应,并通过框架处理 rest
  • REST 是面向 CRUD 的,而 grpc 是面向 API 的(没有约束)
  • 在 HTTP/2之上构建
  • 提供 > > > > 核证机关、 Loadbalancing、监察、记录
  • [ HTTP/2]
    • HTTP1.1早在1997年就发布了
    • HTTP1在每次请求时打开到服务器的新 TCP 连接
    • 它不压缩头部
    • 没有服务器推送,它只是与 Req,Res 工作
    • HTTP2于2015年发布(SPDY)
    • 支持多路复用
    • 客户端和服务器可以通过相同的 TCP 连接并行推送消息
    • 大大减少了延迟
    • HTTP2支持头压缩
    • HTTP2是二进制的
      • Proto buff 是二进制的,所以它非常适合 HTTP2
  • [类型]
    • 一元
    • client streaming
    • 服务器流媒体服务器流媒体服务器
    • 双向流
    • Grpc 服务器在默认情况下是异步的
    • Grpc 客户端可以是 sync 或 Async

原生力量

  • 协议缓冲是语言不可知论者
  • 解析协议缓冲(二进制格式)较少占用 CPU 资源
  • [命名]
    • 消息名称使用驼峰大小写
    • 字段的 underscore _ seperated
    • 对 Enums 使用 camelcase,对值名使用 CAPITAL _ WITH_ UNDERSCORE
  • [评论]
    • 支援//
    • 支持/* */
  • [优势]
    • 数据已完全类型化
    • 数据被完全压缩(更少的带宽使用)
    • 需要模式(消息)来生成代码和读取代码
    • 文档可以嵌入到架构中
    • 数据可以通过任何语言读取
    • 模式可以在任何时候以安全的方式进化
    • 比 XML 快
    • 代码会自动为您生成
    • 谷歌发明了原型 BUFF,他们使用48000个原型 BUFF 消息和12000个原型文件
    • 许多 RPC 框架,包括 grpc 都使用协议缓冲来交换数据

最简单的形式,grpc 就像一个公共交通工具。它将在客户机和服务器之间交换数据。

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

GRPC 是 RPC 集成风格的一个实例,它基于原型程序设计序列化库。 有五种集成风格: RPC、文件传输、 MOM、分布式对象和共享数据库。 RMI 是 RPC 集成风格实例化的另一个例子。还有很多其他人。MQ 是 MOM 集成风格的实例化。还有 RabbitMQ。Oracle 数据库模式是共享数据库集成风格的实例化。CORBA 是分布式对象集成风格的实例化。诸如此类。 Avro 是另一个(二进制)序列化库的示例。

GRPC (google 远程过程调用)是一种客户机-服务器结构。

协议缓冲是一种与语言无关、与平台无关的可扩展机制,用于序列化结构化数据。

service Greeter {
rpc SayHello (HelloRequest) returns (HelloResponse) {}
}


message HelloRequest {
string myname = 1;
}


message HelloResponse {
string responseMsg = 1;
}

协议缓冲区用于 gRPC 客户端和 gRPC 服务器之间的数据交换。它是 gRPC 客户端和 gRPC 服务器之间的一个协议。在 gRPC 项目中,协议缓冲区作为 .proto文件实现。它定义了接口,如 service,由客户端和服务器之间的服务器端和消息格式提供; rpc方法,由客户端用来访问服务器。

客户端和端都有相同的原型文件。(一个真实的例子: 客户端原型文件服务器端原型文件。)它意味着客户端和服务器都知道接口、消息格式和客户端访问服务器中服务的方式。

原型文件(例如协议缓冲区)将被编译成真正的语言。

生成的代码既包含供客户机使用的存根代码,也包含供服务器实现的抽象接口,两者都具有在服务中定义的方法。

在原型文件中定义的 service(例如,协议缓冲区)将生成为 abstract class xxxxImplBase(例如,服务器端的接口)。

newStub()是一个同步调用,它是实现远程过程调用的方法(例如,原型文件中的 rpc)。

并在生成的文件中实现了构建请求消息和响应消息的方法。

proto buffer and gRPC 1

proto buffer and gPRC 2

我重新实现简单的客户端和服务器端样本的基础上,在官方文档。 Cpp 客户端Cpp 服务器Java 客户端Java 服务器Springboot 客户端Springboot 服务器样本

推荐使用文档:

Cpp/helloworld/README.md # Generator-grpc-code ,

生成-client-and-server-code ,

定义-the-service ,

Generatedcode/# client-stubs

阻塞/同步存根

流媒体观察者

如何使用带弹簧靴的 Grpc

其他:

GRPC 可以使用协议缓冲作为其接口定义语言(Interface Definition Language,IDL)和基础消息交换格式