python简单集成grpc
python简单集成grpc
grpc简单介绍
grpc是Google开发的高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于Protobuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。–摘自互联网
grpc集成的难点
标准的grpc集成流程:
- 引入grpc相关库
- 定义接口的Protocol文件
- 使用工具生成相应开发语言的服务端和客户端代码
- 服务端编写接口实现
- 客户端使用
由于对每个接口都需要定义Protocol文件,和生成相关代码。 对于对Protobuf(Protocol Buffers)序列化协的开发而言,无疑增加了复杂度。那我们是否可以通过某种方法来减少Protocol文件定义和相关代码的生成? 答案是肯定的。 这就是我们接下来要介绍的。
实现思路
- 定义通用的Protocol文件, 用于描述接口的请求和响应参数
- 通用的Protocol文件,请求和响应参数 定义字节类型
- 请求和响应序列化为字节数据进行网络传递
python代码简单实现
安装依赖库
pip install grpcio
pip install protobuf
pip install grpcio_tools
通用Protocol
common.proto
syntax = "proto3";
// 定义通用的 Grpc 服务
service CommonService {
// 处理请求
rpc handle ( Request ) returns ( Response ) {}
}
// 定义通用的 Grpc 请求体
message Request {
int32 serialize = 1;
bytes request = 2;
}
// 定义通用的 Grpc 响应体
message Response {
bytes response = 1;
}
使用grpc_tools生成common.proto服务端和客户端代码
python -m grpc_tools.protoc -I ./ --python_out=./ --grpc_python_out=./ common.proto
生成了2个文件:
- common_pb2.py
- common_pb2_grpc.py
服务端和客户端公用模块core.py
import grpc
import common_pb2
import common_pb2_grpc
import pickle as pk
import inspect
class GrpcRequest:
def __init__(self, name, request):
self.name = name
self.request = request
def GrpcService(host='localhost', port=10240):
def decorator(fn):
def wrapper(*args, **kwargs):
# 连接 rpc 服务器
channel = grpc.insecure_channel('{}:{}'.format(host, port))
# 调用