高效性跨平台分布式软件开发技术——gRPC

文章目录

        • 1. gRPC(google Remote Procedure Call) 技术 —— 高效性地跨平台、跨语言开发
        • 2. 基于 python 实现 gRPC 框架
          • 2.1 一个 gPRC 项目必须包含的几大部分
          • 2.2 helloworld.proto 文件——定义全局可调用函数及其参数数据结构
          • 2.3 server.py 文件——实现服务器端的全局可调用函数
          • 2.4 client.py 文件——调用在服务器代码中实现的全局函数
          • 2.5 运行结果
        • 3. 基于gRPC技术搭建一个简单的Agent学习系统

相信不少人在做项目开发的时候都会遇到这样的问题:一套系统中不同部分的代码会部署在多个不同的设备平台上,多个平台间需要保证数据相连。对于分布式部署的系统来说,高效的通信直接决定了整个系统的性能。此外,由于平台的多样性,不同平台上所适合的编程语言也可能有所差异(如:c++、python、objective-c等)。为此,一门支持“跨平台”、“跨语言”的技术对于一个分布式部署的系统来说显得尤为重要。

1. gRPC(google Remote Procedure Call) 技术 —— 高效性地跨平台、跨语言开发

为了解决上述问题,google设计了一种远程系统调用技术,其将多个不同设备平台视为一个整体,保证了在一个设备上的代码能够对另一个设备上代码中的函数进行访问和调用,实现了多个平台之间的数据交互,且各设备间不需要约定使用同一种编程语言,这就是gRPC技术。例如,在服务器机器上使用c++实现好的函数,在客户端终端设备上可以直接使用Ruby调用,在另外一台客户端机器上也可以直接使用Android调用,很好的保证了“跨语言、跨平台”的开发流程。

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

上述4个部分是一个最简单的grpc项目所包含的文件,接下来我们依次实现每一个部分中代码,搭建一个简单的grpc项目,使得我们能够在client.py代码中调用server.py中定义的函数。这里可能有人会有疑问,如果要让client.py能调用server.py中的函数,那直接把server.py写成一个类,再在client.py中import server不就好了吗注意的是,在最终部署的时候server.py和client.py是会部署在不同的机器上的,那时候client.py的机器上是找不到server.py代码文件的,这里只是为了方便开发和讲解才把这两个文件放在同一个机器上。

2.2 helloworld.proto 文件——定义全局可调用函数及其参数数据结构

.proto文件中需要定义服务器中需要实现的全局可调用函数,以及这个函数的参数数据结构,由于我们想在服务器上实现一个客户端可以直接调用的加法器,那么在.proto文件中我们就需要明确定义这个“加法函数”,以及“加法函数”所接收的参数类型和返回值类型,helloworld.proto文件内容如下:

编写完成后保存文件,在Terminal中运行:

运行成功后会在当前目录生成两个文件: 和 。

  • –python_out:该参数指定了helloworld_pb2.py文件的生成路径。
  • –grpc_python_out:该参数指定了helloworld_pb2_grpc.py文件的生成路径。
  • -I:该参数指定了.proto文件的存放路径。
  • ./helloworld.proto:.proto文件的文件名。
2.3 server.py 文件——实现服务器端的全局可调用函数

server.py文件用于实现在.proto文件中声明的那些全局可调用函数,例如我们在helloworld.proto文件中声明了一个AddNumber()函数,那么我们就需要在server.py文件中去亲自实现这个函数,server.py文件内容如下:

在这个文件中最重要的部分就是Adder这个类,这个类是对.proto文件中的service Adder的实现,因此在.proto中service部分里定义的函数在这个Adder class中都必须要实现。AddNumber(self, request, context)函数就是其对应的实现,第二个参数request的类型和.proto中定义的AddRequest类型是一样的(这个request参数是在客户端调用这个函数时需要传入的),因此可以直接通过request.Number1 和 request.Number2来直接访问这两个整型数据。最后在函数返回的时候必须要保证值也是.proto中定义的返回值类型,最好的办法就是直接返回.proto文件中的这个对象,只是修改这个对象中的值ResultString即可。

2.4 client.py 文件——调用在服务器代码中实现的全局函数

当我们实现好了server.py中的函数后,我们就可以在客户端代码中调用这个全局函数了,在这里我们在client.py代码中去调用server.py代码中实现的Adder()函数,client.py的内容如下:

在客户端代码中首先要建立一个stub对象,该对象就是远程服务器对象,我们通过stub对象就可以访问远程服务器上实现的全部函数了。要注意的是,在传入参数里必须要和.proto文件中的传入对象完全保持一致,最好的办法还是传入一个.proto文件中所声明的对象,只是修改其中的值便可。

2.5 运行结果

依次在两个不同的Terminal中先后运行server.py和client.py,在client端的运行环境中看到成功调用了server端中的AddNumber()函数:

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年4月4日
下一篇 2020年4月4日

相关推荐