本文将向您介绍gRPC和协议缓冲区。gRPC使用协议缓冲区作为其IDL(接口定义语言)和其底层消息交换格式。如果您是gRPC或协议缓冲区的新手,请阅读!如果您只是想先瞻gRPC,请参阅我们的快速入门。
概述
在gRPC中,客户端应用程序可以直接调用不同机器上的服务器应用程序的方法,就像它是本地对象一样,使您更容易创建分布式应用程序和服务。与许多RPC系统一样,gRPC基于定义服务的概念,指定可以远程调用的方法的参数和返回值类型。
在服务器端,服务器实现此接口并运行gRPC服务器来处理客户端调用。在客户端,客户端有一个存根(简称为某种语言的客户端),该存根提供与服务器相同的方法。
gRPC客户端和服务器可以在各种环境中运行并交互 - 从Google内的服务器到您自己的桌面电脑 - 可以使用任何gRPC支持的语言编写。所以,您可以轻松地用Java创建gRPC服务器,使用Go,Python或Ruby创建客户端。
此外,最新的Google API将具有gRPC版本的接口,可以轻松地将Google功能构建到您的应用程序中。
使用协议缓冲区
默认情况下,gRPC使用协议缓冲区, Google成熟的开源机制用于序列化结构化数据(尽管它还可以与其他数据格式[如JSON]一起使用)。
这是一个介绍它如何工作快速指南。如果您已经熟悉协议缓冲区,请跳到下一部分。
使用协议缓冲区的第一步是定义要在proto
文件中序列化的数据结构:这是一个具有.proto
扩展名的普通文本文件。协议缓冲区数据是结构化的消息,其中每个消息包含一系列名 - 值对(称为字段)信息的小逻辑记录。这是一个简单的例子:
message Person {
string name = 1;
int32 id = 2;
bool has_ponycopter = 3;
}
然后,一旦指定了数据结构,您就可以使用协议缓冲区编译器protoc
从您的proto
定义中生成首选语言的数据访问类。
这些为每个字段(如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;
}
RPC还使用具有特殊gRPC插件(protoc
)来从您的proto
文件生成代码。你还可以使用gRPC插件,生成gRPC客户端和服务器代码,以及用于填充,序列化和检索您的消息类型的常规协议缓冲区代码。
请见下文示例。
您可以在Protocol Buffers文档中找到更多关于协议缓冲区的信息,并了解如何使用所选语言的Quickstart中的gRPC插件获取和安装protoc
。
协议缓冲区版本
虽然协议缓冲区已经用于开源用户一段时间,我们的示例使用proto3
的协议缓冲区的新风格,它具有略微简化的语法,一些有用的新功能,并支持更多的语言。
目前可用于Java,C,Python,Objective-C,C#,Android-java,Ruby和JavaScript从protocol buffers Github repo,
以及Go从golang/protobuf Github repo其他更多的语言在开发中。您可以在proto3语言指南和每种语言的参考文档(如果可用)中找到更多内容,
并查看发行说明中当前默认版本的主要差异。更多的proto3文档即将推出。
一般来说,虽然您可以使用proto2(当前的默认协议缓冲区版本),但我们建议您使用gRPC的proto3,因为它可以让您享用到更全面的语言支持,并避免与proto3服务器通话的proto2客户端的兼容性问题,反之亦然。
参考链接: What is gRPC?