python+django+Nacos实现配置动态更新-集中管理配置(实现mysql配置动态读取及动态更新)

一、docker-compose.yml 部署nacos服务

复制代码
version: "3"
services:
  mysql:
    container_name: mysql
    # 5.7
    image: mysql:5.7
    environment:
      # mysql root用户密码
      MYSQL_ROOT_PASSWORD: root
      TZ: Asia/Shanghai
      # 初始化数据库(后续的初始化sql会在这个库执行)
      MYSQL_DATABASE: nacos_config
      # 初始化用户(不能是root 会报错, 后续需要给新用户赋予权限)
      MYSQL_USER: nacos
      MYSQL_PASSWORD: nacos
    command:
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
      --max_allowed_packet=128M;
    volumes:
      # mysql的数据文件
      - /soft/mysql/data:/var/lib/mysql
      # mysql配置文件
      - /sof/mysql/conf:/etc/mysql/conf.d
    ports:
      - "8081:3306"
  nacos3:
    hostname: nacos3
    image: nacos/nacos-server:2.0.3
    container_name: nacos3
    volumes:
      #- ./nacos/plugins/mysql/:/home/nacos/plugins/mysql/
      - /soft/nacos/logs/:/home/nacos/logs
      - /soft/nacos/application.properties:/home/nacos/init.d/application.properties
    environment:                      # 设置环境变量,相当于docker run命令中的-e
      - JVM_XMS=215m
      - JVM_XMX=215m
      - JVM_XMN=215m
      - MODE=standalone               #单机模式
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_SERVICE_HOST=120.26.3.89
      - MYSQL_SERVICE_PORT=8081
      - MYSQL_SERVICE_USER=nacos
      - MYSQL_SERVICE_PASSWORD=nacos
      - MYSQL_SERVICE_DB_NAME=nacos_config
    ports:
      - "8848:8848"
      #- "7848:7848"
      - "9848:9848"
      - "9849:9849"
    #env_file:
    #  - /soft/nacos/nacos-hostname.env
    restart: always
    depends_on:
      - mysql

二、启动docker

复制代码
#cd 到docker-compose.yml文件所在目录 
#执行
docker-compose up -d
复制代码
#访问 Nacos平台
http://ip地址:8848/nacos/
复制代码
#新建命名空间
public(默认有的),dev(开发环境),test(测试环境)
复制代码
nacos启动后会生成相应的表

三、python django settings.py文件 中mysql 配置动态读取

复制代码
#python Django 集成nacos
pip install nacos-sdk-python

###################################settings.py###################################

# Nacos 配置
NACOS_SERVER = "ip:8848"  # Nacos 服务器地址 ip 换成Nacos对应的IP地址
NACOS_NAMESPACE = "dev"  # Nacos 命名空间
NACOS_GROUP = "MICRO_GROUP"  # Nacos 分组
NACOS_DATA_ID = "operation_config_dev"  # Nacos 配置 ID

# 初始化 Nacos 客户端
nacos_client = NacosClient(NACOS_SERVER, namespace=NACOS_NAMESPACE)

# 从 Nacos 获取 MySQL 配置
mysql_config = nacos_client.get_config(NACOS_DATA_ID, NACOS_GROUP)
mysql_config = eval(mysql_config)  # 将 JSON 字符串转换为字典

# 配置 MySQL 数据库
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': mysql_config.get("DATABASE_NAME"),
        'USER': mysql_config.get("DATABASE_USER"),
        'PASSWORD': mysql_config.get("DATABASE_PASSWORD"),
        'HOST': mysql_config.get("DATABASE_HOST"),
        'PORT': mysql_config.get("DATABASE_PORT", "8081"),
        'OPTIONS': {
            'charset': 'utf8mb4',  # 支持更广泛的字符集
        },
    }
}

print(f"更新前 Databases: {DATABASES}")
def update_mysql_config(config):
    """动态更新 MySQL 配置"""
    global DATABASES
    print("收到 Nacos 配置更新通知")
    print(f"收到更新后 config: {config}")

    # 使用 json.loads 解析 JSON 字符串
    mysql_config = json.loads(config['content'])

    print(f"更新后 Databases: {mysql_config}")

    DATABASES['default'].update({
        'NAME': mysql_config.get("DATABASE_NAME"),
        'USER': mysql_config.get("DATABASE_USER"),
        'PASSWORD': mysql_config.get("DATABASE_PASSWORD"),
        'HOST': mysql_config.get("DATABASE_HOST"),
        'PORT': mysql_config.get("DATABASE_PORT", "3306"),
    })

# 监听 Nacos 配置变化
nacos_client.add_config_watcher(NACOS_DATA_ID, NACOS_GROUP, update_mysql_config)

四、在Nacos上配置Mysql连接配置

复制代码
{
  "DATABASE_NAME": "micro_biz_log",
  "DATABASE_USER": "root",
  "DATABASE_PASSWORD": "root",
  "DATABASE_HOST": "xxx.xxx.xxx.xxx", #换成自己的Ip地址
  "DATABASE_PORT": "8081"  #mysql服务的端口
} 

五、启动django项目 (需要支持WebSocket或其他异步通信,使用daphne启动)

复制代码
#安装Daphne
pip install daphne

#终端输入
daphne operation.asgi:application

六、验证查看控制台输出

复制代码
#将nacos中配置  "DATABASE_PORT": "8082" 端口修改成 8082

七、页面接口验证

复制代码
# 修改前 mysql端口 8081 接口能正常访问
复制代码
# 修改后 mysql端口 8082 接口无法正常访问
相关推荐
北冥you鱼5 小时前
Go语言常用包使用指南:从标准库到第三方利器
开发语言·microsoft·golang
俺不中嘞5 小时前
python常用函数
开发语言·python
薛定猫AI5 小时前
【技术干货】大模型文档结构化提取实战:Python解析PDF发票并批量生成CSV
java·python·pdf
zhiSiBuYu05175 小时前
RAG 性能优化与缓存策略实战指南
人工智能·python·机器学习
荣码5 小时前
Prompt工程实战:同一个需求换3种写法,效果差10倍
java·python
想会飞的蒲公英5 小时前
集成学习入门:Bagging、Boosting 到底在组合什么
人工智能·python·机器学习·集成学习·boosting
努力努力再努力搬砖5 小时前
批量下载ERA5数据
python
_老码5 小时前
AI-reader阅读助手开发过程
人工智能·python·ai
এ慕ོ冬℘゜5 小时前
深入理解 JavaScript 事件对象:从 target 到 preventDefault 的实战指南
开发语言·前端·javascript
_Jimmy_5 小时前
python性能分析工具
python