python gRPC接口調用


gRPC

gRPC 是 Google 開源的基於 Protobuf 和 Http2.0 協議的通信框架。
  • gRPC官網

  
  •  python實現gRPC接口調用的方法步驟

2.1 安裝第三方包:grpcio、protobuf、grpcio_tools
1 pip install grpcio
2 pip install protobuf
3 pip install grpcio_tools    # python下的protoc編譯器

 

2.2 編寫proto文件

參考protobuf語法編寫.proto文件

2.3 編譯proto文件

將protoc文件轉化為pb2和pb2_grpc文件,操作步驟如下:

  • 命令:
 1 python3  -m  grpc_tools.protoc  --python_out=.  --grpc_python_out=.  -I. xxx.proto  -I=/workspace  -I=xxx/yyy/
 2 
 3 #說明:
 4 -I=:在proto文件中遠程調用的內容,導入路徑為實際調用的上一級目錄即可。
 5 python_out:指定xxx_pb2.py的輸出路徑,編譯生成處理protobuf相關的代碼路徑。傳入.,則默認生成到當前目錄。
 6 grpc_python_out:指定xxx_pb2_grpc.py的輸出路徑,編譯生成處理grpc相關的代碼路徑,傳入.,則默認生成到當前目錄。
 7 grpc_tools.protoc:工具包,剛安裝的。
 8 -I:這個參數指定協議文件的查找目錄。
 9  
10 # 生成的文件中:
11 xxx_pb2.py:里面有消息序列化類。是用來和protobuf數據進行交互。
12 xxx_pb2_grpc.py:包含了服務器Stub類和客戶端Stub類,以及待實現的服務RPC接口。是用來和grpc進行交互。
# 若報錯-缺少文件,則需要找對應文件,然后使用 "-I=" 導入
2.4 寫server端代碼

demo如下:

 1 # coding:utf-8
 2 
 3 import grpc
 4 import json
 5 from concurrent import futures
 6 import xxx_pb2,yyy_pb2_grpc
 7 
 8 _HOST = ''  # todo
 9 _PORT = ''  # todo
10 
11 
12 # 實現 proto 文件中定義的 xxxServicer
13 class xxxServer(yyy_pb2_grpc.xxxServicer):
14     # 實現 proto 文件中定義的GRPC調用
15     def SendRequest(self, request, context):
16         json_response = xxx_pb2.xxxResponse()
17         json_response.rst_string = json.dumps({"ret": "Hi grpc"})
18         return json_response
19 
20 
21 def serve():
22     # 啟動GRPC服務,監聽特定的端口
23     server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))  # 多線程服務器
24     yyy_pb2_grpc.add_xxxServicer_to_server(xxxServer(), server)  # 注冊本地服務
25     server.add_insecure_port("{0}:{1}".format(_HOST, _PORT))  # 監聽端口
26     server.start()  # 開始接收請求進行服務
27     try:
28         while True:
29             time.sleep(60 * 60 * 24)  # one day in seconds
30     except KeyboardInterrupt:
31         server.stop(0)
32 
33 
34 if __name__ == '__main__':
35     serve()

 

2.5 寫client端代碼

demo如下:

 1 # coding:utf-8
 2 
 3 import grpc
 4 import xxx_pb2, yyy_pb2_grpc
 5 
 6 _HOST = ''  # todo
 7 _PORT = ''  # todo
 8 
 9 
10 def main():
11     with grpc.insecure_channel("{0}:{1}".format(_HOST, _PORT)) as channel:
12         client = yyy_pb2_grpc.xxxStub(channel=channel)
13         response = client.xxxMessage(xxx_pb2.xxxRequest())
14     print("received: " + response.message + response.result)
15 
16 
17 if __name__ == '__main__':
18     main()

 

2.6 完成
 
 
  • gRPC四種通信方式

根據不同的業務場景, grpc 支持 4 種通信方式:
  • 客服端一次請求, 服務器一次應答
  • 客服端一次請求, 服務器多次應答(流式)
  • 客服端多次請求(流式), 服務器一次應答
  • 客服端多次請求(流式), 服務器多次應答(流式)
 
 

protoc

  • protoc3官網

 
  • protobuf數據格式

protobuf是Google開源的一款類似於Json,XML數據交換格式,其內部數據是純二進制格式,不依賴於語言和平台,具有簡單,數據量小,快速等優點。(是使用google規定的proto協議定義語言,之后使用proto的工具對代碼進行‘編譯’,生成對應的各個平台的源代碼,后續可以使用這些源代碼進行工作。)目前用於序列化於反序列化官方支持的語言有C++,C#,JAVA,PYTHON。適用於大小在1M以內的數據。可以使用prorobuf將內容序列化后保存在文件中,下次使用的時候,加載文件,反序列化后就可以直接使用了。
 
  • python-protobuf

  1. 在python里也需要proto文件生成對應的代碼,才能通過grpc/restful協議調后端的代碼
  2. pb其實就是協議格式/內容,restful/rpc是協議
  3. 無關乎語言, 前端(python或go), 跟后端(go或者c++) 通信的時候,都要告知發送的內容的格式--這個格式就是pb
  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM