gRPC入門小結
gRPC是什麼
首先要知道RPC是什麼:Remote Procedure Call的簡稱,翻譯成中文就是遠端過程呼叫。
RPC主要是為了解決以下倆個問題:
-
解決分散式系統中,服務之間的呼叫問題。
-
遠端呼叫時,要能夠像本地呼叫一樣方便,讓呼叫者感知不到遠端呼叫的邏輯。
gRPC 一開始由 google 開發,是一款語言中立、平臺中立、開源的遠端過程呼叫(RPC)系統,g有global的意思
在gRPC裡客戶端應用可以像呼叫本地物件一樣直接呼叫另一臺不同的機器上服務端應用的方法,能夠更加容易的建立分散式應用和服務。
常見的RPC框架有:
-
gRPC。谷歌出品
-
Thrift。Apache出品
-
Dubbo。阿里出品,也是一個微服務框架
gRPC的4點特性:
-
使用Protocal Buffers這個強大的結構資料序列化工具
-
grpc可以跨語言使用
-
安裝簡單,擴充套件方便(用該框架每秒可達到百萬個RPC)
-
基於HTTP2協議
gRPC使用流程:
-
定義標準的proto檔案
-
生成標準程式碼
-
服務端使用生成的程式碼提供服務
-
客戶端使用生成的程式碼呼叫服務
protocol buffers是什麼
谷歌開源的一種結構資料序列化的工具,比方說JSON、XML也是結構資料序列化的工具,不同的是,
-
Protocol Buffers序列化後的資料是不可讀的,因為是二進位制流
-
使用Protocol Buffer需要事先定義資料的格式(.proto 協議檔案),還原一個序列化之後的資料需要使用到這個資料格式
-
Protocol Buffer 比 XML、JSON快很多,因為是基於二進位制流,比字串更省頻寬,傳輸速度快
基於python的程式碼實踐(健身房服務)
目錄結構:
grpc_test
protos
gym.proto
lightweight
(generated_files)
client.py
server.py
gym.proto
syntax = "proto3"; //名稱空間 package lightweight; View Code//健身房 service Gym { rpc BodyBuilding (Person) returns (Reply) { } } //誰在健身 message Person { string name = 1; repeated string actions = 2; } //結果 message Reply { int32 code = 1; string msg = 2; }
python -m grpc_tools.protoc -I=./protos --python_out=./lightweight --grpc_python_out=./lightweight ./protos/gym.proto
server.py
from concurrent import futures import logging import grpc # 支援新的包 import sys sys.path.append("lightweight") import lightweight.gym_pb2_grpc as gym_pb2_grpc import lightweight.gym_pb2 as gym_pb2 class Gym(gym_pb2_grpc.GymServicer): def BodyBuilding(self, request, context): print(f"{request.name}在健身, 動作: {list(request.actions)}") return gym_pb2.Reply(code=0, msg='ok') def serve(): server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) gym_pb2_grpc.add_GymServicer_to_server(Gym(), server) server.add_insecure_port('[::]:50051') server.start() server.wait_for_termination() if __name__ == '__main__': logging.basicConfig() serve()View Code
client.py
from __future__ import print_function import logging import grpc # 支援匯入新的包 import sys sys.path.append("lightweight") import lightweight.gym_pb2_grpc as gym_pb2_grpc import lightweight.gym_pb2 as gym_pb2 def run(): with grpc.insecure_channel('localhost:50051') as channel: stub = gym_pb2_grpc.GymStub(channel) response = stub.BodyBuilding(gym_pb2.Person( name='chenqionghe', actions=['深蹲', '臥推', '硬拉'] )) print(f'code: {response.code}, msg:{response.msg}') if __name__ == '__main__': logging.basicConfig() run()View Code
如何除錯gRPC