gRPC系统 - 远程数据调用系统

参考博客: Python语言实现gRPC通信_python grpc_蓝绿色~菠菜的博客-CSDN博客


gRPC是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。

定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。

pip install grpcio      # gRPC 的安装 
pip install protobuf    # ProtoBuf 相关的 python 依赖库
pip install grpcio-tools    # python grpc 的 protobuf 编译工具

1、新建data.proto文件

定义传输的数据格式和grpc服务要实现的函数。

grpc传输协议传输的数据类型为protobuf 数据,ProtoBuf是由Google开发的一种数据序列化协议(类似于XML、JSON、hessian)。ProtoBuf能够将数据进行序列化,并广泛应用在数据存储、通信协议等方面。压缩和传输效率高,语法简单,表达力强。所以grpc都是和protobuf一块使用

syntax = "proto3";
package base_package;
 
service FormatData {   //定义服务,用在rpc传输中
  rpc DoFormat(actionrequest) returns (actionresponse){}
}
message actionrequest {
  string text = 1;
}
message actionresponse{
  string text=1;
}

2、生成proto数据的python调用格式和grpc服务接口

在proto文件目录下 调用下列命令

python -m grpc_tools.protoc -I. --python_out=./base_package --grpc_python_out=./base_package ./data.proto

会生成:data_pb2.py 与 data_pb2_grpc.py, 其中data_pb2.py是数据格式调用的文件,data_pb2_grpc.py是grpc传输协议接口调用的文件.

3、创建服务端

在服务器端代码中需要实现proto文件中定义的服务接口(FormatData),并重写处理函数(DoFormat),将重写后的服务类实例化以后添加到grpc服务器中.

import grpc
import time
from concurrent import futures
from base_package import data_pb2, data_pb2_grpc
 
_ONE_DAY_IN_SECONDS = 60 * 60 * 24
_HOST = 'localhost'
_PORT = '8080'
 
class FormatData(data_pb2_grpc.FormatDataServicer):
    # 重写接口函数
    def DoFormat(self, request, context):
        str = request.text
        return data_pb2.actionresponse(text=str.upper())  # 返回一个类实例
 
 
def serve():
    # 定义服务器并设置最大连接数,corcurrent.futures是一个并发库,类似于线程池的概念
    grpcServer = grpc.server(futures.ThreadPoolExecutor(max_workers=4))   # 创建一个服务器
    data_pb2_grpc.add_FormatDataServicer_to_server(FormatData(), grpcServer)  # 在服务器中添加派生的接口服务(自己实现了处理函数)
    grpcServer.add_insecure_port(_HOST + ':' + _PORT)    # 添加监听端口
    grpcServer.start()    #  启动服务器
    try:
        while True:
            time.sleep(_ONE_DAY_IN_SECONDS)
    except KeyboardInterrupt:
        grpcServer.stop(0) # 关闭服务器
 
 
if __name__ == '__main__':
    serve()
 

4、创建客户端

import grpc
from base_package import data_pb2, data_pb2_grpc
 
_HOST = 'localhost'
_PORT = '8080'
 
def run():
    conn = grpc.insecure_channel(_HOST + ':' + _PORT)  # 监听频道
    client = data_pb2_grpc.FormatDataStub(channel=conn)   # 客户端使用Stub类发送请求,参数为频道,为了绑定链接
    response = client.DoFormat(data_pb2.actionrequest(text='hello,world!'))   # 返回的结果就是proto中定义的类
    print(response)
    print("received: " + response.text)
 
if __name__ == '__main__':
    run()

猜你喜欢

转载自blog.csdn.net/March_A/article/details/129847702