目录
gRPC 简介
gRPC 可以使用protobuf作为它的接口定义语言 ( IDL ) 和它的底层消息交换格式。在 gRPC 中,客户端应用程序可以直接调用不同机器上的服务器应用程序上的方法,就像它是本地对象一样,使你更容易创建分布式应用程序和服务。与许多 RPC 系统一样,gRPC 基于定义服务的思想,指定可以远程调用的方法及其参数和返回类型。在服务端,服务端实现这个接口并运行一个 gRPC 服务器来处理客户端调用。在客户端,客户端有一个存根(在某些语言中仅称为客户端),它提供与服务器相同的方法。
gRPC 客户端和服务器可以在各种环境中运行和相互通信——从 Google 内部的服务器到你自己的桌面——并且可以用任何 gRPC 支持的语言编写。因此,例如,你可以使用 Go、Python 或 Ruby 中的客户端轻松地在 Java 中创建 gRPC 服务器。此外,最新的 Google API 将具有其接口的 gRPC 版本,让你可以轻松地将 Google 功能构建到你的应用程序中。
使用protobuf
默认情况下,gRPC 使用protobuf, 谷歌成熟的结构化数据序列化开源机制(虽然它可以与其他数据格式如 JSON 一起使用)。这是它如何工作的快速介绍。如果你已经熟悉protobuf,请随时跳到下一部分。
使用protobuf的第一步是定义要在proto 文件中序列化的数据的结构:这是一个带有.proto
扩展名的普通文本文件。protobuf数据被结构化为 消息,其中每条消息都是一个小的信息逻辑记录,包含一系列称为字段的名称-值对。这是一个简单的例子:
message Person {
string name = 1;
int32 id = 2;
bool has_ponycopter = 3;
}
然后,一旦你指定了你的数据结构,你就可以使用protobuf编译器protoc
从你的原型定义中以你喜欢的语言生成数据访问类。这些为每个字段提供了简单的访问器,例如name()
and set_name()
,以及将整个结构序列化/解析到原始字节的方法。因此,例如,如果你选择的语言是 C++,则在上面的示例中运行编译器将生成一个名为Person
. 然后,你可以在应用程序中使用此类来填充、序列化和检索Person
protobuf消息。
你在普通的 proto 文件中定义 gRPC 服务,将 RPC 方法参数和返回类型指定为protobuf消息:
// 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 使用protoc
特殊的 gRPC 插件从你的 proto 文件生成代码:你将获得生成的 gRPC 客户端和服务器代码,以及用于填充、序列化和检索消息类型的常规protobuf代码。你将在下面看到一个示例。
protobuf版本
一般来说,虽然你可以使用 proto2(当前的默认protobuf版本),但我建议你将 proto3 与 gRPC 一起使用,因为它可以让你使用 gRPC 支持的所有语言,并避免与 proto2 客户端对话的兼容性问题proto3 服务器,反之亦然。