109 lines
3.5 KiB
Python
109 lines
3.5 KiB
Python
|
|
import logging
|
||
|
|
import yaml
|
||
|
|
import nacos
|
||
|
|
|
||
|
|
from app.core.config import settings
|
||
|
|
|
||
|
|
logger = logging.getLogger("nacos")
|
||
|
|
|
||
|
|
# client config
|
||
|
|
NACOS_SERVER_ADDRESSES = "18.167.251.121:28848"
|
||
|
|
NACOS_NAMESPACE = "zcr"
|
||
|
|
NACOS_USERNAME = "nacos"
|
||
|
|
NACOS_PASSWORD = "Aidlab123123!"
|
||
|
|
|
||
|
|
# nacos config info
|
||
|
|
NACOS_CONFIG_GROUP = "LOCAL"
|
||
|
|
NACOS_CONFIG_DATA_ID = "aida.python"
|
||
|
|
|
||
|
|
# nacos server config
|
||
|
|
NACOS_SERVICE_NAME = "AiDA-DEV" # ←←← 必须修改!建议格式:项目名-环境,例如 ai-image-service-dev
|
||
|
|
NACOS_SERVICE_IP = "127.0.0.1"
|
||
|
|
NACOS_SERVICE_PORT = 8445
|
||
|
|
|
||
|
|
# nacos client
|
||
|
|
client = nacos.NacosClient(
|
||
|
|
server_addresses=NACOS_SERVER_ADDRESSES,
|
||
|
|
namespace=NACOS_NAMESPACE,
|
||
|
|
username=NACOS_USERNAME,
|
||
|
|
password=NACOS_PASSWORD
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
def listener_config_callback(args):
|
||
|
|
data_id = args['data_id']
|
||
|
|
namespace = args['namespace']
|
||
|
|
group = args['group']
|
||
|
|
content = args['content']
|
||
|
|
logger.info("【Nacos】配置")
|
||
|
|
try:
|
||
|
|
logger.info(f"【Nacos】 动态更新 : data_id : {data_id} | namespace : {namespace} | group_name: {group}")
|
||
|
|
new_config = yaml.safe_load(content) if content else {}
|
||
|
|
for key, value in new_config.items():
|
||
|
|
if hasattr(settings, key):
|
||
|
|
old_val = getattr(settings, key)
|
||
|
|
setattr(settings, key, value)
|
||
|
|
if old_val != value:
|
||
|
|
logger.info(f"🔄 配置更新 → {key}: {old_val} → {value}")
|
||
|
|
except Exception as e:
|
||
|
|
logger.error(f"【Nacos】 配置解析失败: {e}")
|
||
|
|
|
||
|
|
|
||
|
|
def remove_config_callback(args):
|
||
|
|
data_id = args['data_id']
|
||
|
|
namespace = args['namespace']
|
||
|
|
print(f" remove_config_callback : {data_id} | namespace : {namespace}")
|
||
|
|
|
||
|
|
|
||
|
|
def load_nacos_config():
|
||
|
|
"""初始化 Nacos 配置并监听变化"""
|
||
|
|
logger.info(f"【Nacos】 配置订阅 - 初次获取配置信息")
|
||
|
|
|
||
|
|
try:
|
||
|
|
# 1. 第一次获取配置
|
||
|
|
content = client.get_config(data_id=NACOS_CONFIG_DATA_ID, group=NACOS_CONFIG_GROUP)
|
||
|
|
if content:
|
||
|
|
loaded = yaml.safe_load(content) or {}
|
||
|
|
for key, value in loaded.items():
|
||
|
|
if hasattr(settings, key):
|
||
|
|
setattr(settings, key, value)
|
||
|
|
logger.info(f"【Nacos】✅ 配置加载成功: {NACOS_CONFIG_DATA_ID} | 覆盖字段数量: {len(loaded)}")
|
||
|
|
else:
|
||
|
|
logger.warning("【Nacos】 返回配置为空,使用 .env + 默认值")
|
||
|
|
|
||
|
|
client.add_config_watcher(data_id=NACOS_CONFIG_DATA_ID, group=NACOS_CONFIG_GROUP, cb=listener_config_callback)
|
||
|
|
logger.info("【Nacos】✅ 配置监听器已注册(支持热更新)")
|
||
|
|
except Exception as e:
|
||
|
|
logger.error(f"【Nacos】❌ 初始化失败: {e},将仅使用 .env 配置")
|
||
|
|
finally:
|
||
|
|
client.remove_config_watcher(
|
||
|
|
data_id=NACOS_CONFIG_DATA_ID,
|
||
|
|
group=NACOS_CONFIG_GROUP,
|
||
|
|
cb=remove_config_callback
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
def register_server():
|
||
|
|
logger.info(f"nacos 服务注册")
|
||
|
|
try:
|
||
|
|
client.add_naming_instance(
|
||
|
|
service_name=NACOS_SERVICE_NAME,
|
||
|
|
ip=NACOS_SERVICE_IP,
|
||
|
|
port=NACOS_SERVICE_PORT,
|
||
|
|
metadata={"status": "ok"},
|
||
|
|
)
|
||
|
|
except Exception as e:
|
||
|
|
logger.warning(f"【Nacos】❌ 服务注册失败 : {e}")
|
||
|
|
|
||
|
|
|
||
|
|
def deregister_server():
|
||
|
|
logger.info(f"nacos 服务注册")
|
||
|
|
try:
|
||
|
|
client.remove_naming_instance(
|
||
|
|
service_name=NACOS_SERVICE_NAME,
|
||
|
|
ip=NACOS_SERVICE_IP,
|
||
|
|
port=NACOS_SERVICE_PORT
|
||
|
|
)
|
||
|
|
except Exception as e:
|
||
|
|
logger.warning(f"【Nacos】❌ 服务注销失败 : {e}")
|