use std::time::Duration;
use tokio::select;
use tokio::time::sleep;
use detcd::client::Builder;
use detcd::registrar::{Registrar, SimpleService};
use detector::ServiceState::Stateful;
use detector::{DestinationRule, Meta, MetaKey, Service, ServiceKey, Strategy};
#[tokio::main]
async fn main() {
let mut r = match register_meta().await {
Err(e) => {
println!("{:?}", e);
return;
}
Ok(r) => r,
};
println!("register service: {:?}", register_service().await);
r.unregister().await.unwrap();
}
async fn register_meta() -> Result<Registrar<Meta>, detcd::Error> {
let client = Builder::new().build(&["localhost:2379"]).await?;
let mut registrar: Registrar<Meta> = Registrar::from((
client,
Meta::new(MetaKey::new("game", "dev"), 4)
.state(Some(Stateful))
.destination_rule(DestinationRule::Header(
"user_id".to_string(),
Strategy::ConsistentHash,
)),
));
let _ = registrar.register().await?;
Ok(registrar)
}
#[allow(dead_code)]
async fn register_simple_service() -> Result<(), detcd::Error> {
let client = Builder::new().build(&["localhost:2379"]).await?;
let mut key = ServiceKey::new("game", "dev");
key.id = Some(1);
let mut registrar: Registrar<SimpleService> = Registrar::from((
client,
Service::from_key(key)
.ip(Some("192.134.21.21"))
.port(Some(322)),
));
registrar.register().await?;
sleep(Duration::from_secs(20)).await;
registrar.unregister().await
}
#[allow(dead_code)]
async fn register_service() -> Result<(), detcd::Error> {
let client = Builder::new().build(&["localhost:2379"]).await?;
let mut registrar: Registrar<Service> = Registrar::from((
client,
Service::from_key(ServiceKey::new("game", "dev"))
.ip(Some("192.134.21.21"))
.port(Some(322)),
));
registrar.register().await?;
println!("service {:?}", registrar.service());
println!("status: {:?}", registrar.status());
println!("status changed: {:?}", registrar.changed().await);
loop {
select! {
status = registrar.changed() => {
println!("status changed: {:?}", status);
},
_ = sleep(Duration::from_secs(200)) => {
println!("over");
break;
}
}
}
drop(registrar);
sleep(Duration::from_secs(5)).await;
Ok(())
}