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