google的
grpc
提供了用於實現rpc(遠端過程呼叫)工作流的框架。
通過在http / 2
之上分層
並使用協議緩衝區
,grpc有望比傳統的rest + json api帶來很多好處。
讓我們建立乙個
我們想要公開(
遠端呼叫
)的函式(
過程)— square_root,位於calculator.py中
importsquare_root接受輸入x,並將平方根返回為y。math
defsquare_root(x):
y =math.sqrt(x)
returnyif
__name__ == '
__main__':
print(square_root(16))
本文的其餘部分將重點介紹如何通過grpc公開square_root。
協議緩衝區
是一種語言中立的機制,用於序列化結構化資料。
使用它需要明確定義值及其資料型別。
讓我們建立calculator.proto
,它定義我們的服務要使用的訊息和服務結構
syntax = "您可以考慮以下訊息和服務定義:proto3";
message number
service calculator
}
此部分可能
是整個過程中
最「黑匣子」的
部分。我們將使用特殊的工具來自動生成類。
執行這些命令時,將遵循某些命名約定生成新檔案(和類)。
$ 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_grpc.py —包含伺服器和客戶端類
現在,我們擁有建立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
defsquareroot(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。
完成伺服器設定後,我們建立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.py4.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可以在更高階的模式(
請求流,響應流,雙向流)中
使用,並具有其他功能,例如錯誤處理和身份驗證。
**參考:
Python中的gRPC簡化指南
google的grpc提供了乙個框架,用於實現rpc 遠端過程呼叫 工作流。通過在http 2上分層並使用協議緩衝區,grpc有望比傳統的rest json api帶來很多好處。這篇文章試圖從頭開始,採用python實現乙個簡單的功能,並通過grpc介面提供服務。因此,讓我們開始學習構建。讓我們建立...
python中grpc配置asyncio使用
安裝grpclib pip3 install grpclib protoc編譯.proto檔案,生成原始碼檔案 python m grpc tools.protoc i.python out grpclib python out helloworld.proto grpclib github官網 h...
python在Linux中實現GRPC簡單命令
先確認安裝python3後安裝grpc pip install grpcio pip install protobuf pip install grpcio tools2.編輯或使用服務方提供的 proto檔名.proto 檔案 3.編譯 proto檔名.proto 檔案 python m grpc...