Python笔记-GRPC协议应用

Python笔记-GRPC协议应用

  • 背景
  • 环境安装
    • proto协商编写
    • 根据proto生成Python代码
    • 编写服务端的操作逻辑
    • 编写客户端逻辑
    • proto的编写

背景

使用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.pyhelloworld_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官方可以获取到很多这方面的教程,祝大家的积累越来越多,开发越来越轻松

你可能感兴趣的:(python笔记,python,网络协议)