文章目录
相信不少人在做项目开发的时候都会遇到这样的问题:一套系统中不同部分的代码会部署在多个不同的设备平台上,多个平台间需要保证数据相连。对于分布式部署的系统来说,高效的通信直接决定了整个系统的性能。此外,由于平台的多样性,不同平台上所适合的编程语言也可能有所差异(如:c++、python、objective-c等)。为此,一门支持“跨平台”、“跨语言”的技术对于一个分布式部署的系统来说显得尤为重要。
1. gRPC(google Remote Procedure Call) 技术 —— 高效性地跨平台、跨语言开发
为了解决上述问题,google设计了一种远程系统调用技术,其将多个不同设备平台视为一个整体,保证了在一个设备上的代码能够对另一个设备上代码中的函数进行访问和调用,实现了多个平台之间的数据交互,且各设备间不需要约定使用同一种编程语言,这就是gRPC技术。例如,在服务器机器上使用c++实现好的函数,在客户端终端设备上可以直接使用Ruby调用,在另外一台客户端机器上也可以直接使用Android调用,很好的保证了“跨语言、跨平台”的开发流程。

要想实现跨平台的代码调用就必然涉及到平台间的数据通信问题,数据通信效率成为了系统性能的一个重要指标。gRPC基于protobuf设计了数据互通协议,保证了数据传输时的高效性和快速性。Protocol Buffers是一种数据格式,与XML、JSON类似,但比JSON和XML更加的高效和快速,在一些高性能且对响应速度有要求的数据传输场景非常适用。在使用JSON进行数据编译时,为了保证数据的易读性JSON是以文本的形式存储和传输的,这样一来导致进行数据交换时设备需要耗费大量的CPU在I/O动作上,从而影响整个传输速率。而protobuf不同于JSON,它会将字符串都进行序列化后再进行传输,即传输的是二进制数据,此外,protobuf是基于数字tag来标识各内容,而JSON则是以字符串来标识各内容的,因此protobuf在传输速率方面有着天然的优势。
// protobuf 基于数字来确定内容段
message Person {
required string name = 1;
required int32 age = 2;
required string gender = 3;
}
// Json 基于字符串来确定内容段
{
"name" : "Wang DaChui",
"age" : "18",
"gender" : "Male"
}
2. 基于 python 实现 gRPC 框架
如上一节中的图片中所示,我们可以利用gRPC框架实现不同平台上的代码之间相互调用,这一节中,我们通过分别编写“服务器”和“客户端”这两个不同平台的代码来实现在客户端代码中调用服务器代码中的函数。为了编写方便,我们将服务器和客户端代码存放在同一个机器上的不同位置,等最后部署的时候再将代码分别部署到对应的设备平台上。
2.1 一个 gPRC 项目必须包含的几大部分
下图是一个最简单的 gRPC 项目需要包含的文件,我们先来看看这些文件分别有什么用:

- helloworld.proto:该文件的作用是“定义服务器函数” + “定义函数参数的数据类型”。
- helloworld_pb2.py 和 helloworld_pb2_grpc.py: 这两个文件是由python的grpc_tools根据helloworld.proto文件自动生成的,这两个文件保证了客户端能够调用服务器端的函数,不用修改。
- server.py:服务器(设备平台1)上的代码。
- client.py