新增nacos 配置 测试
All checks were successful
git commit AiDA python develop 分支构建部署 / scheduled_deploy (push) Has been skipped
All checks were successful
git commit AiDA python develop 分支构建部署 / scheduled_deploy (push) Has been skipped
This commit is contained in:
@@ -1,5 +1,21 @@
|
||||
import logging
|
||||
from typing import Dict, Any
|
||||
|
||||
import yaml
|
||||
from pydantic import Field
|
||||
from pydantic_settings import BaseSettings, SettingsConfigDict
|
||||
from v2.nacos import ClientConfigBuilder, GRPCConfig, NacosConfigService, ConfigParam, NacosNamingService, RegisterInstanceParam, DeregisterInstanceParam
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# ====================== Nacos 配置 ======================
|
||||
NACOS_SERVER_ADDRESSES = "18.167.251.121:28848"
|
||||
NACOS_NAMESPACE = "zcr"
|
||||
NACOS_USERNAME = "nacos"
|
||||
NACOS_PASSWORD = "Aidlab123123!"
|
||||
NACOS_GROUP = "LOCAL"
|
||||
NACOS_DATA_ID = "aida.python"
|
||||
SERVICE_NAME = "fastapi-service" # ←←← 必须修改!建议格式:项目名-环境,例如 ai-image-service-dev
|
||||
|
||||
|
||||
class Settings(BaseSettings):
|
||||
@@ -81,6 +97,132 @@ class Settings(BaseSettings):
|
||||
|
||||
settings = Settings()
|
||||
|
||||
# ====================== Nacos 配置管理 ======================
|
||||
|
||||
client_config = (ClientConfigBuilder()
|
||||
.server_address(NACOS_SERVER_ADDRESSES)
|
||||
.username(NACOS_USERNAME)
|
||||
.password(NACOS_PASSWORD)
|
||||
.namespace_id(NACOS_NAMESPACE)
|
||||
.log_level('INFO')
|
||||
.grpc_config(GRPCConfig(grpc_timeout=50000))
|
||||
.build())
|
||||
|
||||
# ====================== Nacos 配置管理 ======================
|
||||
nacos_config_data: Dict[str, Any] = {}
|
||||
|
||||
|
||||
async def register_service_to_nacos():
|
||||
"""启动时把服务注册到 Nacos"""
|
||||
if not nacos_initialized_successfully:
|
||||
logger.warning("Nacos 未初始化成功,跳过服务注册")
|
||||
return
|
||||
|
||||
nacos_config_client = await NacosConfigService.create_config_service(client_config)
|
||||
|
||||
if not nacos_config_client: # 如果配置客户端都没连上,就不注册
|
||||
logger.warning("Nacos 配置客户端未初始化,跳过服务注册")
|
||||
return
|
||||
|
||||
try:
|
||||
nacos_naming_client = await NacosNamingService.create_naming_service(client_config)
|
||||
param = RegisterInstanceParam(
|
||||
service_name="aida.python",
|
||||
group_name=NACOS_GROUP,
|
||||
ip="210.0.194.163",
|
||||
port=1671,
|
||||
cluster_name="DEFAULT",
|
||||
weight=1.0,
|
||||
metadata={
|
||||
"version": "1.0.0",
|
||||
"env": settings.SERVE_ENV,
|
||||
"framework": "fastapi",
|
||||
"debug": str(settings.DEBUG),
|
||||
},
|
||||
enabled=True,
|
||||
healthy=True,
|
||||
ephemeral=True, # 临时实例,推荐生产使用
|
||||
)
|
||||
|
||||
await nacos_naming_client.register_instance(request=param)
|
||||
logger.info(f"✅ 服务已成功注册到 Nacos! → {SERVICE_NAME} | {"10.1.1.249"}:{settings.PORT} | env={settings.SERVE_ENV}")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"❌ 服务注册到 Nacos 失败: {e}")
|
||||
|
||||
|
||||
async def deregister_service_from_nacos():
|
||||
"""服务关闭时优雅注销(防止 Nacos 长时间显示不健康实例)"""
|
||||
try:
|
||||
nacos_naming_client = await NacosNamingService.create_naming_service(client_config)
|
||||
param = DeregisterInstanceParam(
|
||||
service_name=SERVICE_NAME,
|
||||
group_name=NACOS_GROUP,
|
||||
ip="210.0.194.163",
|
||||
port=1671,
|
||||
cluster_name='c1',
|
||||
ephemeral=True,
|
||||
)
|
||||
await nacos_naming_client.deregister_instance(request=param)
|
||||
logger.info(f"✅ 服务已从 Nacos 注销 → {SERVICE_NAME}")
|
||||
except Exception as e:
|
||||
logger.warning(f"服务注销时出现异常(通常可忽略): {e}")
|
||||
|
||||
|
||||
nacos_initialized_successfully = False
|
||||
|
||||
|
||||
async def load_nacos_config() -> None:
|
||||
"""初始化 Nacos 配置并监听变化"""
|
||||
global nacos_config_data, settings
|
||||
global nacos_initialized_successfully
|
||||
|
||||
try:
|
||||
client = await NacosConfigService.create_config_service(client_config)
|
||||
# 1. 第一次获取配置
|
||||
content = await client.get_config(ConfigParam(data_id=NACOS_DATA_ID, group=NACOS_GROUP))
|
||||
if content:
|
||||
loaded = yaml.safe_load(content) or {}
|
||||
nacos_config_data = loaded
|
||||
# 用 Nacos 配置覆盖 settings
|
||||
for key, value in loaded.items():
|
||||
if hasattr(settings, key):
|
||||
setattr(settings, key, value)
|
||||
logger.info(f"✅ Nacos 配置加载成功: {NACOS_DATA_ID} | 覆盖字段数量: {len(loaded)}")
|
||||
else:
|
||||
logger.warning("Nacos 返回配置为空,使用 .env + 默认值")
|
||||
|
||||
# 2. 注册动态监听器(配置变更自动刷新)
|
||||
async def listener(tenant: str, data_id: str, group: str, content: str):
|
||||
global nacos_config_data, settings
|
||||
try:
|
||||
new_config = yaml.safe_load(content) if content else {}
|
||||
nacos_config_data = new_config
|
||||
# 实时覆盖 settings
|
||||
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}")
|
||||
logger.info(f"【Nacos 动态更新】{NACOS_DATA_ID}")
|
||||
except Exception as e:
|
||||
logger.error(f"Nacos 配置解析失败: {e}")
|
||||
|
||||
await client.add_listener(NACOS_DATA_ID, NACOS_GROUP, listener)
|
||||
logger.info("✅ Nacos 配置监听器已注册(支持热更新)")
|
||||
nacos_initialized_successfully = True
|
||||
await register_service_to_nacos()
|
||||
except Exception as e:
|
||||
logger.error(f"❌ Nacos 初始化失败: {e}")
|
||||
nacos_initialized_successfully = False
|
||||
|
||||
|
||||
# 提供给 FastAPI 的依赖
|
||||
def get_settings() -> Settings:
|
||||
return settings
|
||||
|
||||
|
||||
"""Design 服务"""
|
||||
# 推荐服装类别映射
|
||||
TABLE_CATEGORIES = {
|
||||
|
||||
Reference in New Issue
Block a user