google的grpc提供了乙個框架,用於實現rpc(遠端過程呼叫)工作流。 通過在http / 2上分層並使用協議緩衝區,grpc有望比傳統的rest + json api帶來很多好處。
這篇文章試圖從頭開始,採用python實現乙個簡單的功能,並通過grpc介面提供服務。
因此,讓我們開始學習構建。
讓我們建立乙個要公開遠端呼叫的 square_root 函式,它位於calculator.py 中。
import math
defsquare_root
(x):
y = math.sqrt(x)
return y
square_root 接受輸入x,並將平方根返回為 y。 本文的其餘部分將重點介紹如何通過grpc 公開 square_root 這個函式。
協議緩衝區是一種語言中立的機制,用於序列化結構化資料。 使用它需要明確定義值及其資料型別。
讓我們建立 calculator.proto,它定義我們的服務要使用的訊息(message)和服務結構(service structures)。
syntax = "proto3";
message number
service calculator
}
你可以考慮以下訊息(message)和服務定義(service definitions):
此部分可能是整個過程中最「黑匣子」的部分。 我們將使用特殊的工具來自動生成類。
執行下面這些命令時,將遵循某些命名約定生成新檔案和類。
$ pip install grpcio
$ pip install grpcio-tools
$ python -m grpc_tools.protoc -i. --python_out=. --grpc_python_out=. calculator.proto
生成的檔案如下:
calculator_pb2.py 包含 message 類
calculator_pb2_grpc.py 包含服務端和客戶端類
現在,我們擁有建立grpc伺服器server.py所需的所有部分,如下所示。 注釋應解釋每個部分。
import grpc
from concurrent import futures
import time
# import the generated classes
import calculator_pb2
import calculator_pb2_grpc
# import the original calculator.py
import calculator
# create a class to define the server functions, derived from
# calculator_pb2_grpc.calculatorservicer
class
calculatorservicer
(calculator_pb2_grpc.calculatorservicer)
:# calculator.square_root is exposed here
# the request and response are of the data type
# calculator_pb2.number
defsquareroot
(self, request, context)
: response = calculator_pb2.number(
) response.value = calculator.square_root(request.value)
return response
# create a grpc server
server = grpc.server(futures.threadpoolexecutor(max_workers=10)
)# use the generated function `add_calculatorservicer_to_server`
# to add the defined class to the 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(
)# since server.start() will not block,
# a sleep-loop is added to keep alive
try:
while
true
: time.sleep(
86400
)except keyboardinterrupt:
server.stop(
0)
我們可以使用以下命令啟動伺服器:
$ python server.py
starting server. listening on port 50051
.
現在我們有了乙個 grpc 伺服器,監聽埠 50051。
完成伺服器設定後,我們建立了client.py,它僅呼叫函式並列印結果。
import grpc
# import the generated classes
import calculator_pb2
import calculator_pb2_grpc
# open a grpc channel
channel = grpc.insecure_channel(
'localhost:50051'
)# create a stub (client)
stub = calculator_pb2_grpc.calculatorstub(channel)
# create a valid request message
number = calculator_pb2.number(value=16)
# make the call
response = stub.squareroot(number)
# et voilà
print
(response.value)
就是這樣!
在伺服器已經偵聽的情況下,我們只需執行客戶端即可。
$ python client.py
4.0
這篇文章使用乙個非常簡單的示例將乙個函式轉換為乙個遠端呼叫過程,這只是在非常淺層表面上做文章。
當然,grpc可以在更高階的模式(請求流,響應流,雙向流)中使用,並具有其他功能,例如錯誤處理和身份驗證。 但是,我們所有人都必須從某個簡單地方開始,我希望這篇文章對剛開始的那些人有很好的參考意義。
Python中的gRPC簡化指南
google的 grpc 提供了用於實現rpc 遠端過程呼叫 工作流的框架。通過在http 2 之上分層 並使用協議緩衝區 grpc有望比傳統的rest json api帶來很多好處。讓我們建立乙個 我們想要公開 遠端呼叫 的函式 過程 square root,位於calculator.py中 im...
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...