Google的gRPC提供了用于实现RPC(远程过程调用)工作流的框架。通过在HTTP / 2之上分层并使用协议缓冲区,gRPC有望比传统的REST + JSON API带来很多好处。
0.定义功能
让我们创建一个我们想要公开(远程调用)的函数(过程)— square_root,位于calculator.py中
import math def square_root(x): y = math.sqrt(x) return y if __name__ == '__main__': print(square_root(16))
square_root接受输入x,并将平方根返回为y。本文的其余部分将重点介绍如何通过gRPC公开square_root。
1.设置协议缓冲区
协议缓冲区是一种语言中立的机制,用于序列化结构化数据。使用它需要明确定义值及其数据类型。
让我们创建calculator.proto,它定义我们的服务要使用的消息和服务结构
syntax = "proto3"; message Number { float value = 1; } service Calculator { rpc SquareRoot(Number) returns (Number) {} }
您可以考虑以下消息和服务定义:
- Number.value将用于包含变量x和y
- Calculator.SquareRoot将用于函数square_root
2.为Python生成gRPC类
此部分可能是整个过程中最“黑匣子”的部分。我们将使用特殊的工具来自动生成类。
运行这些命令时,将遵循某些命名约定生成新文件(和类)。(您可以参考文档中使用的各种标志。在本文中,所有文件都位于单个文件夹中,命令在同一文件夹中运行。)
$ pip install grpcio $ pip install grpcio-tools $ python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. calculator.proto
生成的文件如下:
Calculator_pb2.py —包含消息类
- Calculator_pb2。请求/响应变量的编号(x和y)
Calculator_pb2_grpc.py —包含服务器和客户端类
- 服务器的Calculator_pb2_grpc.CalculatorServicer
- 客户端的Calculator_pb2_grpc.CalculatorStub
3.创建一个gRPC服务器
现在,我们拥有创建gRPC服务器calc_server.py所需的所有组件,如下所示。内联注释应解释每个部分。
import grpc from concurrent import futures import time # import the generated classes from example import calculator_pb2, calculator from example import calculator_pb2_grpc # 创建一个类来定义服务器功能 # 派生自Calculator_pb2_grpc.CalculatorServicer class CalculatorServicer(calculator_pb2_grpc.CalculatorServicer): # 公开 Calculator.square_root # 请求和响应属于数据类型,生成Calculator_pb2.Number def SquareRoot(self, request, context): response = calculator_pb2.Number() response.value = calculator.square_root(request.value) return response # 创建一个gRPC服务器 server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) # 使用生成的函数`add_CalculatorServicer_to_server` # 将定义的类添加到创建的服务器 calculator_pb2_grpc.add_CalculatorServicer_to_server(CalculatorServicer(), server) # listen on port 50051 print('Starting server. Listening on port 50051.') server.add_insecure_port('[::]:50051') server.start() # server.start不会阻塞,添加了一个睡眠循环以保持 try: while True: time.sleep(86400) except KeyboardInterrupt: server.stop(0)
我们可以使用以下命令启动服务器,
$ python calc_server.py
Starting server. Listening on port 50051.
现在我们有了一个gRPC服务器,监听端口50051。
4.创建一个gRPC客户端
完成服务器设置后,我们创建calc_client.py-仅调用函数并打印结果。
import grpc from example import calculator_pb2 from example import calculator_pb2_grpc # 打开一个gRPC通道 channel = grpc.insecure_channel('localhost:50051') # 创建一个存根(客户端) stub = calculator_pb2_grpc.CalculatorStub(channel) # 创建有效的请求消息 number = calculator_pb2.Number(value=16) # 调用 response = stub.SquareRoot(number) print(response.value)
在服务器已经侦听的情况下,我们只需运行客户端即可。
$ python calc_client.py
4.0
从顶部开始
以下是每个文件的用途。
basic-grpc-python/
├── example/calculator.py #包含函数的模块
|
├── example/calculator.proto # protobuf定义文件
|
├── example/calculator_pb2_grpc.py # 为服务器/客户端生成的类
├── example/calculator_pb2.py # 生成的消息类
|
├── server/calc_server.py # 服务器
└── client/calc_client.py # 客户端
这篇文章使用一个非常简单的示例将一个函数转换为一个远程过程,只是在表面上做文章。
当然,gRPC可以在更高级的模式(请求流,响应流,双向流)中使用,并具有其他功能,例如错误处理和身份验证。
代码参考:
https://github.com/Kitty2014/gRPC_demo
详细编辑产生code参考谷歌文档:
https://developers.google.com/protocol-buffers/docs/reference/python-generated