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 pub url: String,
28 pub client_beat_interval: u64,
30 pub serviceName: String,
32 pub ip: Option<String>,
34 pub port: Option<String>,
36 pub namespaceId: Option<String>,
38 pub weight: Option<f64>,
40 pub enabled: Option<bool>,
42 pub healthy: Option<bool>,
44 pub metadata: Option<String>,
46 pub clusterName: Option<String>,
48 pub groupName: Option<String>,
50 pub ephemeral: Option<bool>,
52}
53
54impl 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