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()