在后续讨论中,我们将继续探讨在 .NET 应用程序中实现 Google 协议缓冲区 (protobuf),这次重点介绍与 Python 服务的通信。
此设置演示了 protobuf 如何促进以不同语言编写的服务之间的强大而高效的通信,这对于组件经常通过网络调用进行交互的分布式系统至关重要。
在分布式系统、云环境和物联网 (IoT) 基础设施中,跨不同平台和网络的有效通信是一项关键能力。
Google Protocol Buffers 提供紧凑高效的序列化格式,是此类应用的理想选择。
在此示例中,我们将说明使用 protobuf 的 .NET 应用程序如何与基于 Python 的服务进行通信。
首先,通过安装 protobuf 库来设置 Python 环境以使用 protobuf。
pip install protobuf
为确保互操作性,请定义 .NET 和 Python 应用程序都将使用的通用 protobuf 结构。
我们将使用一条消息作为示例:Order
syntax = "proto3";
package CommunicationApp;
message Order {
int32 id = 1;
string customerName = 2;
float amount = 3;
string status = 4;
}
从 protobuf 定义生成 Python 和 C# 类。
对于 Python:
protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/order.proto
对于 .NET,请使用与上一篇文章中相同的命令生成 C# 类。
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()
.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!");
}
}
Order sent!
Waiting for a connection...
Connection from ('127.0.0.1', 65100)
Order received: ID=1, Customer=Jane Doe, Amount=100.0, Status=Processed
对于 IoT 方案,可以使用相同的 protobuf 将数据从传感器发送到服务器。确保 IoT 设备可以使用 protobuf 序列化数据,并通过网络发送数据,类似于 .NET 示例,以适应 IoT 设备中典型的资源约束。
Google 协议缓冲区 (protobuf) 和消息队列系统(如 Azure 服务总线)用于不同的用途:
通过利用 Google Protocol Buffers,我们促进了 .NET 和 Python 应用程序之间的通信,展示了 protobuf 在多平台环境中的多功能性和效率。
此设置可确保数据一致性,减少网络负载,并简化分布式系统的开发和维护。
我们将探索进一步的增强功能,例如保护通信通道、处理更大的数据集,以及在高延迟或资源受限的环境中优化性能。
还将研究更复杂的数据类型和异步通信模式,以增强系统的鲁棒性和可扩展性。