From 8631f087b5ea4d20450ceb2cd610d0df19bfecf7 Mon Sep 17 00:00:00 2001 From: mxsm Date: Wed, 20 Sep 2023 23:59:12 +0800 Subject: [PATCH 1/2] [ISSUE #47]Read configuration from environment variables --- Cargo.toml | 1 + src/api/constants.rs | 12 ++++++++++ src/api/props.rs | 46 ++++++++++++++++++++++++++++++--------- src/lib.rs | 52 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 101 insertions(+), 10 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 5cab641..2e1ac72 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -73,6 +73,7 @@ want = "0.3.0" dashmap = "5.4.0" home = "0.5.4" +dotenvy = "0.15" [dev-dependencies] tracing-subscriber = { version = "0.3", features = ["default"] } diff --git a/src/api/constants.rs b/src/api/constants.rs index 4ad439d..8800f17 100644 --- a/src/api/constants.rs +++ b/src/api/constants.rs @@ -31,3 +31,15 @@ pub(crate) mod common_remote { /// env `NACOS_CLIENT_COMMON_THREAD_CORES` to set num when multi-cpus, default is num_cpus pub const ENV_NACOS_CLIENT_COMMON_THREAD_CORES: &str = "NACOS_CLIENT_COMMON_THREAD_CORES"; + +pub const ENV_NACOS_CLIENT_COMMON_SERVER_ADDRESS: &str = "nacos.client.server.address"; + +pub const ENV_NACOS_CLIENT_COMMON_SERVER_PORT: &str = "nacos.client.server.port"; + +pub const ENV_NACOS_CLIENT_COMMON_NAMESPACE: &str = "nacos.client.namespace"; + +pub const ENV_NACOS_CLIENT_COMMON_APP_NAME: &str = "nacos.client.app.name"; + +pub const ENV_NACOS_CLIENT_AUTH_USER_NAME: &str = "nacos.client.username"; + +pub const ENV_NACOS_CLIENT_AUTH_PASSWORD: &str = "nacos.client.password"; diff --git a/src/api/props.rs b/src/api/props.rs index 98a18af..44c02d5 100644 --- a/src/api/props.rs +++ b/src/api/props.rs @@ -1,5 +1,8 @@ use std::collections::HashMap; +use crate::api::constants::DEFAULT_SERVER_ADDR; +use crate::properties::{get_value, get_value_u32}; + /// Configures settings for Client. #[derive(Debug, Clone)] pub struct ClientProps { @@ -33,7 +36,10 @@ impl ClientProps { result.push(format!( "{}:{}", host, - crate::api::constants::DEFAULT_SERVER_PORT + get_value_u32( + crate::api::constants::ENV_NACOS_CLIENT_COMMON_SERVER_PORT, + crate::api::constants::DEFAULT_SERVER_PORT, + ) )); continue; } @@ -52,9 +58,12 @@ impl ClientProps { let client_version = format!("Nacos-Rust-Client:{}", env_project_version); ClientProps { - server_addr: String::from(crate::api::constants::DEFAULT_SERVER_ADDR), + server_addr: get_value( + crate::api::constants::ENV_NACOS_CLIENT_COMMON_SERVER_ADDRESS, + DEFAULT_SERVER_ADDR, + ), /// public is "", Should define a more meaningful namespace - namespace: String::from(""), + namespace: get_value(crate::api::constants::ENV_NACOS_CLIENT_COMMON_NAMESPACE, ""), app_name: crate::api::constants::UNKNOWN.to_string(), labels: HashMap::default(), client_version, @@ -65,7 +74,10 @@ impl ClientProps { /// Sets the server addr. pub fn server_addr(mut self, server_addr: impl Into) -> Self { - self.server_addr = server_addr.into(); + self.server_addr = get_value( + crate::api::constants::ENV_NACOS_CLIENT_COMMON_SERVER_ADDRESS, + server_addr.into(), + ); self } @@ -83,7 +95,10 @@ impl ClientProps { /// Sets the app_name. pub fn app_name(mut self, app_name: impl Into) -> Self { - let name = app_name.into(); + let name = get_value( + crate::api::constants::ENV_NACOS_CLIENT_COMMON_APP_NAME, + app_name.into(), + ); self.app_name = name.clone(); self.labels .insert(crate::api::constants::KEY_LABEL_APP_NAME.to_string(), name); @@ -99,16 +114,26 @@ impl ClientProps { /// Add auth username. #[cfg(feature = "auth-by-http")] pub fn auth_username(mut self, username: impl Into) -> Self { - self.auth_context - .insert(crate::api::plugin::USERNAME.into(), username.into()); + self.auth_context.insert( + crate::api::plugin::USERNAME.into(), + get_value( + crate::api::constants::ENV_NACOS_CLIENT_AUTH_USER_NAME, + username.into(), + ), + ); self } /// Add auth password. #[cfg(feature = "auth-by-http")] pub fn auth_password(mut self, password: impl Into) -> Self { - self.auth_context - .insert(crate::api::plugin::PASSWORD.into(), password.into()); + self.auth_context.insert( + crate::api::plugin::PASSWORD.into(), + get_value( + crate::api::constants::ENV_NACOS_CLIENT_AUTH_USER_NAME, + password.into(), + ), + ); self } @@ -121,9 +146,10 @@ impl ClientProps { #[cfg(test)] mod tests { - use super::*; use crate::api::error::Error; + use super::*; + #[test] fn test_get_server_list() { let client_props = ClientProps { diff --git a/src/lib.rs b/src/lib.rs index 46f665d..07077e7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -62,6 +62,57 @@ //! ``` //! +use lazy_static::lazy_static; +use std::collections::HashMap; +use std::path::Path; + +const ENV_CONFIG_FILE_PATH: &str = "CONFIG_FILE_PATH"; + +lazy_static! { + static ref PROPERTIES: HashMap = { + let env_file_path = std::env::var(ENV_CONFIG_FILE_PATH).ok(); + let _ = env_file_path.as_ref().map(|file_path| { + dotenvy::from_path(Path::new(file_path)).or_else(|e| { + let _ = dotenvy::dotenv(); + Err(e) + }) + }); + dotenvy::dotenv().ok(); + + let prop = dotenvy::vars() + .into_iter() + .collect::>(); + + prop + }; +} + +pub(crate) mod properties { + use crate::PROPERTIES; + + pub(crate) fn get_value(key: Key, default: Default) -> String + where + Key: AsRef, + Default: AsRef, + { + PROPERTIES + .get(key.as_ref()) + .map_or(default.as_ref().to_string(), |value| value.to_string()) + } + + pub(crate) fn get_value_u32(key: Key, default: u32) -> u32 + where + Key: AsRef, + { + PROPERTIES.get(key.as_ref()).map_or(default, |value| { + value + .to_string() + .parse::() + .map_or_else(|_e| default, |v| v) + }) + } +} + /// Nacos API pub mod api; @@ -120,6 +171,7 @@ mod test_config { use tracing::metadata::LevelFilter; static LOGGER_INIT: Once = Once::new(); + pub(crate) fn setup_log() { LOGGER_INIT.call_once(|| { tracing_subscriber::fmt() From 49b86d025e3a2a8cfd49a620c7a5389fe695fb1f Mon Sep 17 00:00:00 2001 From: mxsm Date: Thu, 21 Sep 2023 02:40:32 +0000 Subject: [PATCH 2/2] optimize code --- src/api/constants.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/api/constants.rs b/src/api/constants.rs index 8800f17..88b9a28 100644 --- a/src/api/constants.rs +++ b/src/api/constants.rs @@ -32,14 +32,14 @@ pub(crate) mod common_remote { /// env `NACOS_CLIENT_COMMON_THREAD_CORES` to set num when multi-cpus, default is num_cpus pub const ENV_NACOS_CLIENT_COMMON_THREAD_CORES: &str = "NACOS_CLIENT_COMMON_THREAD_CORES"; -pub const ENV_NACOS_CLIENT_COMMON_SERVER_ADDRESS: &str = "nacos.client.server.address"; +pub const ENV_NACOS_CLIENT_COMMON_SERVER_ADDRESS: &str = "NACOS_CLIENT_SERVER_ADDRESS"; -pub const ENV_NACOS_CLIENT_COMMON_SERVER_PORT: &str = "nacos.client.server.port"; +pub const ENV_NACOS_CLIENT_COMMON_SERVER_PORT: &str = "NACOS_CLIENT_SERVER_PORT"; -pub const ENV_NACOS_CLIENT_COMMON_NAMESPACE: &str = "nacos.client.namespace"; +pub const ENV_NACOS_CLIENT_COMMON_NAMESPACE: &str = "NACOS_CLIENT_NAMESPACE"; -pub const ENV_NACOS_CLIENT_COMMON_APP_NAME: &str = "nacos.client.app.name"; +pub const ENV_NACOS_CLIENT_COMMON_APP_NAME: &str = "NACOS_CLIENT_APP_NAME"; -pub const ENV_NACOS_CLIENT_AUTH_USER_NAME: &str = "nacos.client.username"; +pub const ENV_NACOS_CLIENT_AUTH_USER_NAME: &str = "NACOS_CLIENT_USERNAME"; -pub const ENV_NACOS_CLIENT_AUTH_PASSWORD: &str = "nacos.client.password"; +pub const ENV_NACOS_CLIENT_AUTH_PASSWORD: &str = "NACOS_CLIENT_PASSWORD";