nacos_lib/
client.rs

1use std::sync::Arc;
2use std::time::Duration;
3use once_cell::sync::Lazy;
4use serde::Deserialize;
5use tokio::sync::RwLock;
6use crate::beat::{Beat, BeatInfo};
7use crate::get_instance::GetInstance;
8use crate::instance_list::GetInstanceList;
9use crate::register::Register;
10use crate::service_address::SERVICE_ADDRESSES;
11use crate::service_list::GetServiceList;
12use crate::unregister::UnRegister;
13
14pub static CLIENT: Lazy<Arc<RwLock<Client>>> = Lazy::new(|| {
15    Arc::new(RwLock::new(Client::default()))
16});
17
18
19pub static REQ_CLIENT: Lazy<Arc<reqwest::Client>> = Lazy::new(|| {
20    Arc::new(reqwest::Client::builder().connect_timeout(Duration::from_secs(5)).build().unwrap())
21});
22
23#[allow(non_snake_case)]
24#[derive(Debug, Default, Clone, Deserialize)]
25pub struct Client {
26    /// nacos链接
27    pub url: String,
28    /// 心跳间隔 默认5s
29    pub client_beat_interval: u64,
30    /// 服务名
31    pub serviceName: String,
32    /// 服务实例IP
33    pub ip: Option<String>,
34    /// 服务实例port
35    pub port: Option<String>,
36    /// 命名空间ID
37    pub namespaceId: Option<String>,
38    /// 权重
39    pub weight: Option<f64>,
40    /// 是否上线
41    pub enabled: Option<bool>,
42    /// 是否健康
43    pub healthy: Option<bool>,
44    /// 扩展信息
45    pub metadata: Option<String>,
46    /// 集群名
47    pub clusterName: Option<String>,
48    /// 分组名
49    pub groupName: Option<String>,
50    /// 是否临时实例
51    pub ephemeral: Option<bool>,
52}
53
54/// example:
55/// Client::init_client("http://127.0.0.1:8848", 5)
56
57impl Client {
58    pub async fn build(&self) {
59        let mut client = CLIENT.write().await;
60        *client = self.to_owned();
61    }
62
63    pub async fn build_listen(&self) {
64        let mut client = CLIENT.write().await;
65        *client = self.to_owned();
66        let _ = SERVICE_ADDRESSES.read().await;
67    }
68
69    pub fn init_client(mut self, url: &str, client_beat_interval: u64) -> Self{
70        self.url = url.trim().to_string();
71        self.client_beat_interval = client_beat_interval;
72        self
73    }
74
75    pub fn set_ip_port(mut self, ip: &str, port: &str) -> Self {
76        self.ip = Some(ip.trim().to_owned());
77        self.port = Some(port.trim().to_owned());
78        self
79    }
80
81    pub fn set_service_name(mut self, service_name: &str) -> Self {
82        self.serviceName = service_name.to_owned();
83        self
84    }
85
86    pub fn set_group_name(mut self, group_name: &str) -> Self {
87        self.groupName = Some(group_name.to_owned());
88        self
89    }
90
91    pub fn set_space_name(mut self, space_name: &str) -> Self {
92        self.namespaceId = Some(space_name.to_owned());
93        self
94    }
95
96    pub fn get_service_list(&self, page_no: u64, page_size: u64) -> GetServiceList {
97        GetServiceList {
98            pageNo: page_no,
99            pageSize: page_size,
100            groupName: self.groupName.to_owned(),
101            namespaceId: self.namespaceId.to_owned(),
102        }
103    }
104
105    pub fn get_instance_list(&self, service_name: &str, healthy_only: bool) -> GetInstanceList {
106        GetInstanceList{
107            serviceName: service_name.to_owned(),
108            groupName: self.groupName.to_owned(),
109            namespaceId: self.namespaceId.to_owned(),
110            clusters: self.clusterName.to_owned(),
111            healthyOnly: Some(healthy_only),
112        }
113    }
114
115    pub fn get_beat_info(&self, ins_id: &str) -> BeatInfo {
116        BeatInfo{
117            serviceName: self.serviceName.to_owned(),
118            ip: self.ip.to_owned().unwrap(),
119            port: self.port.to_owned().unwrap(),
120            namespaceId: Some(self.namespaceId.to_owned().unwrap_or(String::new())),
121            cluster: Some(self.clusterName.to_owned().unwrap_or(String::new())),
122            weight: Some(self.weight.unwrap_or(1.0)),
123            metadata: self.metadata.to_owned(),
124            period: 5000,
125            scheduled: true,
126            instanceId: ins_id.to_string(),
127        }
128    }
129
130    pub fn get_beat(&self, ins_id: &str) -> Beat {
131        Beat {
132            serviceName: self.serviceName.to_owned(),
133            ip: self.ip.to_owned().unwrap(),
134            port: self.port.to_owned().unwrap(),
135            namespaceId: self.namespaceId.to_owned(),
136            groupName: self.groupName.to_owned(),
137            ephemeral: self.ephemeral,
138            beat: Some(self.get_beat_info(ins_id)),
139        }
140    }
141
142
143    pub fn get_instance(&self) -> GetInstance {
144        GetInstance{
145            ip: self.ip.to_owned().unwrap(),
146            port: self.port.to_owned().unwrap(),
147            namespaceId: self.namespaceId.to_owned(),
148            serviceName: self.serviceName.to_owned(),
149            groupName: self.groupName.to_owned(),
150            cluster: self.clusterName.to_owned(),
151            healthyOnly: false,
152            ephemeral: self.ephemeral,
153        }
154    }
155
156    pub fn get_unregister(&self) -> UnRegister {
157        UnRegister{
158            ip: self.ip.to_owned().unwrap(),
159            port: self.port.to_owned().unwrap(),
160            namespaceId: self.namespaceId.to_owned(),
161            clusterName: self.clusterName.to_owned(),
162            serviceName: self.serviceName.to_owned(),
163            groupName: self.groupName.to_owned(),
164            ephemeral: self.ephemeral,
165        }
166    }
167
168    pub fn get_register(&self) -> Register {
169        Register{
170            ip: self.ip.to_owned().unwrap(),
171            port: self.port.to_owned().unwrap(),
172            namespaceId: self.namespaceId.to_owned(),
173            weight: self.weight.to_owned(),
174            enabled: self.enabled.to_owned(),
175            healthy: self.healthy,
176            metadata: self.metadata.to_owned(),
177            clusterName: self.clusterName.to_owned(),
178            serviceName: self.serviceName.to_owned(),
179            groupName: self.groupName.to_owned(),
180            ephemeral: self.ephemeral,
181        }
182    }
183}
184
185