pub mod client;
mod random;
mod round;
mod weight_random;
mod weight_round;
use crate::{AppDiscovery, Instance};
pub use client::LoadBalanceClient;
pub use random::RandomLoadBalance;
pub use round::RoundRobinLoadBalance;
pub use weight_random::WeightRandomLoadBalance;
pub use weight_round::WeightRoundRobinLoadBalance;
pub trait LoadBalance {
fn instances(
&self,
service_id: &str,
) -> impl Future<Output = Result<Vec<Instance>, LoadBalanceError>> + Send {
async {
AppDiscovery::get_instances(service_id)
.await
.map_err(|e| LoadBalanceError::GetInstancesError(e.to_string()))
}
}
fn get_instance(
&self,
service_id: &str,
) -> impl Future<Output = Result<Instance, LoadBalanceError>> + Send;
}
#[derive(Debug)]
pub enum LoadBalanceError {
GetInstancesError(String),
NoAvailableInstance(String),
}
impl std::fmt::Display for LoadBalanceError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
LoadBalanceError::GetInstancesError(e) => write!(f, "Failed to get instances: {}", e),
LoadBalanceError::NoAvailableInstance(s) => {
write!(f, "No available instance for service: {}", s)
}
}
}
}
impl std::error::Error for LoadBalanceError {}