mod client;
mod service;
use dashmap::DashMap;
use nacos_rust_client::client::naming_client::Instance;
use once_cell::sync::Lazy;
use std::sync::Arc;
static SERVICE_INSTANCES: Lazy<DashMap<String, Vec<Arc<Instance>>>> = Lazy::new(|| DashMap::new());
static NACOS_CONFIGS: Lazy<DashMap<String, String>> = Lazy::new(|| DashMap::new());
pub fn get_service_instances(service_name: &str) -> Option<Vec<Arc<Instance>>> {
SERVICE_INSTANCES
.get(service_name)
.map(|entry| entry.value().clone())
}
pub(crate) fn update_service_instances(service_name: &str, instances: Vec<Arc<Instance>>) {
if instances.is_empty() {
if let Some(existing) = SERVICE_INSTANCES.get(service_name) {
if !existing.value().is_empty() {
tracing::warn!(
"⚠️ 拒绝用空列表覆盖服务 {} 的 {} 个现有实例(防御虚假回调)",
service_name,
existing.value().len()
);
return;
}
}
}
SERVICE_INSTANCES.insert(service_name.to_string(), instances);
}
pub fn get_config(data_id: &str, group: Option<&str>, namespace: Option<&str>) -> Option<String> {
let group = group.unwrap_or("DEFAULT_GROUP");
let namespace = namespace.unwrap_or("public");
let key = format!("{}:{}:{}", data_id, group, namespace);
NACOS_CONFIGS.get(&key).map(|entry| entry.value().clone())
}
pub fn get_subscribed_configs() -> Vec<String> {
NACOS_CONFIGS
.iter()
.map(|entry| entry.key().clone())
.collect()
}
pub fn get_subscribed_services() -> Vec<String> {
SERVICE_INSTANCES
.iter()
.map(|entry| entry.key().clone())
.collect()
}
pub(crate) fn update_config(data_id: &str, group: &str, namespace: &str, value: String) {
let key = format!("{}:{}:{}", data_id, group, namespace);
NACOS_CONFIGS.insert(key, value);
}
pub use client::{get_config_client, get_naming_client, init_nacos};
pub use service::{deregister_service, register_service, subscribe_configs, subscribe_services};