gRPC 简介
gRPC 和 protocol buffers 简介。
gRPC 简介
本页面向您介绍 gRPC 和 protocol buffers。gRPC 可以使用 protocol buffers 作为其接口定义语言(IDL)和底层消息交换格式。如果您是 gRPC 和/或 protocol buffers 的新手,请阅读本文!如果您只是想先深入了解 gRPC 的实际应用,请选择一门语言并尝试其快速入门。
概览
在 gRPC 中,客户端应用程序可以直接调用另一台机器上的服务器应用程序的方法,就像调用本地对象一样,这使得创建分布式应用程序和服务变得更加容易。与许多 RPC 系统一样,gRPC 基于定义服务的思想,指定可以远程调用的方法及其参数和返回类型。在服务器端,服务器实现此接口并运行 gRPC 服务器来处理客户端调用。在客户端,客户端有一个存根(在某些语言中仅称为客户端),它提供与服务器相同的方法。
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),它具有稍简化的语法、一些有用的新功能并支持更多语言。目前可以在 protocol buffers GitHub 仓库中找到适用于 Java、C++、Dart、Python、Objective-C、C#、lite-runtime (Android Java)、Ruby 和 JavaScript 的 Proto3,以及在 golang/protobuf 官方包中找到 Go 语言的生成器,还有更多语言正在开发中。您可以在 proto3 语言指南和每种语言的参考文档中找到更多信息。参考文档还包括 .proto
文件格式的正式规范。
通常,虽然您可以使用 proto2(当前的默认 protocol buffers 版本),但我们建议您在 gRPC 中使用 proto3,因为它允许您使用 gRPC 支持的全部语言,并避免 proto2 客户端与 proto3 服务器通信时出现的兼容性问题,反之亦然。