阅读本文前需要对gprc、protobuf有些基本的了解。本文主要从proto文件的编写、proto文件生成py文件、客户端和服务端生成3个方面讲解基于python grpc搭建rpc服务的流程。
1 编写proto文件
proto是一个协议文件,客户端和服务器的通信接口正是通过proto文件协定的,可以根据不同语言生成对应语言的代码文件。因此,grpc创建的是一个语言无关的服务,只要proto一直,服务端和客服端可以使用不同的语言进行开发。
syntax = "proto3";
service WindServer {
rpc wind_predict(Request) returns (Response) {}
}
message Request {
string content = 1;
}
message Response {
string msg = 1;
int32 code = 2;
}
2 通过proto生成.py文件
proto文件需要通过protoc生成对应的.py文件。protoc的下载地址。下载解压之后,将解压目录添加到path的环境变量中。
2.1 安装grpcio、grpcio-tools、protobuf
pip install grpcio==1.30.0
pip install grpcio-tools==1.30.0
pip install protobuf==3.12.2
2.2 生成pb2和pb2_grpc文件
注意:【该命令是在proto文件所在的目录执行的】
python -m grpc_tools.protoc -I. --python_out=.. --grpc_python_out=.. wind.proto
- -I 指定proto所在目录
- -m 指定通过protoc生成py文件
- --python_out生成py文件的输出路径
- wind.proto 输入的proto文件
执行完上述命令之后,输入wind_pb2.py和wind_pb2_grpc.py两个文件。
3 编写grpc服务端和客服端
服务端代码
import grpc
import logging
from concurrent import futures
import proto.wind_pb2 as wind_pb2
import proto.wind_pb2_grpc as wind_pb2_grpc
class WindPredictSrv(wind_pb2_grpc.WindServerServicer):
def wind_predict(self, request, context):
print(request.content)
return wind_pb2.Response(msg='%s!' % request.content)
def server():
grpc_server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
wind_pb2_grpc.add_WindServerServicer_to_server(WindPredictSrv(), grpc_server)
grpc_server.add_insecure_port('[::]:50051')
grpc_server.start()
grpc_server.wait_for_termination()
if __name__ == '__main__':
logging.basicConfig()
server()
客服端代码
import grpc
import logging
from __future__ import print_function
import proto.wind_pb2 as wind_pb2
import proto.wind_pb2_grpc as wind_pb2_grpc
def run():
option = [('grpc.keepalive_timeout_ms', 10000)]
with grpc.insecure_channel(target='localhost:50051', options=option) as channel:
stub = wind_pb2_grpc.WindServerStub(channel)
response = stub.wind_predict(wind_pb2.Request(content='hello grpc'), timeout=10)
print("Greeter client received: " + response.msg)
if __name__ == '__main__':
logging.basicConfig()
run()
说明
- 本文未列举单向流、双向流式的通信,有机会继续完善。具体可以参考grpc的官方示例。
网友评论