krpc_core/register/
mod.rs

1use http_body_util::Full;
2use hyper::client::conn::http2::SendRequest;
3use serde::{Deserialize, Serialize};
4use std::{collections::HashMap, sync::Arc};
5use tokio::sync::RwLock;
6
7use self::zookeeper::KrpcZookeeper;
8pub mod zookeeper;
9
10pub struct RegisterBuilder {
11    addr: String,
12    name_space: String,
13    register_type: RegisterType,
14}
15
16impl RegisterBuilder {
17    pub fn new(addr: &str, name_space: &str, register_type: RegisterType) -> Self {
18        return RegisterBuilder {
19            addr: addr.to_string(),
20            name_space: name_space.to_string(),
21            register_type,
22        };
23    }
24
25    pub fn init(&self, map: Arc<RwLock<HashMap<String, Vec<SocketInfo>>>>) -> Box<dyn Register> {
26        match self.register_type {
27            RegisterType::ZooKeeper => {
28                Box::new(KrpcZookeeper::init(&self.addr, &self.name_space, map))
29            }
30            RegisterType::Nacos => panic!("not support"),
31        }
32    }
33}
34
35#[derive(Clone)]
36pub enum RegisterType {
37    ZooKeeper,
38    Nacos,
39}
40#[derive(Serialize, Deserialize, Debug, Clone)]
41pub struct Info {
42    pub server_name: String,
43    pub version: Option<String>,
44    pub methods: Vec<String>,
45    pub ip: String,
46    pub port: Option<String>,
47}
48
49impl Info {
50    pub fn get_addr(&self) -> String {
51        let mut ip = self.ip.clone();
52        if let Some(port) = &self.port {
53            ip.push_str(&(":".to_owned() + port));
54        }
55        return ip;
56    }
57}
58
59#[derive(Debug, Clone)]
60pub struct SocketInfo {
61    pub info: Info,
62    pub sender: Arc<RwLock<Option<SendRequest<Full<bytes::Bytes>>>>>,
63}
64
65#[derive(Serialize, Deserialize, Debug, Clone)]
66pub enum Resource {
67    Client(Info),
68    Server(Info),
69}
70
71pub trait Register: Send + Sync {
72    fn add_resource(&self, resource: Resource);
73}