use batata_client::prelude::*;
#[tokio::main]
async fn main() -> Result<()> {
tracing_subscriber::fmt::init();
let client = BatataClient::builder()
.server_addr("localhost:8848")
.namespace("public")
.app_name("naming-example")
.build()
.await?;
println!("Connected to Batata server!");
let naming_service = client.naming_service();
client.start_naming_service().await?;
println!("\n--- Registering service instance ---");
let instance = Instance::new("127.0.0.1", 8080)
.with_weight(1.0)
.with_cluster("DEFAULT")
.with_metadata("version", "1.0.0");
naming_service
.register_instance("example-service", "DEFAULT_GROUP", instance.clone())
.await?;
println!("Instance registered successfully!");
let instance2 = Instance::new("127.0.0.1", 8081)
.with_weight(2.0)
.with_cluster("DEFAULT");
naming_service
.register_instance("example-service", "DEFAULT_GROUP", instance2)
.await?;
println!("Second instance registered successfully!");
println!("\n--- Querying all instances ---");
let instances = naming_service
.get_all_instances("example-service", "DEFAULT_GROUP")
.await?;
println!("Found {} instances:", instances.len());
for inst in &instances {
println!(" - {}:{} (weight: {}, healthy: {})",
inst.ip, inst.port, inst.weight, inst.healthy);
}
println!("\n--- Selecting healthy instances ---");
let healthy = naming_service
.select_instances("example-service", "DEFAULT_GROUP", true)
.await?;
println!("Found {} healthy instances", healthy.len());
println!("\n--- Selecting one healthy instance ---");
match naming_service
.select_one_healthy_instance("example-service", "DEFAULT_GROUP")
.await
{
Ok(inst) => println!("Selected: {}:{}", inst.ip, inst.port),
Err(e) => println!("No healthy instance: {}", e),
}
println!("\n--- Subscribing to service changes ---");
naming_service
.subscribe_callback("example-service", "DEFAULT_GROUP", |event| {
println!("Service changed!");
println!(" Service: {}", event.service_name);
println!(" Instances count: {}", event.service.hosts.len());
})
.await?;
println!("Subscribed successfully!");
println!("\n--- Getting services list ---");
let (count, services) = naming_service
.get_services_of_server("DEFAULT_GROUP", 1, 100)
.await?;
println!("Found {} services:", count);
for service in services {
println!(" - {}", service);
}
println!("\n--- Keeping service alive for 10 seconds ---");
tokio::time::sleep(tokio::time::Duration::from_secs(10)).await;
println!("\n--- Deregistering instances ---");
naming_service
.deregister_instance_simple("example-service", "127.0.0.1", 8080)
.await?;
naming_service
.deregister_instance_simple("example-service", "127.0.0.1", 8081)
.await?;
println!("Instances deregistered!");
client.shutdown().await;
println!("\nClient shutdown complete.");
Ok(())
}