#discovery #multicast #mdns #service-discovery #peer #tokio

instance-chart

在同一网络和/或机器上发现应用程序的实例

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 网络编程

MIT许可证

57KB
914 代码行

实例图表

提供有关同一机器/网络上的其他实例的数据

Crates.io Crates.io Docs.rs License

另请参阅

此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