您好,登錄后才能下訂單哦!
gRPC傳輸協(xié)議如何在Python項(xiàng)目中使用?相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
gRPC 簡介:
gRPC 是一款高性能、開源的 RPC 框架,產(chǎn)自 Google,基于 ProtoBuf 序列化協(xié)議進(jìn)行開發(fā),支持多種語言(Golang、Python、Java等),本篇只介紹 Python 的 gRPC 使用。因?yàn)?gRPC 對 HTTP/2 協(xié)議的支持使其在 Android、IOS 等客戶端后端服務(wù)的開發(fā)領(lǐng)域具有良好的前景。gRPC 提供了一種簡單的方法來定義服務(wù),同時(shí)客戶端可以充分利用 HTTP2 stream 的特性,從而有助于節(jié)省帶寬、降低 TCP 的連接次數(shù)、節(jié)省CPU的使用等。
安裝:
gRPC 的安裝:
$ pip install grpcio
安裝 ProtoBuf 相關(guān)的 python 依賴庫:
$ pip install protobuf
安裝 python grpc 的 protobuf 編譯工具:
$ pip install grpcio-tools
GRPC使用案例
下看一下項(xiàng)目目錄結(jié)構(gòu)
grpc是一套傳輸協(xié)議,我們需要在底層實(shí)現(xiàn)這套傳輸協(xié)議.當(dāng)然這些工作都已經(jīng)被做完了,所以我們只要學(xué)會使用一個(gè)具有g(shù)rpc傳輸協(xié)議的服務(wù)器和在客戶端上調(diào)用grpc傳輸協(xié)議傳輸數(shù)據(jù)就可以了.
grpc傳輸協(xié)議傳輸?shù)臄?shù)據(jù)類型為protobuf數(shù)據(jù).所以grpc都是和protobuf一塊使用.
(1)新建data.proto文件,定義傳輸?shù)臄?shù)據(jù)格式和grpc服務(wù)要實(shí)現(xiàn)的函數(shù)
syntax = "proto3"; package example; service FormatData { //定義服務(wù),用在rpc傳輸中 rpc DoFormat(actionrequest) returns (actionresponse){} } message actionrequest { string text = 1; } message actionresponse{ string text=1; }
(2)生成proto數(shù)據(jù)的python調(diào)用格式和grpc服務(wù)接口
在proto文件目錄下 調(diào)用下列命令
$ python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. ./data.proto
會生成:data_pb2.py 與 data_pb2_grpc.py, 其中data_pb2.py是數(shù)據(jù)格式調(diào)用的文件,data_pb2_grpc.py是grpc傳輸協(xié)議接口調(diào)用的文件.
(3)創(chuàng)建實(shí)現(xiàn)了grpc傳輸協(xié)議的服務(wù)器端
在服務(wù)器端代碼中需要實(shí)現(xiàn)proto文件中編寫的服務(wù)接口,并重寫處理函數(shù),將重寫后的服務(wù)類實(shí)例化以后添加到grpc服務(wù)器中,這樣創(chuàng)建的grpc服務(wù)器就可以實(shí)現(xiàn)自定義的proto傳輸服務(wù)了.
# 實(shí)現(xiàn)了 server 端用于接收客戶端發(fā)送的數(shù)據(jù),并對數(shù)據(jù)進(jìn)行大寫處理后返回給客戶端 # ! /usr/bin/env python # -*- coding: utf-8 -*- import grpc import time from concurrent import futures from example import data_pb2, data_pb2_grpc _ONE_DAY_IN_SECONDS = 60 * 60 * 24 _HOST = 'localhost' _PORT = '8080' # 實(shí)現(xiàn)一個(gè)派生類,重寫rpc中的接口函數(shù).自動(dòng)生成的grpc文件中比proto中的服務(wù)名稱多了一個(gè)Servicer class FormatData(data_pb2_grpc.FormatDataServicer): # 重寫接口函數(shù).輸入和輸出都是proto中定義的Data類型 def DoFormat(self, request, context): str = request.text return data_pb2.actionresponse(text=str.upper()) # 返回一個(gè)類實(shí)例 def serve(): # 定義服務(wù)器并設(shè)置最大連接數(shù),corcurrent.futures是一個(gè)并發(fā)庫,類似于線程池的概念 grpcServer = grpc.server(futures.ThreadPoolExecutor(max_workers=4)) # 創(chuàng)建一個(gè)服務(wù)器 data_pb2_grpc.add_FormatDataServicer_to_server(FormatData(), grpcServer) # 在服務(wù)器中添加派生的接口服務(wù)(自己實(shí)現(xiàn)了處理函數(shù)) grpcServer.add_insecure_port(_HOST + ':' + _PORT) # 添加監(jiān)聽端口 grpcServer.start() # 啟動(dòng)服務(wù)器 try: while True: time.sleep(_ONE_DAY_IN_SECONDS) except KeyboardInterrupt: grpcServer.stop(0) # 關(guān)閉服務(wù)器 if __name__ == '__main__': serve()
(4)創(chuàng)建實(shí)現(xiàn)能識別proto數(shù)據(jù)類和實(shí)現(xiàn)grpc傳輸協(xié)議.
# 實(shí)現(xiàn)了客戶端用于發(fā)送數(shù)據(jù)并打印接收到 server 端處理后的數(shù)據(jù) # ! /usr/bin/env python # -*- coding: utf-8 -*- import grpc from example import data_pb2, data_pb2_grpc _HOST = 'localhost' _PORT = '8080' def run(): conn = grpc.insecure_channel(_HOST + ':' + _PORT) # 監(jiān)聽頻道 print(conn) client = data_pb2_grpc.FormatDataStub(channel=conn) # 客戶端使用Stub類發(fā)送請求,參數(shù)為頻道,為了綁定鏈接 print(client) response = client.DoFormat(data_pb2.actionrequest(text='hello,world!')) # 返回的結(jié)果就是proto中定義的類 print("received: " + response.text) if __name__ == '__main__': run()
看完上述內(nèi)容,你們掌握gRPC傳輸協(xié)議如何在Python項(xiàng)目中使用的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。