目录
编译python用的protobuf
Python 调用gRPC,也需要编译对应的proto文件,编译前需要安装必备的模块
# 安装模块
pip install grpcio
# 安装编译工具
pip install grpcio-tools
# 在pb文件夹命令行运行,编译出.py文件
python.exe -m grpc_tools.protoc --python_out=. --grpc_python_out=. -I. grpc.proto
得到文件:grpc_pb2_grpc.py、grpc_pb2.py
把文件移动到python目录下,新建python文件client.py
和server.py
python gRPC客户端
client.py
import grpc
import grpc_pb2
import grpc_pb2_grpc
def run():
# 连接 rpc 服务器
conn = grpc.insecure_channel('localhost:10086')
# 调用 rpc 服务
client = grpc_pb2_grpc.GRPCStub(conn)
req = client.Ping(grpc_pb2.ping(msg='from python client'))
print("python client received: " + req.msg)
if __name__ == '__main__':
run()
完成客户端后,就可以用已经写好的go语言grpc服务器做测试,理论上已经可以跨语言调用了。
- go语言服务端:
go run main.go
- python客户端:
python client.py
测试通过! go语言和python已经连起来了!! 接下来编写python服务端,go语言来调用
Python gRPC服务
server.py
from concurrent import futures
import grpc
import grpc_pb2
import grpc_pb2_grpc
# 实现 proto 文件中定义的 GRPCServicer
class RpcServer(grpc_pb2_grpc.GRPCServicer):
# 实现 proto 文件中定义的 rpc 调用
def Ping(self, request, context):
print(request.msg)
return grpc_pb2.pong(msg = 'reply from python')
def serve():
# 启动 rpc 服务
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
grpc_pb2_grpc.add_GRPCServicer_to_server(RpcServer(), server)
server.add_insecure_port('[::]:10086')
server.start()
server.wait_for_termination()
if __name__ == '__main__':
serve()
运行测试:
- python服务:
python server.py
- go客户端:
go run main.go
- python客户端:
python client.py
可以看到,python的客户端和go的客户端都可以远程调用python的服务端,实验成功~