krpc_core/register/
mod.rs1use 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}