美文网首页
python GRPC的官网示例

python GRPC的官网示例

作者: 小钟钟同学 | 来源:发表于2021-02-02 12:02 被阅读0次

    环境

    windows 10 + Python 3.7

    相关依赖包:

    image.png
    >pip install grpcio-tools
    >pip install protobuf
    >pip install grpcio
    

    错误问题:

    C:\Users\mayn\.virtualenvs\dfgd\Scripts\python.exe: Error while finding module specification for 'grpc_tools.protoc' (ModuleNotFoundError: No module named 'grpc_tools')
    

    上述错误是因为我们的没安装:grpcio-tools

    项目示例

    示例来源:https://www.jianshu.com/p/9c947d98e192

    image.png

    调用流程图示:


    image.png
    • 步骤1:新建项目,通过protobuf定义接口和数据类型,创建存在user_info.proto文件夹
    • 步骤2:新建rpc_package python包,然后根据proto文件生成对应文件
      命令:
    python -m grpc_tools.protoc -I=./protos --python_out=./rpc_package --grpc_python_out=./rpc_package ./protos/helloworld.proto
    

    结果:

    (dfgd) D:\code\python\local_python\dfgd>python -m grpc_tools.protoc -I=./protos --python_out=./rpc_package --grpc_python_out=./rpc_package ./protos/helloworld.proto
    

    改写一下我们的生产的文件,导入的时候错误问题:


    image.png
    # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
    """Client and server classes corresponding to protobuf-defined services."""
    import grpc
    
    
    # import helloworld_pb2 as helloworld__pb2
    from .helloworld_pb2 import HelloRequest,HelloReply
    
    class HelloWorldServiceStub(object):
        """define a service
        """
    
        def __init__(self, channel):
            """Constructor.
    
            Args:
                channel: A grpc.Channel.
            """
            self.SayHello = channel.unary_unary(
                    '/rpc_package.HelloWorldService/SayHello',
                    request_serializer=HelloRequest.SerializeToString,
                    response_deserializer=HelloReply.FromString,
                    )
    
    
    class HelloWorldServiceServicer(object):
        """define a service
        """
    
        def SayHello(self, request, context):
            """define the interface and data type
            """
            context.set_code(grpc.StatusCode.UNIMPLEMENTED)
            context.set_details('Method not implemented!')
            raise NotImplementedError('Method not implemented!')
    
    
    def add_HelloWorldServiceServicer_to_server(servicer, server):
        rpc_method_handlers = {
                'SayHello': grpc.unary_unary_rpc_method_handler(
                        servicer.SayHello,
                        request_deserializer=HelloRequest.FromString,
                        response_serializer=HelloReply.SerializeToString,
                ),
        }
        generic_handler = grpc.method_handlers_generic_handler(
                'rpc_package.HelloWorldService', rpc_method_handlers)
        server.add_generic_rpc_handlers((generic_handler,))
    
    
     # This class is part of an EXPERIMENTAL API.
    class HelloWorldService(object):
        """define a service
        """
    
        @staticmethod
        def SayHello(request,
                target,
                options=(),
                channel_credentials=None,
                call_credentials=None,
                insecure=False,
                compression=None,
                wait_for_ready=None,
                timeout=None,
                metadata=None):
            return grpc.experimental.unary_unary(request, target, '/rpc_package.HelloWorldService/SayHello',
                HelloRequest.SerializeToString,
                HelloReply.FromString,
                options, channel_credentials,
                insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
    
    
    • 步骤3:编写gRPC server服务端代码 gfgd_grpc_server.py
    #!/usr/bin/evn python
    # coding=utf-8
    # + + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + +
    #        ┏┓   ┏┓+ +
    #    ┏┛┻━━━┛┻┓ + +
    #    ┃       ┃  
    #    ┃   ━   ┃ ++ + + +
    #    ████━████ ┃+
    #    ┃       ┃ +
    #    ┃   ┻   ┃
    #    ┃       ┃ + +
    #    ┗━┓   ┏━┛
    #      ┃   ┃           
    #      ┃   ┃ + + + +
    #      ┃   ┃    Codes are far away from bugs with the animal protecting   
    #      ┃   ┃ +     神兽保佑,代码无bug  
    #      ┃   ┃
    #      ┃   ┃  +         
    #      ┃    ┗━━━┓ + +
    #      ┃        ┣┓
    #      ┃        ┏┛
    #      ┗┓┓┏━┳┓┏┛ + + + +
    #       ┃┫┫ ┃┫┫
    #       ┗┻┛ ┗┻┛+ + + +
    # + + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + +"""
    """
    # 版权说明
    # + + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + +
    
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at
    
        http://www.apache.org/licenses/LICENSE-2.0
    
    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
    # + + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + +
    
    # @Time  : 2021/2/2 11:43
    
    # @Author : mayn
    
    # @Project : dfgd
    
    # @FileName: gfgd_grpc_server.py
    
    # @Software: PyCharm
    
    # 作者:小钟同学
    
    # 著作权归作者所有
    
    # 文件功能描述:
    """
    
    from concurrent import futures
    import grpc
    import logging
    import time
    
    from rpc_package.helloworld_pb2_grpc import add_HelloWorldServiceServicer_to_server,HelloWorldServiceServicer
    from rpc_package.helloworld_pb2 import HelloRequest, HelloReply
    
    
    class Hello(HelloWorldServiceServicer):
    
        # 这里实现我们定义的接口
        def SayHello(self, request, context):
            return HelloReply(message='Hello, %s!' % request.name)
    
    
    def serve():
        # 这里通过thread pool来并发处理server的任务
        server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    
        # 将对应的任务处理函数添加到rpc server中
        add_HelloWorldServiceServicer_to_server(Hello(), server)
    
        # 这里使用的非安全接口,世界gRPC支持TLS/SSL安全连接,以及各种鉴权机制
        server.add_insecure_port('[::]:50000')
        server.start()
        try:
            while True:
                time.sleep(60 * 60 * 24)
        except KeyboardInterrupt:
            server.stop(0)
    
    
    if __name__ == "__main__":
        logging.basicConfig()
        serve()
    
    • 步骤4:编写gRPC client调用端代码 dfgd_grpc_clien.py
    #!/usr/bin/evn python
    # coding=utf-8
    # + + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + +
    #        ┏┓   ┏┓+ +
    #    ┏┛┻━━━┛┻┓ + +
    #    ┃       ┃  
    #    ┃   ━   ┃ ++ + + +
    #    ████━████ ┃+
    #    ┃       ┃ +
    #    ┃   ┻   ┃
    #    ┃       ┃ + +
    #    ┗━┓   ┏━┛
    #      ┃   ┃           
    #      ┃   ┃ + + + +
    #      ┃   ┃    Codes are far away from bugs with the animal protecting   
    #      ┃   ┃ +     神兽保佑,代码无bug  
    #      ┃   ┃
    #      ┃   ┃  +         
    #      ┃    ┗━━━┓ + +
    #      ┃        ┣┓
    #      ┃        ┏┛
    #      ┗┓┓┏━┳┓┏┛ + + + +
    #       ┃┫┫ ┃┫┫
    #       ┗┻┛ ┗┻┛+ + + +
    # + + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + +"""
    """
    # 版权说明
    # + + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + +
    
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at
    
        http://www.apache.org/licenses/LICENSE-2.0
    
    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
    # + + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + +
    
    # @Time  : 2021/2/2 11:44
    
    # @Author : mayn
    
    # @Project : dfgd
    
    # @FileName: dfgd_grpc_clien.py
    
    # @Software: PyCharm
    
    # 作者:小钟同学
    
    # 著作权归作者所有
    
    # 文件功能描述: 
    """
    
    from __future__ import print_function
    import logging
    
    import grpc
    from rpc_package.helloworld_pb2 import HelloRequest, HelloReply
    from rpc_package.helloworld_pb2_grpc import HelloWorldServiceStub
    
    def run():
        # 使用with语法保证channel自动close
        with grpc.insecure_channel('localhost:50000') as channel:
            # 客户端通过stub来实现rpc通信
            stub = HelloWorldServiceStub(channel)
    
            # 客户端必须使用定义好的类型,这里是HelloRequest类型
            response = stub.SayHello(HelloRequest(name='eric'))
        print ("hello client received: " + response.message)
    
    if __name__ == "__main__":
        logging.basicConfig()
        run()
    

    启动相关服务端服务和客户端:


    image.png

    相关文章

      网友评论

          本文标题:python GRPC的官网示例

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