1、grpc简介
Github地址: https://github.com/grpc/grpc
- gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。
- 目前提供 C、Java 和 Go 语言版本,分别是:grpc, grpc-java, grpc-go。
- 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持。
2、protocol buffer简介
- Protocol Buffer 其实是Google出品的一种轻量 & 高效的结构化数据存储格式,性能比 Json、XML 强很多!
3、安装 grpc 和 tools
# 安装 grpc
python -m pip install grpcio -i https://pypi.doubanio.com/simple
# 安装 grpc tools
python -m pip install grpcio-tools -i https://pypi.doubanio.com/simple
4、protobuf 格式定义
文件: hello.proto
syntax = "proto3";
message HelloRequest{
string name = 1; // name 表示名称 1 代表编号
}
5、生成proto的python文件
# 注意:必须进入到proto文件所在的目录
python -m grpc_tools.protoc --python_out=. --grpc_python_out=. -I. hello.proto
# 说明:
# --python_out=. 指定生成python文件所在的目录
# --grpc_python_out=. 指定生成的grpc文件所在的目录
# -I. 指定proto文件所在的目录
6、protobuf简单测试
from protobuf_test import hello_pb2
request = hello_pb2.HelloRequest()
request.name = "jason"
res_str = request.SerializeToString()
print(res_str) # b'\n\x05jason'
# 将字符串方向解析成对象
request2 = hello_pb2.HelloRequest()
request2.ParseFromString(res_str)
print(request2.name) # jason
7、grpc开发体验
7.1 定义helloworld的proto配置文件,并使用工具命令生成python文件和rpc文件
syntax = "proto3";
service Greeter{
rpc SayHello (HelloRequest)returns(HelloReply);
}
message HelloRequest{
string name = 1;
}
message HelloReply{
string message = 1;
}
7.2 使用tools生成python文件和rpc文件
python -m grpc_tools.protoc --python_out=. --grpc_python_out=. -I. helloworld.proto
7.3 调整grpc文件引入包位置
使用工具自动生成的的rpc文件,默认导入包的位置是相对主目录,按需调整。
说明:在引入包的前面指定包路径
7.4 服务端
server.py
import grpc
from grpc_hello.proto import helloworld_pb2, helloworld_pb2_grpc
import futures
# 继承grpc生成后的GreeterServicer类
class Greeter(helloworld_pb2_grpc.GreeterServicer):
# request 和 context 都是自动生成的 无需改动,可参考源文件
def SayHello(self, request, context):
return helloworld_pb2.HelloReply(message=f"你好,{request.name}")
if __name__ == "__main__":
# 1.实例化server
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
# 2.注册逻辑到server中
helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
# 3.启动服务
server.add_insecure_port("[::]:50051")
server.start()
server.wait_for_termination() # 注意添加,否则执行完主程序自动关闭
7.5 客户端
client.py
import grpc
from grpc_hello.proto import helloworld_pb2, helloworld_pb2_grpc
if __name__ == "__main__":
# 建立连接
with grpc.insecure_channel("127.0.0.1:50051") as channel:
# 获取客户端stub
stub = helloworld_pb2_grpc.GreeterStub(channel)
# 调用远程方法(helloworld_pb2.HelloReply为rsp的类型)
rsp: helloworld_pb2.HelloReply = stub.SayHello(helloworld_pb2.HelloRequest(name="jason"))
print(rsp.message)