Nacos与Dynaconf神仙组合,打造纯动态配置

MicLon原创2023年12月12日
大约 2 分钟

概述

Nacosopen in new window 是一个动态服务发现、配置管理和服务管理平台,支持多种服务类型和特性,帮助您快速构建、交付和管理云原生应用。 Dynaconfopen in new window 是一个用 Python 实现的轻量级配置管理库,它支持多种格式的配置文件,并且可以动态修改配置。

这个两位一组合,可以实现纯动态配置,无需重启服务,就可以修改配置。

nacos sdk

在阅读了官方仓库的nacos-sdk-pythonopen in new window源码之后总感觉差强人意,不支持异步,issues和PR也很多没人处理。看了实现也不算难,花了几天时间自己实现了一个use-nacosopen in new window

from use_nacos import NacosClient

client = NacosClient(...)

# publish config
client.config.publish("test_config", "DEFAULT_GROUP", "test_value")
# get config
assert client.config.get("test_config", "DEFAULT_GROUP") == "test_value"


# subscribe config

def config_update(config):
    print(config)


client.config.subscribe(
    "test_config",
    "DEFAULT_GROUP",
    callback=config_update
)

在配置这块,内置了基于内存和本地文件的缓存,可以应对配置中心服务宕机的情况。

刷新配置

config_update 回调函数,可以实现云端配置更改后立刻拿到最新配置。

但是如何在不重启服务的情况下更新程序的配置呢?

在之前写多环境配置文件管理的时候。我提到了使用dynaconf,而笔者一直以来项目中配置管理也都是在用它。(笔者还是贡献者之一😁)它支持动态修改配置,并且支持多种格式的配置文件。

有了它我不仅可以环境变量修改配置,也可以通过nacos动态修改配置后刷新程序配置。

下面演示下在FastAPI中使用dynaconfuse-nacos实现动态配置刷新。

安装

pip install dynaconf use-nacos

使用

from contextlib import asynccontextmanager

from fastapi import FastAPI
from config import settings
from use_nacos import NacosAsyncClient


@asynccontextmanager
async def lifespan(app: FastAPI):
    nacos = NacosAsyncClient(...)

    config_subscriber = await nacos.config.subscribe(
        data_id="test-config",
        group="DEFAULT_GROUP",
        callback=lambda conf: settings.update(conf),
        serialized=True
    )
    yield
    config_subscriber.cancel()


app = FastAPI(lifespan=lifespan)


@app.get("/")
def home():
    return {"message": settings.kwargs}


if __name__ == '__main__':
    import uvicorn
    uvicorn.run("app:app", port=8000)

当我在nacos中修改配置后,FastAPI会立刻拿到最新的配置。

Loading...