.NET 和 Python 中使用 Google Protocol Buffers

作者:微信公众号:【架构师老卢】
7-4 13:56
23

概述:在后续讨论中,我们将继续探讨在 .NET 应用程序中实现 Google 协议缓冲区 (protobuf),这次重点介绍与 Python 服务的通信。此设置演示了 protobuf 如何促进以不同语言编写的服务之间的强大而高效的通信,这对于组件经常通过网络调用进行交互的分布式系统至关重要。介绍在分布式系统、云环境和物联网 (IoT) 基础设施中,跨不同平台和网络的有效通信是一项关键能力。Google Protocol Buffers 提供紧凑高效的序列化格式,是此类应用的理想选择。在此示例中,我们将说明使用 protobuf 的 .NET 应用程序如何与基于 Python 的服务进行通信。先决条

在后续讨论中,我们将继续探讨在 .NET 应用程序中实现 Google 协议缓冲区 (protobuf),这次重点介绍与 Python 服务的通信。

此设置演示了 protobuf 如何促进以不同语言编写的服务之间的强大而高效的通信,这对于组件经常通过网络调用进行交互的分布式系统至关重要。

介绍

在分布式系统、云环境和物联网 (IoT) 基础设施中,跨不同平台和网络的有效通信是一项关键能力。

Google Protocol Buffers 提供紧凑高效的序列化格式,是此类应用的理想选择。

在此示例中,我们将说明使用 protobuf 的 .NET 应用程序如何与基于 Python 的服务进行通信。

先决条件

  • 熟悉 .NET 和 C# 编程。
  • 对用于跨平台通信的 Python 有基本的了解。
  • 在 .NET 和 Python 环境中都安装了 Google 协议缓冲区。

步骤 1:设置 Python 环境

首先,通过安装 protobuf 库来设置 Python 环境以使用 protobuf。

pip install protobuf

步骤 2:定义通用的 Protobuf 结构

为确保互操作性,请定义 .NET 和 Python 应用程序都将使用的通用 protobuf 结构。

我们将使用一条消息作为示例:Order

syntax = "proto3";  
  
package CommunicationApp;  
  
message Order {  
  int32 id = 1;  
  string customerName = 2;  
  float amount = 3;  
  string status = 4;  
}

步骤 3:在 Python 和 .NET 中生成代码

从 protobuf 定义生成 Python 和 C# 类。

对于 Python

protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/order.proto

对于 .NET,请使用与上一篇文章中相同的命令生成 C# 类。

步骤 4:实现 Python 服务

Python 脚本设置一个简单的 TCP 服务器,该服务器侦听特定端口。当它收到连接时,它会从套接字读取数据,该套接字应为序列化的 protobuf 消息。然后,该脚本将此消息反序列化为一个对象,并打印出订单的详细信息。Order

import socket
from communication_app_pb2 import Order

def main():
    # Create a TCP/IP socket
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # Bind the socket to the port 12345 on all interfaces
    s.bind(('localhost', 12345))
    # Listen for incoming connections
    s.listen(1)
    print("Waiting for a connection...")
    conn, addr = s.accept()

    try:
        print(f"Connection from {addr}")
        # Receive data from the connection
        data = conn.recv(1024)
        order = Order()
        # Deserialize data to an Order object
        order.ParseFromString(data)
        print(f"Order received: ID={order.id}, Customer={order.customerName}, Amount={order.amount}, Status={order.status}")
    finally:
        # Clean up the connection
        conn.close()

if __name__ == "__main__":
    main()

步骤 5:从 .NET 发送方发送数据

.NET 应用程序创建一个对象,对其进行序列化,并通过 TCP 将其发送到 Python 服务。在端口 12345 上建立与本地服务器的连接,Python 服务正在侦听该端口。Order

using Google.Protobuf;  
using System.Net.Sockets;  
using System.IO;  
  
public class Program  
{  
    public static void Main(string[] args)  
    {  
        // Create an Order object  
        Order order = new Order { Id = 1, CustomerName = "Jane Doe", Amount = 100.0f, Status = "Processed" };  
          
        // Connect to the server at localhost on port 12345  
        using (var client = new TcpClient("localhost", 12345))  
        using (var ns = client.GetStream())  
        {  
            // Serialize the Order to the network stream  
            order.WriteTo(ns);  
        }  
  
        System.Console.WriteLine("Order sent!");  
    }  
}

接收器输出和发送器输入

  • 发件人日志:.NET 应用程序发送数据和日志:

Order sent!

  • 接收器输出:Python 应用程序接收并打印出:
Waiting for a connection...  
Connection from ('127.0.0.1', 65100)  
Order received: ID=1, Customer=Jane Doe, Amount=100.0, Status=Processed

第 6 步:集成 IoT 设备

对于 IoT 方案,可以使用相同的 protobuf 将数据从传感器发送到服务器。确保 IoT 设备可以使用 protobuf 序列化数据,并通过网络发送数据,类似于 .NET 示例,以适应 IoT 设备中典型的资源约束。

Protobuf 与 Azure Service Bus 等消息队列有何不同?

Google 协议缓冲区 (protobuf) 和消息队列系统(如 Azure 服务总线)用于不同的用途:

  • Google Protocol Buffers:一种序列化结构化数据的方法,与语言无关且与平台无关。它用于以紧凑的二进制格式对结构化数据进行编码,以便通过网络传输或存储。
  • Azure 服务总线:在应用程序之间提供消息传送服务的消息中转站。它支持复杂的消息传递功能,如消息队列、发布-订阅模型和高级路由。

Protobuf 相对于 Azure 服务总线的优势:

  • 效率:Protobuf 提供了一种非常紧凑的二进制格式,在带宽和存储空间方面都很高效。
  • 速度:使用 Protobuf 的序列化和反序列化速度非常快,使其适用于性能关键型应用程序。
  • 互操作性:Protobuf 支持生成各种语言的代码,使集成用不同语言编写的系统变得容易。

Azure 服务总线未解决 Protobuf 的用例:Use case for Protobuf not addressed by Azure Service Bus:

  • 直接数据序列化:当主要要求是结构化数据的高效、直接序列化,而不需要消息传递基础结构时,Protobuf 更合适。
  • 嵌入式系统和物联网:在资源有限且最小化数据开销至关重要的环境中,Protobuf 比使用成熟的消息队列系统更合适。

通过利用 Google Protocol Buffers,我们促进了 .NET 和 Python 应用程序之间的通信,展示了 protobuf 在多平台环境中的多功能性和效率。

此设置可确保数据一致性,减少网络负载,并简化分布式系统的开发和维护。

下一步是什么?

我们将探索进一步的增强功能,例如保护通信通道、处理更大的数据集,以及在高延迟或资源受限的环境中优化性能。

还将研究更复杂的数据类型和异步通信模式,以增强系统的鲁棒性和可扩展性。

阅读排行