首页 > 编程语言 >python调用grpc请求

python调用grpc请求

时间:2024-10-30 14:32:50浏览次数:1  
标签:调用 pb2 python nested grpc message example 嵌套

gRPC是一款高性能、开源的RPC框架,支持多种编程语言。Protobuf是gRPC使用的默认序化协议,可以将结构化数据序列化为二进制格式,提高数据传输效率。

在Python中使用gRPC调用服务时,通常需要先定义协议缓冲区(Protocol Buffers)消息类型,这些类型是从.proto文件生成的。当你准备调用一个gRPC服务时,需要根据该服务的请求消息类型来构造请求对象。

以下是一个步骤化的指南,展示如何封装proto对象并发送请求给gRPC服务:

步骤 1: 定义 .proto 文件

首先,你需要定义一个或多个 .proto 文件来描述你的服务以及它接受的消息格式。例如,假设你有一个简单的服务,它接受一个名字并返回一个带有问候的消息:

 

syntax = "proto3";

package greeting;

// 请求消息
message HelloRequest {
    string name = 1;
}

// 响应消息
message HelloReply {
    string message = 1;
}

// 服务定义
service Greeter {
    rpc SayHello (HelloRequest) returns (HelloReply);
}

 

步骤 2: 生成 Python 源代码

安装第三方包:grpcio、protobuf、grpcio_tools

 pip install grpcio

 pip install protobuf3

pip install grpcio_tools

使用 protoc 编译器和相关的插件来生成Python源代码。如果你已经设置了环境,可以运行如下命令:

python -m grpc_tools.protoc -I ./ --python_out=. --grpc_python_out=. helloworld.proto

这会在当前目录下生成两个文件:greeting_pb2.py 和 greeting_pb2_grpc.py。

参数说明:

 python3  -m  grpc_tools.protoc  --python_out=.  --grpc_python_out=.  -I. xxx.proto  -I=/workspace  -I=xxx/yyy/  

  1. -I=:在proto文件中远程调用的内容,导入路径为实际调用的上一级目录即可。 
  2. python_out:指定xxx_pb2.py的输出路径,编译生成处理protobuf相关的代码路径。传入.,则默认生成到当前目录。
  3. grpc_python_out:指定xxx_pb2_grpc.py的输出路径,编译生成处理grpc相关的代码路径,传入.,则默认生成到当前目录。
  4. grpc_tools.protoc:工具包,刚安装的。 
  5. -I:这个参数指定协议文件的查找目录。 

 # 生成的文件中:

  1. xxx_pb2.py:里面有消息序列化类。是用来和protobuf数据进行交互。
  2. xxx_pb2_grpc.py:包含了服务器Stub类和客户端Stub类,以及待实现的服务RPC接口。是用来和grpc进行交互。

 

步骤 3: 构造请求并发送

接下来,编写一个Python脚本来构造请求并发送给gRPC服务:

 

import grpc
import greeting_pb2
import greeting_pb2_grpc

def greet():
    # 创建一个 gRPC 的通道
    with grpc.insecure_channel('localhost:50051') as channel:
        # 创建一个 gRPC 的 stub
        stub = greeting_pb2_grpc.GreeterStub(channel)
        
        # 封装请求消息
        request = greeting_pb2.HelloRequest(name='World')
        
        # 发送请求并接收响应
        response = stub.SayHello(request)
        
        # 处理响应
        return response.message

if __name__ == '__main__':
    print(greet())

 

这段代码做了以下几件事:

  1. 创建了一个 grpc.insecure_channel 到运行在 localhost 的 50051 端口的服务。
  2. 使用生成的 GreeterStub 类来创建一个 stub,它是用来与服务通信的。
  3. 创建了一个 HelloRequest 对象并设置其 name 字段。
  4. 通过调用 stub.SayHello 方法发送请求,并获取响应。
  5. 打印出响应中的 message 字段。

注意事项

  • 确保服务正在运行并且监听在你指定的地址和端口上。
  • 如果服务端点不在本地主机上,则可能需要使用安全连接,此时应该使用 grpc.secure_channel 并提供证书。
  • 确保 .proto 文件版本匹配,并且正确导入了所有依赖项。
  • 根据实际的应用场景调整端口号和其他网络配置。

以上就是使用Python调用gRPC服务的基本流程。如果你的服务涉及到更复杂的消息结构或逻辑,那么你可能需要调整请求的构造方式以适应这些需求。

 

