本来已经快写完了,。手贱关了网页,只能重头开始写哇!
Grpc是Google一个开源的基于http/2的一个rpc(远程过程调用)框架,同时使用 protocol buffers (类似json)来作为序列化和反序列化,支持多种语言。
本文主要内容为
* 在一个 .proto 文件内定义服务。
*用 protocol buffer 编译器生成服务器和客户端代码。
*使用 gRPC 的 Python API 来实现一个简单的客户端和服务器。
首先我们要在python使用grpc,先安装pip,接下来开始安装必要的包和库
安装gRPC: pip install grpc
安装 ProtocolBuffers 相关的 python 依赖库: pip install protobuf
安装 python grpc 的 protobuf 编译工具: pip install grpcio-tools
然后可以开始定义一个服务(创建客户端和服务端方法等)
服务文件格式为 xx.proto
下面文件名为 hello.proto
message为参数和返回值格式 rpc为方法 syntax设置当前版本
syntax = "proto3";
service Action{
rpc hihi(ActionRequest) returns (ActionResponse){}
}
message ActionRequest {
string action = 1;
}
message ActionResponse{
string message = 1;
}
下一段长长的指令来编译出两个py文件 python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. ./hello.proto
编译生成 hello_pd2.py和hello_pd2_grpc.py两个文件
客户端和服务端通过继承 编译产生的两个文件的基类来完成
首先是服务端的构建
from concurrent import futures
import time
import grpc
import helloworld_pb2
import helloworld_pb2_grpc
_ONE_DAY_IN_SECONDS = 60 * 60 * 24
#继承基类
class Greeter(helloworld_pb2_grpc.GreeterServicer):
def SayHello(self, request, context):
return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name)
def serve():
#定义服务器并设置最大连接数,corcurrent.futures是一个并发库,类似于线程池的概念
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
#添加一个服务
helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server)
#设置服务器监听端口号
server.add_insecure_port('[::]:50051')
server.start()
try:
while True:
time.sleep(_ONE_DAY_IN_SECONDS)
except KeyboardInterrupt:
server.stop(0)
if __name__ == '__main__':
serve()
以下是客户端代码
from __future__ import print_function
import grpc
import helloworld_pb2
import helloworld_pb2_grpc
def run():
#创建客户端与服务端的连接
channel = grpc.insecure_channel('IP:PORT')
stub = helloworld_pb2_grpc.GreeterStub(channel)
#直接发起请求 (请求参数根据格式来)
response = stub.SayHello(helloworld_pb2.HelloRequest(name='you'))
print("Greeter client received: " + response.message)
if __name__ == '__main__':
run()
grpc简例完成!