Python_GRPC服务搭建

    Python_GRPC服务搭建

简介
gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。目前提供 C、Java 和 Go 语言版本,分别是:grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持。gRPC 基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等特。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。gRPC 提供了一种简单的方法来定义服务,同时客户端可以充分利用 HTTP/2 stream 的特性,从而有助于节省带宽、降低 TCP 的连接次数、节省CPU的使用等。

gRPC 默认使用 protocol buffers,这是 Google 开源的一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。

gRPC 的安装: 1、pip install grpcio 安装 ProtoBuf 相关的 python 依赖库 2、pip install protobuf 安装 python grpc 的 protobuf 编译工具: 3、pip install grpcio-tools

实践
定义一个消息类型
先来看一个非常简单的例子。假设你想定义一个“搜索请求”的消息格式,每一个请求含有一个查询字符串、你感兴趣的查询结果所在的页数,以及每一页多少条查询结果。可以采用如下的方式来定义消息类型的.proto文件了:
1.准备.proto文件
`syntax = "proto3";
package order;
message OrderRequest {// 定义请求数据
string phone = 1;
string price = 2;
map<string, string> request_arg = 3;//便于字段扩展
}

message JSONResponse{// 定义返回格式
string rst_string = 1; //统一返回json字符串作处理
}

service OrderHandler {
// format a list of events.
rpc create_order (OrderRequest) returns (JSONResponse) {}
}
// 其中:
// message: 定义数据结构

// service: 定义接口的名字,参数,`

2.生成所需文件(服务器和客户端均需要) 运行后会生成两个文件(pub_pb2.py, pub_pb2_grpc.py)
python3 -m grpc_tools.protoc -I./ --python_out=. --grpc_python_out=. ./pub.proto

3.编写server端代码
`import time
import test_pb2
import test_pb2_grpc
import grpc

def test(request):

实际调用到的函数

json_response = test_pb2.JSONResponse()
json_response.rst_string = json.dumps({"ret":"Hi gRPC"})# 构造出proto文件中定义的返回值格式
return json_response

class OrderHandler(test_pb2_grpc.OrderHandlerServicer):
'''
gRPC请求会进入这个类中进行分发,根据客户端请求的方法找到对应的处理方法
感兴趣的可以打断点查看request, context中的内容,他们包含了请求的所有信息
'''

def create_order(self, request, context):
return test(request, context)

def serve():

开启gRPC服务,监听特定端口,

server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
test_pb2_grpc.add_OrderHandlerServicer_to_server(
OrderHandler(), server)
server.add_insecure_port('[::]:{}'.format(12006))
server.start()
try:
while True:
time.sleep(186400)
except KeyboardInterrupt:
server.stop(0)
serve()
`

4.编写客户端代码进行 测试 client.py
`import grpc
import test_pb2_grpc
import test_pb2

channel = grpc.insecure_channel("127.0.0.1:12006")
stub = test_pb2_grpc.OrderHandlerStub(channel)

要完成请求需要先构造出proto文件中定义的请求格式

ret = stub.create_order(test_pb2.OrderRequest(phone="12990", price="50"))

print(ret.rst_string)
`

5、运行代码
首先运行服务端代码 python server/main.py 然后运行客户端代码 python client/main.py

posted @ 2022-04-22 15:33  爱文飞翔  阅读(399)  评论(0编辑  收藏  举报