【Python 上手 GRPC】(一)初体验

1 什么是 grpc

  • grpc 是一个高性能、通用的开源RPC框架,Google主要面向移动应用开发基于HTTP/2协议标准而设计的,基于ProtoBuf(Protocl Buffers)序列化协议开发。
  • grpc 提供一种简单的方法来精确地定义服务和ios、Android 和后台支持服务自动生成可靠性很强的客户端功能库。

2 什么是 protobuf

  • protobuf 是一个具有高效的协议数据交换格式工具库(类似json),但是和Json相比,Protobuf有更高的转化效率,时间效率和空间效率都 json 的3-5倍

  • 具有跨语言性: pythongojavac++

  • 常用数据类型

    类型说明
    string要求 utf-87-bitASCII编码的字符串
    bytes/
    bool/
    int32/
    int64/(对于python,进入之后都是int64)
    float/
    repeated数组(列表), repeated string data =1; (定义个元素都是 string 的数组)
    map字典(Python), map <string, string> data = 1;

在这里插入图片描述

  • 特殊字符

    类型说明
    package报名
    syntaxProtobuf 版本
    service定义服务
    rpc定义服务中的方法
    stream定义的方法传输为流传输
    message定义消息体 message User{}
    extend扩展消息体 extend Uesr()
    import导入一些插件
    //注释
  • 生成文件

    • _pb2.py文件

      • 每个 message 对应的信息存储,比如我们的 request 与 response 在这里被定义 extension
    • _pb2_grpc.py 文件

      • 用来存储每一个服务的 server 与客户端以及注册 server 的工具
      • 客户端名为:service_name + Stub
      • 服务器名为:service_name + Servicer
      • 注册服务为:add_服务器端名_to_server
      • 如果 protobuf 文件中定义了多个服务,那么就会有多个函数

3 Demo

3.1 Prerequisites

  • Python 3.5 or higher
  • pip version 9.0.1 or higher
python -m pip install --upgrade pip
3.1.1 gRPC
  • Install gRPC:
python -m pip install grpcio
3.1.2 gRPC tools

Python 的 gRPC tools包括协议缓冲区编译器 protoc 和用于从 .proto 服务定义生成服务器和客户端代码的特殊插件。

  • To install gRPC tools, run:
python -m pip install grpcio-tools

在这里插入图片描述

3.2 Project

在这里插入图片描述

3.2.1 新建protobuf 文件 hello.proto:

在这里插入图片描述

  • 创建rpc服务函数:
service MyHello {   // 写服务器里面需要的服务
    // 在里面写服务所拥有的函数, 类似于视图

    /*
    * 定义一个 rpc 函数
        函数名: HelloHenry
        request: HelloHenryReq
        response: HelloHenryReply
    */
    rpc HelloHenry(HelloHenryReq) returns (HelloHenryReply){}
}
  • 创建请求和返回函数:
message HelloHenryReq{
    string name = 1;  // 1 就是代表枚举的意思, 其实也用不上
    int32 age = 2;
}

message HelloHenryReply{    // 服务实现的内容,把请求的内容格式化拼接一下
    string result = 1;  
}

在这里插入图片描述

3.2.2 protobuf 文件转化
  • protobuf python 对应的服务端和客户端
python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. hello.proto

在这里插入图片描述

在这里插入图片描述

  • 转化生成成功:
    在这里插入图片描述
3.2.3 创建 service

