什么是RPC?
RPC是Remote Procedure Call的简称,翻译成中文就是远程过程调用。
区别于LPC,Local Procedure Call本地过程调用。RPC就是提供跨进程访问的一种机制。
我们知道不同进程之间是不能直接访问的,需要通过跨进程访问的方式进行互相调用。
安卓跨进程的方式有:Binder、ContentProvide、Handler、GRPC
跨进程调用的过程如下图:
详细了解RPC可以参阅 如何给老婆解释什么是RPC,文章通俗易懂,浅显有趣。
什么是GRPC?
可以阅读官方文档Introduction to gRPC
GRPC使用protocol buffers作为其接口声明语言(IDL),作为其底层通信交换格式,类似于android中的(AIDL)Android Interface Definition Language。
使用GRPC,可以在不同设备上,client端直接调用server端的方法,就像调用本地方法那样,使创建分布式的应用和服务变得更简单。和很多RPC系统一样,GRPC基于围绕定义服务的思想,指定方法的参数和返回值以便能被远程调用。在server端,server实现这个接口并且运行GPRC服务用来处理client端的调用。在client端,client持有一个stub,其提供和server端一样的方法。
GRPC的client和server可以运行和交互在不同的环境-从google内部服务器到你的桌面,可以编写任何GPRC支持的语言。因此,比如你可以用java编写GRPC的server端,用go、python、Ruby编写GRPC的client端。此外,最新的 Google API 将具有其接口的 gRPC 版本,让您可以轻松地将 Google 功能构建到您的应用程序中。
以上是官方对GRPC的介绍。我认为,GPRC是一种跨进程通信的机制,以protocol buffers作为通信语言格式(好比json常用做http通信的语言格式),提供跨进程的通信方式,并提供了不通语言的通信。
使用protocol buffers?
默认GRPC使用protocol buffers ,它是Google用于序列化结构化数据的成熟开源机制。如果你熟悉protocol buffers,请自由浏览下一章。
使用protocol buffers的第一步是定义用于序列化的数据结构在proto文件中。这是一个原始为text文本格式的以.proto扩展名结尾。
protocol buffers的数据结构是message,其中每条消息都是一个小的信息逻辑记录,包含一系列称为字段的名称-值对,下面有一个简单的例子:
message Person {
string name = 1;
int32 id = 2;
bool has_ponycopter = 3;
}
然后,一旦你制定了你的数据结构,你使用protocol buffers 编译命令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;
}
gRPC 使用 protoc 和一个特殊的 gRPC 插件从你的 proto 文件生成代码:你得到生成的 gRPC 客户端和服务器代码,以及用于填充、序列化和检索你的消息类型的常规协议缓冲区代码。要了解有关协议缓冲区的更多信息,包括如何使用所选语言的 gRPC 插件安装协议,请参阅协议缓冲区文档。
protocol buffer versions?
虽然开源用户已经可以使用 Protocol Buffers 一段时间了,但该站点的大多数示例使用的是 Protocol Buffers 版本 3 (proto3),它具有稍微简化的语法、一些有用的新功能并支持更多语言。 Proto3 目前在 Java、C++、Dart、Python、Objective-C、C#、精简运行时(Android Java)、Ruby 和来自协议缓冲区 GitHub 存储库的 JavaScript 以及来自 golang 的 Go 语言生成器中可用protobuf 官方包,更多语言开发中。您可以在 proto3 语言指南和每种语言的参考文档中找到更多信息。参考文档还包括 .proto 文件格式的正式规范。
一般来说,虽然您可以使用 proto2(当前默认的协议缓冲区版本),但我们建议您将 proto3 与 gRPC 一起使用,因为它可以让您使用所有 gRPC 支持的语言,并避免与 proto2 客户端通信的兼容性问题proto3 服务器,反之亦然。