Rust WebSocket 客户端实现:分布式系统远程消息通信完整指南

Rust WebSocket 客户端实现:分布式系统远程消息通信完整指南

之前我们建了一个能接收和路由消息到本地 Actor 的 WebSocket 服务器。就像建了一个邮局,但只能收信,不能寄信。今天我们要给它加上出站流程——连接到远程节点,让我们的 Actor 能跟其他节点上的 Actor 对话。 想象一下,之前我们的系统就像一个只有收件功能的邮局,现在我们要给它加上投递功能,让它既能收信,也能往外寄信。说白了,就是从"只能接电话"升级到"既能接电话又能打电话"。 实现目标 说白了,我们想要: 一个WebSocket 客户端管理器,专门连接那些我们认识的"朋友"节点 一个简单好用的 API,让我们能这样发消息: cluster.send("printer@node2", "Hello!").await; 集群能自动把消息通过 WebSocket 路由到远程节点 就像微信群聊一样,你发个消息,系统自动帮你送到对应的人那里。 消息格式回顾 还记得我们的消息长啥样吗?就像这样: #[derive(Serialize, Deserialize, Debug, Clone)] pub struct Message { pub to: String, // 收件人地址,比如 "printer@node2" pub from: String, // 发件人地址 pub body: String, // 消息内容 } 简单吧?就像写信一样,有收件人、发件人和内容。 第一步:定义集群客户端 首先,我们需要一个管家来管理所有的远程连接: use tokio_tungstenite::connect_async; use futures_util::SinkExt; use std::collections::HashMap; use std::sync::Arc; use tokio::sync::RwLock; type PeerMap = Arc<RwLock<HashMap<String, tokio_tungstenite::WebSocketStream<tokio::net::TcpStream>>>>; #[derive(Clone)] pub struct ClusterClient { peers: PeerMap, // 存储所有连接的远程节点 } impl ClusterClient { pub fn new() -> Self { Self { peers: Arc::new(RwLock::new(HashMap::new())), } } } 这个 ClusterClient 就像一个通讯录管理器,记录着我们连接的所有远程朋友。用 Arc<RwLock<HashMap>> 这种结构,就像给通讯录加了把锁,多个线程同时访问也不会乱套。 ...

September 6, 2024 · 2 min · 369 words · 梦兽编程