net_pool/strategy/
strategy.rs

1use crate::backend::{Address, BackendState};
2
3#[derive(Debug, Clone, Eq, PartialEq)]
4pub enum Strategy {
5    /// 普通哈希
6    Hash,
7
8    /// 一致性哈希
9    ConsistentHash,
10
11    /// 轮询
12    RoundRobin,
13}
14
15/// 策略trait
16pub trait LbStrategy: Send + Sync {
17    /// 策略类型
18    fn strategy(&self) -> Strategy;
19
20    /// 判断一个后端地址是否存在
21    fn contain(&self, addr: &Address) -> bool;
22
23    /// 添加一个后端地址
24    fn add_backend(&self, id: Option<u32>, addr: Address);
25
26    /// 移除一个后端地址
27    fn remove_backend(&self, addr: &Address) -> bool;
28
29    /// 获取一个后端地址
30    fn get_backend(&self, key: &str) -> Option<BackendState>;
31
32    /// 获取所有后端地址
33    fn get_backends(&self) -> Vec<BackendState>;
34    
35    /// 获取一个后端地址, 通过通用key
36    fn backend<KEY: AsRef<str>>(this: Box<dyn LbStrategy>, key: KEY) -> Option<BackendState>
37    where
38        Self: Sized,
39    {
40        this.get_backend(key.as_ref())
41    }
42}