net_pool/strategy/
strategy.rs

1use crate::backend::{Address, BackendState};
2
3pub enum Strategy {
4    /// 普通哈希
5    Hash,
6
7    /// 一致性哈希
8    ConsistentHash,
9
10    /// 轮询
11    RoundRobin,
12}
13
14/// 策略trait
15pub trait LbStrategy: Send + Sync {
16    /// 策略类型
17    fn strategy(&self) -> Strategy;
18
19    /// 判断一个后端地址是否存在
20    fn contain(&self, hash_code: u64) -> bool;
21
22    /// 添加一个后端地址
23    fn add_backend(&self, addr: Address);
24
25    /// 移除一个后端地址
26    fn remove_backend(&self, addr: &Address) -> bool;
27
28    /// 获取一个后端地址
29    fn get_backend(&self, key: &str) -> Option<BackendState>;
30
31    /// 获取所有后端地址
32    fn get_backends(&self) -> Vec<BackendState>;
33
34    /// 获取原始的所有后端地址
35    fn get_origin_backends(&self) -> Vec<BackendState>;
36
37    /// 获取一个后端地址, 通过通用key
38    fn backend<KEY: AsRef<str>>(this: Box<dyn LbStrategy>, key: KEY) -> Option<BackendState>
39    where
40        Self: Sized,
41    {
42        this.get_backend(key.as_ref())
43    }
44
45    /// 使一个后端地址无效
46    fn disable_backend(&self, addr: &Address) -> bool {
47        self.remove_backend(addr)
48    }
49
50    /// 使一个后端地址有效
51    fn enable_backend(&self, addr: &Address) {
52        self.add_backend(addr.clone())
53    }
54}