在这里插入图片描述

  • 创建服务实例:

    class MyHello(pb2_grpc.MyHelloServicer): # 传入参数
    
        def HelloHenry(self, request, context):
            """
            :param request:  请求
            :param context:  上下文
            :return:
            """
            # request 即 HelloHenryReq 里的参数数据
            name = request.name
            age = request.age
    
            result = f'my name is {name}, I am {age} years old.'
    
            return pb2.HelloHenryReply(result=result)
    
  • 创建启动函数:

    # 启动服务函数
    def run():
        grpc_server = grpc.server(
            futures.ThreadPoolExecutor(max_workers=4)   # 定义线程数量
        )
        # 将 grpc 实例类注册到 grpc server,即定义的 grpc_server
        pb2_grpc.add_MyHelloServicer_to_server(servicer=MyHello(), server=grpc_server)
        # 绑定 grpc server 端口号
        grpc_server.add_insecure_port(address='0.0.0.0:5000')
        print("server will start at 0.0.0.0:5000")
        grpc_server.start() # 启动 grpc
    
        # 由于 python 中执行 start 只会启动一下, 所以加下面的语句一直执行,直至手动停止
        try:
            while 1:
                time.sleep(3600)
        except KeyboardInterrupt:
            grpc_server.stop(0)
    
  • 启动服务
    在这里插入图片描述

3.2.4 创建 client

在这里插入图片描述

  • 创建启动函数

    def run():
        # Step 1. 定义一个通道
        conn = grpc.insecure_channel('0.0.0.0:5000')
        # Step 2. 创建 client
        client = pb2_grpc.MyHelloStub(channel=conn)
        response = client.HelloHenry(pb2.HelloHenryReq(
            name='大保健',
            age=33
        ))
        print(response.result)
    

在这里插入图片描述

  • 启动客户端
    在这里插入图片描述

常见错误:

1、错误分析:

在这里插入图片描述

  • service 代码类中创建的 rpc 服务函数函数名错误,该名字应该和 proto 文件中的 rpc 函数名一致

在这里插入图片描述

  • 修改
    在这里插入图片描述

2、错误分析:

AttributeError: module ‘google.protobuf.descriptor‘ has no attribute ‘_internal_create_key‘
  • 解决方案

    1. 查看protoc的版本,在命令行输入如下代码:

    protoc --version

    2. 查看protobuf版本:

    pip show protobuf

    如果两个版本不一致,那么请将两个的版本保持到一致。

    可以使用如下pip安装命令对protobuf升级:

    pip install --upgrade protobuf -i https://pypi.douban.com/simple
    

    2. 查看protobuf版本:

    pip show protobuf

    如果两个版本不一致,那么请将两个的版本保持到一致。

    可以使用如下pip安装命令对protobuf升级:

    pip install --upgrade protobuf -i https://pypi.douban.com/simple
    
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Python使用gRPC是一种方便的方式来构建分布式系统和微服务。gRPC是一个高性能、开源的远程过程调用(RPC)框架,它使用Protocol Buffers作为接口定义语言(IDL)来定义服务接口和消息格式。 要在Python中使用gRPC,首先需要安装gRPC库。可以使用pip命令进行安装: ``` pip install grpcio ``` 安装完成后,可以开始编写gRPC服务和客户端代码。首先需要定义服务接口和消息格式,这可以通过编写.proto文件来完成。然后使用gRPC提供的工具将.proto文件编译成Python代码。 接下来,可以编写服务端代码。在服务端代码中,需要实现.proto文件中定义的服务接口,并提供相应的方法来处理客户端请求。 最后,可以编写客户端代码来调用服务端提供的方法。客户端代码需要创建一个gRPC通道,并使用通道创建一个stub对象,然后可以通过stub对象调用服务端提供的方法。 下面是一个简单的示例代码,演示了如何在Python中使用gRPC: ```python # 导入所需的模块 import grpc import helloworld_pb2 import helloworld_pb2_grpc # 创建一个gRPC通道 channel = grpc.insecure_channel('localhost:50051') # 创建一个stub对象 stub = helloworld_pb2_grpc.GreeterStub(channel) # 调用服务端提供的方法 response = stub.SayHello(helloworld_pb2.HelloRequest(name='Alice')) # 打印服务端返回的结果 print(response.message) ``` 以上代码中,假设服务端提供了一个名为`SayHello`的方法,客户端通过创建一个stub对象来调用该方法,并传递一个`HelloRequest`对象作为参数。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值