必须使用 nacos-sdk-python≥2.0.0(推荐2.2.5)并显式传入 namespace_id,用 add_config_watcher 注册回调实现热更新,注意 data_id/group 大小写敏感、回调需异常捕获与线程安全处理。

Python 应用直接对接 Nacos 配置中心,没有官方 SDK 支持,必须依赖社区实现的 nacos-sdk-python,且其 v2.x 版本才真正支持配置监听和长轮询——用错版本或忽略初始化细节,get_config 会返回空或超时,而不是你期望的动态刷新。
确认 nacos-sdk-python 版本并启用监听能力
旧版 nacos-sdk-python==1.0.0 仅提供一次性拉取,不支持 add_config_watcher;必须升级到 nacos-sdk-python>=2.0.0(推荐 2.2.5),该版本底层使用 requests.Session 复用连接,并默认启用长轮询(long_polling_timeout 默认 30s)。
初始化客户端时需显式传入 namespace_id(非必需但强烈建议),否则所有环境共用 public 命名空间,极易冲突:
from nacos import NacosClient <p>client = NacosClient( server_addresses=["<a href="https://www.php.cn/link/a05feb5ea711fae86b501c3dcc77c00c">https://www.php.cn/link/a05feb5ea711fae86b501c3dcc77c00c</a>"], namespace="your-namespace-id-here", # 不是命名空间名称,是控制台里显示的 ID 字符串 username="nacos", password="nacos" )
- 若未填
namespace,默认使用public命名空间(ID 为空字符串),多服务混用时配置互相覆盖 -
server_addresses必须带协议(http://或https://),漏写会导致连接被拒绝,错误信息类似ConnectionRefusedError: [Errno 111] Connection refused - v2.x 默认开启长轮询,无需手动调用
long_polling方法;监听注册后,变更会通过回调函数触发,不是轮询拉取
用 add_config_watcher 实现配置热更新
单纯调用 get_config 只能读一次;要让 Python 进程感知 Nacos 配置变更,必须用 add_config_watcher 注册回调。注意:回调函数在独立线程中执行,不能直接修改主线程的全局变量(如 app.config),需加锁或改用线程安全容器。
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
立即学习“Python免费学习笔记(深入)”;
典型写法示例:
import threading
<p>config_lock = threading.Lock()
app_config = {}</p><p>def config_callback(config_data):
with config_lock:
app_config.update(json.loads(config_data))</p><p>client.add_config_watcher(
data_id="app-dev.yaml",
group="DEFAULT_GROUP",
watcher=config_callback
)
-
data_id和group必须与 Nacos 控制台中创建的配置完全一致(大小写、扩展名、下划线均敏感) - 回调函数参数
config_data是原始字符串,不是 dict,需自行json.loads或yaml.safe_load解析 - 首次注册 watcher 时,SDK 会立即触发一次回调(模拟“初始加载”),因此无需额外调用
get_config
处理配置格式、解析失败与监听中断
Nacos 中配置格式选错(如选了 TEXT 却当 YAML 解析)、JSON 格式错误、或网络抖动导致监听断开,都会让回调静默失败——看起来“没更新”,实则是解析异常被吞掉或监听已失效。
- 务必在回调函数中包
try/except,记录原始config_data和异常,例如:logging.error("config parse failed: %s, raw=%r", e, config_data) - 监听可能因 Nacos 服务重启、网络闪断而中断;
nacos-sdk-pythonv2.x 不自动重连 watcher,需自己检测并重建:监听器无心跳机制,只能靠定期client.get_config对比版本号(tenant+data_id+group)判断是否脱钩 - Python 应用启动时,应先阻塞等待首次配置加载完成(比如设置
event.wait(timeout=5)),避免业务代码读到空配置
最易被忽略的是命名空间 ID 和 data_id/group 的拼写一致性——Nacos 控制台显示的“命名空间名称”不是 ID,data_id 里的点(.)和横线(-)在 URL 中会被编码,但 SDK 内部已处理,你只需确保控制台填什么,代码就传什么。

















