nacos_api/integration/
configs.rs

1use crate::{NacosConfigApi, NacosConfig, DeployConfig};
2use tokio::task;
3use tokio::time;
4use std::time::Duration;
5
6/// NacosClient 是主要的nacos配置中心调用结构 ,
7/// NacosClient is the primary struct to call nacos configs center .
8#[derive(Clone)]
9pub struct NacosConfigClient {
10    config_api: NacosConfigApi,
11}
12
13impl NacosConfigClient {
14    pub fn new(data_id: &str, group: &str, tenant: Option<String>) -> Self
15    { Self { config_api: NacosConfigApi::new(DeployConfig::new(data_id, group, tenant)) } }
16    pub fn from(config_api: NacosConfigApi) -> Self { Self { config_api } }
17    pub fn config_api(&self) -> &NacosConfigApi { &self.config_api }
18}
19
20impl NacosConfigClient {
21    /// 后台线程持续监听配置 如果改变 则将改变后的配置返回给[func] ,
22    /// keep listen configs in background and return changed configs to [func] .
23    /// ```rust
24    /// use nacos_api::{NacosConfigClient, NacosConfigApi, DeployConfig, NacosConfig};
25    ///
26    /// let client = NacosConfigClient::new("test_data", "test_grep", None);
27    /// let nacos_config = NacosConfig::new("http", "139.155.225.19", 8848);
28    /// // listen the nacos configs center
29    /// client.listen_config(
30    ///     &nacos_config,
31    ///     |s| { println!(" perceive the configs changed to > {}", s) },
32    ///     10
33    /// ).await;
34    /// // make the program keep alive
35    /// loop {}
36    /// ```
37    pub async fn listen_config<F>(&self, nacos_config: &NacosConfig, func: F, interval_secs: u64)
38        where F: Fn(&String) + Send + 'static
39    {
40        task::spawn(listen(
41            self.config_api.clone(),
42            nacos_config.clone(),
43            func,
44            interval_secs,
45        )).await.unwrap()
46    }
47}
48
49async fn listen<F>(config_api: NacosConfigApi, nacos_config: NacosConfig, func: F, interval_secs: u64)
50    where F: Fn(&String)
51{
52    let prev_conf = config_api.get_configs(&nacos_config).await.unwrap();
53    let mut prev_conf_md5 = format!("{:x}", md5::compute(prev_conf));
54    println!(" -- [debug] starting listen configs");
55    loop {
56        time::sleep(Duration::from_secs(interval_secs)).await;
57        let current_conf = config_api.get_configs(&nacos_config).await.unwrap();
58        let current_conf_md5 = format!("{:x}", md5::compute(&current_conf));
59        if prev_conf_md5.ne(&current_conf_md5) {
60            func(&current_conf);
61            prev_conf_md5 = current_conf_md5;
62        }
63    }
64}