进阶

 

当你的 .proto 文件定义的消息类型包含嵌套结构时,你需要在构造请求对象时也遵循这种层次结构。下面是一个具体的例子,展示如何处理嵌套的消息结构。

 

假设你有一个 .proto 文件,其中定义了一个请求消息类型,包含了嵌套的字段:

 

syntax = "proto3";

package example;

message NestedRequest {
    string main_field = 1;
    Nested inner_message = 2;
}

message Nested {
    string nested_field = 1;
    repeated int32 numbers = 2;
}

这个 NestedRequest 消息类型包含了一个字符串字段 main_field 和一个嵌套的 Nested 消息。Nested 消息又包含了一个字符串字段 nested_field 和一个整数列表 numbers

步骤 1: 生成 Python 源代码
使用 protoc 编译器生成 Python 源代码:

python -m grpc_tools.protoc -I ./ --python_out=. --grpc_python_out=. example.proto

这将在当前目录下生成 example_pb2.pyexample_pb2_grpc.py 文件。

步骤 2: 构造请求并发送

编写一个 Python 脚本,用于构造请求并发送给 gRPC 服务:

import grpc
import example_pb2
import example_pb2_grpc

def send_nested_request():
    # 创建一个 gRPC 的通道
    with grpc.insecure_channel('localhost:50051') as channel:
        # 创建一个 gRPC 的 stub
        stub = example_pb2_grpc.YourServiceStub(channel)
        
        # 创建嵌套部分的消息
        nested_message = example_pb2.Nested(
            nested_field="Nested Field Value",
            numbers=[1, 2, 3]
        )
        
        # 创建顶层请求消息,并填充嵌套部分
        request = example_pb2.NestedRequest(
            main_field="Main Field Value",
            inner_message=nested_message
        )
        
        # 发送请求并接收响应
        response = stub.YourMethod(request)
        
        # 处理响应
        return response

if __name__ == '__main__':
    response = send_nested_request()
    print(response)

在这段代码中:

创建了一个 example_pb2.Nested 对象,并设置了它的字段。
创建了一个 example_pb2.NestedRequest 对象,并在其 inner_message 字段中填入之前创建的嵌套消息。
通过 stub.YourMethod 方法发送请求,并获取响应。
注意事项
确保替换 YourServiceStub 和 YourMethod 为你实际的服务名和方法名。
检查服务是否在指定的地址和端口上运行。
如果你的 .proto 文件中有更多的嵌套层次,只需按照相同的模式继续构建即可。
这样,你就能够成功构造包含嵌套结构的消息,并通过 gRPC 发送给服务端。

 

高级

对于多层嵌套的情况,构造请求消息的过程是相似的,只是需要更多层次的对象创建和属性赋值。我们可以进一步扩展之前的例子来展示多层嵌套的消息类型如何构造。

假设你的 .proto 文件中定义了一个非常复杂的请求消息类型,其中包括多层嵌套:

syntax = "proto3";

package example;

message MultiLayerRequest {
    string top_level_field = 1;
    Nested outer_message = 2;
}

message Nested {
    string nested_field = 1;
    repeated int32 numbers = 2;
    AnotherLevel another_level = 3;
}

message AnotherLevel {
    string deep_nested_field = 1;
    repeated float floats = 2;
}

在这个例子中,MultiLayerRequest 包含了一个顶层字符串字段 top_level_field 和一个 Nested 类型的消息。Nested 消息又包含了一个字符串字段 nested_field、一个整数列表 numbers 和另一个嵌套的消息 AnotherLevel,而 AnotherLevel 又包含了一个字符串字段 deep_nested_field 和一个浮点数列表 floats

构造请求并发送

下面是构造多层嵌套请求消息并发送给 gRPC 服务的 Python 示例:

import grpc
import example_pb2
import example_pb2_grpc

