美文网首页
python grpc搭构服务

python grpc搭构服务

作者: georgeguo | 来源:发表于2020-06-25 16:06 被阅读0次

    阅读本文前需要对gprc、protobuf有些基本的了解。本文主要从proto文件的编写、proto文件生成py文件、客户端和服务端生成3个方面讲解基于python grpc搭建rpc服务的流程。

    1 编写proto文件

    proto是一个协议文件,客户端和服务器的通信接口正是通过proto文件协定的,可以根据不同语言生成对应语言的代码文件。因此,grpc创建的是一个语言无关的服务,只要proto一直,服务端和客服端可以使用不同的语言进行开发。

    syntax = "proto3";
    
    service WindServer {
        rpc wind_predict(Request) returns (Response) {}
    }
    
    message Request {
        string content = 1;
    }
    
    message Response {
        string msg = 1;
        int32 code = 2;
    }
    

    2 通过proto生成.py文件

    proto文件需要通过protoc生成对应的.py文件。protoc的下载地址。下载解压之后,将解压目录添加到path的环境变量中。

    2.1 安装grpcio、grpcio-tools、protobuf

    pip install grpcio==1.30.0
    pip install grpcio-tools==1.30.0
    pip install protobuf==3.12.2
    

    2.2 生成pb2和pb2_grpc文件

    注意:【该命令是在proto文件所在的目录执行的】

    python -m grpc_tools.protoc -I. --python_out=.. --grpc_python_out=.. wind.proto
    
    • -I 指定proto所在目录
    • -m 指定通过protoc生成py文件
    • --python_out生成py文件的输出路径
    • wind.proto 输入的proto文件

    执行完上述命令之后,输入wind_pb2.py和wind_pb2_grpc.py两个文件。

    3 编写grpc服务端和客服端

    服务端代码

    import grpc
    import logging
    from concurrent import futures
    
    import proto.wind_pb2 as wind_pb2
    import proto.wind_pb2_grpc as wind_pb2_grpc
    
    class WindPredictSrv(wind_pb2_grpc.WindServerServicer):
    
        def wind_predict(self, request, context):
            print(request.content)
            return wind_pb2.Response(msg='%s!' % request.content)
    
    def server():
        grpc_server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
        wind_pb2_grpc.add_WindServerServicer_to_server(WindPredictSrv(), grpc_server)
        grpc_server.add_insecure_port('[::]:50051')
        grpc_server.start()
        grpc_server.wait_for_termination()
    
    if __name__ == '__main__':
        logging.basicConfig()
        server()
    

    客服端代码

    import grpc
    import logging
    from __future__ import print_function
    
    import proto.wind_pb2 as wind_pb2
    import proto.wind_pb2_grpc as wind_pb2_grpc
    
    def run():
        option = [('grpc.keepalive_timeout_ms', 10000)]
        with grpc.insecure_channel(target='localhost:50051', options=option) as channel:
            stub = wind_pb2_grpc.WindServerStub(channel)
            response = stub.wind_predict(wind_pb2.Request(content='hello grpc'), timeout=10)
        print("Greeter client received: " + response.msg)
    
    if __name__ == '__main__':
        logging.basicConfig()
        run()
    

    说明

    • 本文未列举单向流、双向流式的通信,有机会继续完善。具体可以参考grpc的官方示例。

    相关文章

      网友评论

          本文标题:python grpc搭构服务

          本文链接:https://www.haomeiwen.com/subject/uzysfktx.html