| Crates.io | instance-chart |
| lib.rs | instance-chart |
| version | 0.4.0 |
| created_at | 2022-04-26 17:10:31.825597+00 |
| updated_at | 2023-04-14 01:18:14.883956+00 |
| description | Chart (discover) instances of your application on the same network and or machine |
| homepage | |
| repository | https://github.com/dvdsk/instance-chart |
| max_upload_size | |
| id | 575576 |
| size | 108,282 |
Provides data about other instances on the same machine/network
See also:
This crate provides a lightweight alternative to mDNS. It discovers other instances on the
same network or (optionally) machine. You provide an Id and some data you want to share.
Usually this is a port your service uses. This gives you a live updating chart
of all the discovered Ids-data pairs and the corrosponding ip adresses.
The chart can contain instances that are now down. It can not be used to check if a service is up.
Add a dependency on instance-chart in Cargo.toml:
instance_chart = "0.3"
Now add the following snippet somewhere in your codebase. Discovery will stop when you drop the maintain 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(())
}
A minimal peer to peer chat app using instance-chart to discover peers. After type a line the message is sent to all the peers simply by looping over their addresses returned by 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();
}
For the full working example including the print_incoming function see examples/chat.rs.