1.環境安裝:
pip install grpcio
pip install protobuf
pip install grpcio-tools
2.新建proto文件grpchello.proto,定義接口,內容如下:
syntax = "proto3";
package grpcDemo;
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
message CalcRequest {
int32 para1 = 1;
int32 para2 = 2;
string para3 = 3;
}
message CalcReply {
int32 ret = 1;
}
service gRPC {
rpc SayHello (HelloRequest) returns (HelloReply) {}
rpc Calc(CalcRequest) returns (CalcReply) {}
}
4.運行命令生成proto對應語言的描述文件(protobuf描述文件及grpc的描述文件)
python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. grpchello.proto
(運行的命令太長不好記憶,一般建立腳本文件保存該命令,下次要運行命令只要運行對應腳本文件就行)
運行命令會生成protobuf對應描述文件grpchello_pb2.py和grpc對應描述文件grpchello_pb2_grpc.py,這兩個文件供客戶端和服務端使用
5.實現服務端server.py
#coding=utf-8
from concurrent import futures
import time
import grpc
import grpchello_pb2
import grpchello_pb2_grpc
_ONE_DAY_IN_SECONDS = 60 * 60 * 24
#繼承接口基類,並實現基類中的方法
class MyServer(grpchello_pb2_grpc.gRPCServicer):
def SayHello(self, request, context):
print(request.name)
message = "hello,this is my test result:" + request.name
return grpchello_pb2.HelloReply(message = message)
def Calc(selr, request, context):
print("req.para1:" + str(request.para1))
print("req.para2:" + str(request.para2))
print("req.para3:" + str(request.para3))
ret = 0
if request.para3 == "+":
ret = request.para1 + request.para2
elif request.para3 == "-":
ret = request.para1 - request.para2
elif request.para3 == "*":
ret = request.para1 * request.para2
elif request.para3 == "/":
ret = request.para1 / request.para2
else:
ret = 0
print(str(request.para1) + str(request.para3) + str(request.para2) + "=" + str(ret))
return grpchello_pb2.CalcReply(ret = ret)
def serve():
#設置服務線程數
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
#註冊服務
grpchello_pb2_grpc.add_gRPCServicer_to_server(MyServer(), server)
#設置服務ip和port
server.add_insecure_port('[::]:50051')
print("sever is opening ,waiting for message...")
#非阻塞啓動
server.start()
try:
while True:
time.sleep(_ONE_DAY_IN_SECONDS)
except KeyboardInterrupt:
server.stop(0)
if __name__ == "__main__":
serve()
6.實現客戶端client.py
#coding:utf-8
from __future__ import print_function
import grpc
import grpchello_pb2
import grpchello_pb2_grpc
def run():
channel = grpc.insecure_channel('localhost:50051')#這個是線程這全的通道
stub = grpchello_pb2_grpc.gRPCStub(channel)
#建立的連接是長邊接,服務關閉重啓後會自動重連
while True:
try:
response = stub.SayHello(grpchello_pb2.HelloRequest(name="hello, this is my test request!"))
print("Greeter client received: " + response.message)
response = stub_2.Calc(grpchello_pb2.CalcRequest(para1 = 2, para2 = 1, para3 = "+"))
print(response)
response = stub_2.Calc(grpchello_pb2.CalcRequest(para1 = 2, para2 = 1, para3 = "-"))
print(response)
response = stub.Calc(grpchello_pb2.CalcRequest(para1 = 2, para2 = 1, para3 = "*"))
print(response)
response = stub.Calc(grpchello_pb2.CalcRequest(para1 = 2, para2 = 1, para3 = "/"))
print(response)
except Exception,err:
print(err)
return
if __name__ == "__main__":
run()