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