1.前言
gRPC是一個開源的高性能并且能在任何環(huán)境中運(yùn)行的RPC框架带族,其采用protocol buffer
:
protocol buffer
是一個用于結(jié)構(gòu)化數(shù)據(jù)序列化的一個靈活的犁跪、有效率的自動化機(jī)制痪署,類似于XML(但比其更簡單晕城、小巧且簡單)鸿秆,對于某個服務(wù)需要定義的數(shù)據(jù)結(jié)構(gòu)做粤,可以使用protocol buffer
(proto3
)來進(jìn)行定義抬伺,即根據(jù)protocol buffer language
來定義你的protocol buffer data
最后再利用protocol buffer
編譯定義的 .proto
文件生成客戶端和服務(wù)端代碼,本文將舉一個小例子進(jìn)行介紹读慎,且默認(rèn)站在python的角度來編寫代碼
2.實(shí)踐
假設(shè)有這樣一個需求漱贱,將客戶端傳來的某個字符串轉(zhuǎn)化為小寫,那么贪壳,首先從定義數(shù)據(jù)結(jié)構(gòu)開始饱亿,暫時先新建如下結(jié)構(gòu)的項(xiàng)目:
demo
└── proto
└── lower.proto
接下來將編寫proto
文件蚜退,本例使用proto3
語法進(jìn)行編寫闰靴,protobuf
定義的語法請看這里
lower.proto
文件內(nèi)容如下:
syntax = "proto3";
package lower;
service Lower {
rpc Lower (LowerRequest) returns (LowerResult) {
}
}
message LowerRequest {
string message = 1;
}
message LowerResult {
string lower_message = 1;
}
定義一個服務(wù)Lower
,其接受一個字符串消息并返回小寫的字符串消息钻注,編寫完畢蚂且,下面進(jìn)行編譯,創(chuàng)建文件proto_compile.py
幅恋,并安裝相關(guān)的包:
pip install grpcio
pip install grpcio-tools
# script proto_compile.py
from grpc_tools import protoc
# 或者在項(xiàng)目根目錄運(yùn)行:
# python -m grpc_tools.protoc -I. --python_out=../ --grpc_python_out=../ ./cal.proto
protoc.main(
(
'',
'-Iproto',
'--python_out=.',
'--grpc_python_out=.',
'proto/lower.proto',
)
)
運(yùn)行后阶淘,項(xiàng)目結(jié)構(gòu)如下:
demo
├── lower_pb2_grpc.py # 編譯生成的文件
├── lower_pb2.py # 編譯生成的文件
├── proto
│ └── lower.proto
└── proto_compile.py
最后編寫客戶端以及服務(wù)端腳本lower_client.py
惜傲、lower_server.py
,內(nèi)容分別如下:
# lower_server.py
import time
import grpc
from concurrent import futures
import lower_pb2, lower_pb2_grpc
_TIME_WAIT = 10
class Lower(lower_pb2_grpc.LowerServicer):
def Lower(self, request, context):
return lower_pb2.LowerResult(lower_message=request.message.lower())
def serve():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
lower_pb2_grpc.add_LowerServicer_to_server(Lower(), server)
server.add_insecure_port('[::]:50052')
server.start()
try:
while True:
time.sleep(_TIME_WAIT)
except KeyboardInterrupt:
server.stop(0)
if __name__ == '__main__':
serve()
# lower_client.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import grpc
import lower_pb2, lower_pb2_grpc
def run():
channel = grpc.insecure_channel("localhost:50052")
stub = lower_pb2_grpc.LowerStub(channel)
response = stub.Lower(lower_pb2.LowerRequest(message="HELLO WORLD!"))
print("Message result received: %s" % response.lower_message)
if __name__ == '__main__':
run()
此時文件目錄結(jié)構(gòu)如下:
demo
├── lower_client.py
├── lower_pb2_grpc.py
├── lower_pb2.py
├── lower_server.py
├── proto
│ └── lower.proto
├── proto_compile.py
先運(yùn)行lower_server.py
,再運(yùn)行lower_client.py
浮禾,就會看到終端有結(jié)果輸出:
Message result received: hello world!
可以看到,返回小寫字符筐摘,demo
演示完畢
3.最后
以下是我了解gRPC
過程中收集的一些資料: