参考博客: 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()