gRPC 简介

gRPC 和 Protocol Buffers 的简介。

gRPC 简介

gRPC 和 Protocol Buffers 的简介。

本页将向您介绍 gRPC 和 Protocol Buffers。gRPC 可以将 Protocol Buffers 同时用作其接口定义语言 (IDL) 和底层消息交换格式。如果您是 gRPC 和/或 Protocol Buffers 的新手,请阅读本文!如果您只想先深入了解 gRPC 的实际应用,请选择一种语言并尝试其快速入门

概述

在 gRPC 中,客户端应用程序可以直接调用另一台机器上的服务器应用程序的方法,就像调用本地对象一样,从而使您更容易创建分布式应用程序和服务。与许多 RPC 系统一样,gRPC 基于定义服务的思想,指定可以使用其参数和返回类型远程调用的方法。在服务器端,服务器实现此接口并运行 gRPC 服务器以处理客户端调用。在客户端,客户端有一个存根(在某些语言中称为客户端),它提供与服务器相同的方法。

Concept Diagram

gRPC 客户端和服务器可以在各种环境中运行并相互通信 - 从 Google 内部的服务器到您自己的桌面 - 并且可以用 gRPC 支持的任何语言编写。因此,例如,您可以轻松地用 Java 创建 gRPC 服务器,用 Go、Python 或 Ruby 创建客户端。此外,最新的 Google API 将具有其接口的 gRPC 版本,使您可以轻松地将 Google 功能构建到您的应用程序中。

使用 Protocol Buffers

默认情况下,gRPC 使用 Protocol Buffers,这是 Google 用于序列化结构化数据的成熟开源机制(尽管它可以与其他数据格式(如 JSON)一起使用)。下面是对其工作原理的快速介绍。如果您已经熟悉 Protocol Buffers,请随意跳到下一节。

使用 Protocol Buffers 的第一步是在 *proto 文件* 中定义要序列化的数据结构:这是一个扩展名为 .proto 的普通文本文件。Protocol buffer 数据被结构化为 *消息*,其中每个消息都是包含一系列名为 *字段* 的名称-值对的小型逻辑信息记录。这是一个简单的示例

message Person {
  string name = 1;
  int32 id = 2;
  bool has_ponycopter = 3;
}

然后,一旦指定了数据结构,就可以使用 Protocol Buffer 编译器 protoc 从您的 proto 定义中生成您首选语言的数据访问类。这些类为每个字段提供简单的访问器,如 name()set_name(),以及将整个结构序列化/解析为原始字节/从原始字节解析的方法。例如,如果您的选择语言是 C++,则在上面的示例上运行编译器将生成一个名为 Person 的类。然后,您可以在应用程序中使用此类来填充、序列化和检索 Person Protocol Buffer 消息。

您可以在普通的 proto 文件中定义 gRPC 服务,其中 RPC 方法参数和返回类型指定为 Protocol Buffer 消息

// The greeter service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

gRPC 使用带有特殊 gRPC 插件的 protoc 从您的 proto 文件生成代码:您将获得生成的 gRPC 客户端和服务器代码,以及用于填充、序列化和检索消息类型的常规 Protocol Buffer 代码。要了解有关 Protocol Buffers 的更多信息,包括如何在您选择的语言中安装带有 gRPC 插件的 protoc,请参阅 Protocol Buffers 文档

Protocol buffer 版本

虽然 Protocol Buffers 一段时间以来一直向开源用户提供,但本网站上的大多数示例都使用 Protocol Buffers 版本 3 (proto3),它具有稍微简化的语法、一些有用的新功能,并支持更多语言。Proto3 目前在 Java、C++、Dart、Python、Objective-C、C#、精简运行时 (Android Java)、Ruby 和 JavaScript 中可用,这些语言来自 Protocol Buffers GitHub 仓库,以及来自 golang/protobuf 官方软件包 的 Go 语言生成器,并且正在开发更多语言。您可以在 proto3 语言指南 和为每种语言提供的 参考文档 中找到更多信息。参考文档还包括 .proto 文件格式的 正式规范

总的来说,虽然您可以使用 proto2(当前的默认 Protocol Buffers 版本),但我们建议您将 proto3 与 gRPC 一起使用,因为它允许您使用 gRPC 支持的全部语言,并避免 proto2 客户端与 proto3 服务器通信时的兼容性问题,反之亦然。

上次修改时间:2024 年 11 月 12 日:在不同的网页中嵌入 YouTube 视频 (#1380) (196f408)