Python笔记-GRPC协议应用
背景
使用Python编写自动化测试用例,测试GRPC接口的健壮性
环境安装
python -m pip install grpcio
python -m pip install grpcio-tools
proto协商编写
服务端于客户端的人员在负责各自的开发之前,都会先讨论将该文件讨论定下来,形成对接协议;
/* 以下为helloworld.proto文件的内容 */
syntax = "proto3"
service Greeter {
rpc SayHello(HelloRequest) return (HelloReply){}
};
message HelloRequest {
string name = 1;
};
message HelloReply {
string message = 1;
};
根据proto生成Python代码
此处生成的代码,包括了协议定义的结构体,就不需要我们手动再去写一次协议的结构,包括请求体和响应体的数据结构;
python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. ./helloworld.proto
执行完以上指令后,会在当前的目录下看到两个新的文件helloworld_pb2.py
和helloworld_pb2_grpc.py
这两个文件里面主要需要关注的有如下结构体
/* 客户端需要关注的 /
helloworld_pb2_grpc.GreeterStub
/ 服务端需要关注的 */
helloworld_pb2_grpc.GreeterServicer
/ * 都需要关注的 */
helloworld_pb2.HelloRequest
helloworld_pb2.HelloReply
编写服务端的操作逻辑
服务端提供了SayHello这个接口调用,那么当客户端通过请求参数helloworld_pb2.HelloRequest
进行调用时,服务端做相应的操作并给予响应helloworld_pb2.HelloReply
#以下为greeter_server.py的内容
from concurrent import futures
import logging
import grpc
import helloworld_pb2
import helloworld_pb2_grpc
class Greeter(helloworld_pb2_grpc.GreeterServicer):
def SayHello(self, request, context):
#do somethine
return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name)
def serve():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
server.add_insecure_port('[::]:50051')
server.start()
server.wait_for_termination()
if __name__ == '__main__':
logging.basicConfig()
serve()
编写客户端逻辑
客户端的开发者,需要通过服务端暴露的grpc接口来进行交互,分别存在通道与自定义协议两个概念,通道传输这块由GRPC进行了统一性的封装,开发者可以不深入了解,如上文中通过命令生成的两个.py
文件,就是实现了底下通道传输的工作;我们只需要专注我们业务方面的协议,和服务端协商好的SayHello接口的请求以及响应参数;
# 以下内容为greeter_client.py
from __future__ import print_function
import logging
import grpc
import helloworld_pb2
import helloworld_pb2_grpc
def run():
with grpc.insecure_channel('localhost:50051') as channel:
stub = helloworld_pb2_grpc.GreeterStub(channel)
rsp = stub.SayHello(helloworld_pb2.HelloRequest(name='client'))
print("Client received: " + rsp.message)
if __name__ == '__main__':
logging.basicConfig()
run()
proto的编写
在这里就不深入介绍proto的编写,通过GRPC官方可以获取到很多这方面的教程,祝大家的积累越来越多,开发越来越轻松