5个版本 (3个破坏性版本)
0.4.0 | 2023年4月14日 |
---|---|
0.3.0 | 2023年4月13日 |
0.2.1 | 2022年6月3日 |
0.2.0 | 2022年5月12日 |
0.1.0 | 2022年4月26日 |
#1596 in 网络编程
57KB
914 代码行
实例图表
提供有关同一机器/网络上的其他实例的数据
另请参阅
此Crate提供了一个轻量级的mDNS替代方案。它发现同一网络或(可选)机器上的其他实例。您提供您想要共享的Id
和一些data
。通常这是一个服务使用的端口。这为您提供了一个所有发现Ids
-data
对以及相应的IP地址的实时更新图表。
图表可以包含现在已关闭的实例。它不能用来检查服务是否运行。
用法
在Cargo.toml
中添加对instance-chart
的依赖项
instance_chart = "0.3"
现在在代码库的某个地方添加以下片段。当您释放维护future时,发现将停止。
use std::error::Error;
use instance_chart::{discovery, ChartBuilder};
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let chart = ChartBuilder::new()
.with_id(1) // pick a unique id for each service
.with_service_port(8042) // The port your service, not discovery, runs on
.finish()?;
let maintain = discovery::maintain(chart.clone());
let _ = tokio::spawn(maintain); // maintain task will run forever
Ok(())
}
示例应用程序
一个使用instance-chart发现对等方的最小对等方聊天应用程序。在输入一行后,消息通过简单地遍历由chart.addr_vec()
返回的地址发送给所有对等方。
#[tokio::main]
async fn main() {
let listener = TcpListener::bind(("0.0.0.0", 0)).await.unwrap();
let port = listener.local_addr().unwrap().port();
let chart = ChartBuilder::new()
.with_random_id()
.with_service_port(port)
.local_discovery(true)
.finish()
.unwrap();
// run these task forever in the background
let chart2 = chart.clone();
tokio::spawn(async move { discovery::maintain(chart2).await });
tokio::spawn(async move { print_incoming(listener).await });
spawn_blocking(move || {
let reader = std::io::stdin();
loop {
let mut line = String::new();
reader.read_line(&mut line).unwrap();
for (_, addr) in chart.addr_vec() {
let mut peer = std::net::TcpStream::connect(addr).unwrap();
peer.write_all(line.as_bytes()).unwrap();
}
}
})
.await
.unwrap();
}
有关包括print_incoming
函数的完整工作示例,请参阅examples/chat.rs。
依赖关系
~4–13MB
~138K SLoC