ZeroMQ 代理架构实现(Python 服务端 + C++ 代理 + C++ 客户端)
需求
使用zmq,服务端用python 开发,服务和客户端不能直接通信,需要中转或代理,客户端和代理用c++开发,请给出三处的程序
ZeroMQ 代理架构实现(Python 服务端 + C++ 代理 + C++ 客户端)
下面实现一个完整的 ZeroMQ 架构,其中:
- 服务端用 Python 开发(REP 模式)
- 代理用 C++ 开发(ROUTER-DEALER 模式)
- 客户端用 C++ 开发(REQ 模式)
架构说明
Client (REQ) → Proxy (ROUTER-DEALER) → Server (REP)
1. Python 服务端 (server.py)
import zmq
import timecontext = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")print("Server started, waiting for requests...")while True:# 接收来自代理的请求message = socket.recv_string()print(f"Received request: {message}")# 模拟处理时间time.sleep(1)# 发送回复reply = f"Processed: {message}"socket.send_string(reply)
2. C++ 代理 (proxy.cpp)
#include <zmq.hpp>
#include <iostream>
#include <string>int main() {zmq::context_t context(1);// 前端socket (ROUTER) - 接收客户端请求zmq::socket_t frontend(context, ZMQ_ROUTER);frontend.bind("tcp://*:5556");// 后端socket (DEALER) - 转发到服务端zmq::socket_t backend(context, ZMQ_DEALER);backend.connect("tcp://localhost:5555");std::cout << "Proxy started, forwarding messages between clients and server..." << std::endl;// 使用zmq_proxy进行消息转发try {zmq::proxy(frontend, backend, nullptr);} catch (const zmq::error_t& e) {std::cerr << "Proxy error: " << e.what() << std::endl;}return 0;
}
3. C++ 客户端 (client.cpp)
#include <zmq.hpp>
#include <iostream>
#include <string>
#include <thread>int main() {zmq::context_t context(1);zmq::socket_t socket(context, ZMQ_REQ);socket.connect("tcp://localhost:5556"); // 连接到代理for (int i = 0; i < 5; ++i) {std::string message = "Hello " + std::to_string(i);// 发送请求zmq::message_t request(message.begin(), message.end());socket.send(request, zmq::send_flags::none);std::cout << "Sent: " << message << std::endl;// 接收回复zmq::message_t reply;socket.recv(reply);std::cout << "Received: " << reply.to_string() << std::endl;std::this_thread::sleep_for(std::chrono::seconds(1));}return 0;
}
编译和运行步骤
1. 安装依赖
确保已安装:
- Python 的 pyzmq:
pip install pyzmq
- C++ 的 libzmq 和 cppzmq (如前面的安装指南)
2. 编译 C++ 程序
g++ -std=c++11 proxy.cpp -o proxy -lzmq
g++ -std=c++11 client.cpp -o client -lzmq
3. 运行程序(按顺序)
- 先启动 Python 服务端:
python server.py
- 然后启动 C++ 代理:
./proxy
- 最后运行 C++ 客户端:
./client
程序说明
-
消息流:
- 客户端发送 REQ 到代理 (5556 端口)
- 代理通过 ROUTER-DEALER 转发到服务端 (5555 端口)
- 服务端处理并回复,消息沿原路返回
-
代理功能:
- 使用 ZMQ_ROUTER 接收客户端请求(保留客户端身份)
- 使用 ZMQ_DEALER 转发到服务端(隐藏客户端身份)
zmq::proxy()
自动处理消息路由
-
扩展性:
- 可以轻松扩展为多客户端、多服务端架构
- 代理可以添加消息过滤、负载均衡等功能
预期输出
服务端输出
Server started, waiting for requests...
Received request: Hello 0
Received request: Hello 1
Received request: Hello 2
...
代理输出
Proxy started, forwarding messages between clients and server...
客户端输出
Sent: Hello 0
Received: Processed: Hello 0
Sent: Hello 1
Received: Processed: Hello 1
...
这种架构实现了客户端和服务端的解耦,代理可以添加额外的功能如负载均衡、协议转换等,而不需要修改客户端或服务端代码。