def send_multi_layer_request():
    # 创建一个 gRPC 的通道
    with grpc.insecure_channel('localhost:50051') as channel:
        # 创建一个 gRPC 的 stub
        stub = example_pb2_grpc.YourServiceStub(channel)
        
        # 创建最深层的嵌套部分的消息
        deep_nested_message = example_pb2.AnotherLevel(
            deep_nested_field="Deep Nested Field Value",
            floats=[1.1, 2.2, 3.3]
        )
        
        # 创建中间层的嵌套部分的消息,并填充最深层的部分
        nested_message = example_pb2.Nested(
            nested_field="Nested Field Value",
            numbers=[1, 2, 3],
            another_level=deep_nested_message
        )
        
        # 创建顶层请求消息,并填充中间层的部分
        request = example_pb2.MultiLayerRequest(
            top_level_field="Top Level Field Value",
            outer_message=nested_message
        )
        
        # 发送请求并接收响应
        response = stub.YourMethod(request)
        
        # 处理响应
        return response

if __name__ == '__main__':
    response = send_multi_layer_request()
    print(response)

在这个示例中:

  1. 首先创建了 AnotherLevel 消息,并设置了其字段。
  2. 接着创建了 Nested 消息,并在其 another_level 字段中填入之前创建的 AnotherLevel 消息。
  3. 最后创建了 MultiLayerRequest 消息,并在其 outer_message 字段中填入之前创建的 Nested 消息。

通过这种方式,你可以构造任意深度的嵌套消息。只要按照层次结构逐级创建消息对象并设置相应的字段,就能正确地构建请求消息。确保在实际使用时,替换 YourServiceStubYourMethod 为你的服务和方法的实际名称。


 

 

 

标签:调用,pb2,python,nested,grpc,message,example,嵌套
From: https://www.cnblogs.com/sxy-blog/p/18515786

相关文章

  • 【EI复现】基于深度强化学习的微能源网能量管理与优化策略研究(Python代码实现)
    ......
  • 【EI复现】基于深度强化学习的微能源网能量管理与优化策略研究(Python代码实现)
    ......
  • python毕业设计django基于协同过滤算法的养老新闻推荐网站
    文章目录前言一、项目介绍三、功能介绍四、核心代码五、效果图前言Django基于协同过滤算法的养老新闻推荐网站是一个结合了Django框架和协同过滤推荐算法的养老领域信息服务系统。该系统旨在通过个性化推荐算法,向用户推荐符合其兴趣偏好的养老新闻,以提高用户体验和......
  • Python毕业设计基于Python+Django的人事管理系统
    文章目录项目介绍技术介绍功能介绍核心代码数据库参考系统效果图文章目录项目介绍  人事管理系统的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品,体验高科技时代带给人们的方便,同时也能让用户体会到与以往常规......
  • Python基础16_数据结构:队列&树
    一、队列队列(Queue),它是一种运算受限的线性表,先进先出(FIFOFirstInFirstOut)-队列是一种受限的线性结构-受限之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作Python标准库中的queue模块提供了多种队列实现,包括普通队列、双端队列、......
  • python之Requests模块
    python中文官方文档:https://docs.python.org/zh-cn/3/Requests中文官方文档地址:https://requests.readthedocs.io/projects/cn/zh_CN/latest/1.Requests模块快速入门requests库的基本使用详解1.Requests模块作用:发送http请求,获取响应数据2.Requests模块是第三方模块,需要......
  • Python表格格式转换模块:tablib
    文章目录安装创建表格导出数据读写安装Tablib是Python的表格转换插件,支持不同格式表格之间的转换,其推荐的安装方式为pipinstall"tablib[all]"其中,all等同于html,pandas,ods,xls,xlsx,yaml,表示在安装tablib的基础上,同时对这些不同的文件格式提供支持。如果......
  • 【一分钟配置Python环境变量
    配置Python环境变量可以帮助系统找到Python解释器和相关工具。下面是如何在不同操作系统上配置Python环境变量的步骤:Windows 1.安装Python:在官方网站下载并安装Python,安装过程中选择“AddPythontoPATH”选项。手动配置环境变量:右击“此电脑”或“计算机”,选择“属性......
  • RestTemplate远程调用与服务治理问题
                 RestTemplate是Spring提供的一个同步HTTP客户端,用于在Java应用程序中进行RESTfulAPI调用。它支持多种HTTP方法(如GET、POST、PUT、DELETE等),并且能够处理JSON、XML和其他格式的响应。使用场景当应用需要从外部服务获取......
  • 采用线性回归实现训练和预测(Python)
    已知测得某块地,当温度处于15至40度之间时,数得某块草地上小花朵的数量和温度值的数据如下表所示。现在要来找出这些数据中蕴含的规律,用来预测其它未测温度时的小花朵的数量。测得数据如下图所示:importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.linear_model......