当前位置: 首页 > article >正文

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 接口无法正常访问


http://www.kler.cn/a/510266.html

相关文章:

  • 论文阅读:CosAE Learnable Fourier Series for Image Restoration
  • 【Web】2025西湖论剑·中国杭州网络安全安全技能大赛题解(全)
  • Spring Security(maven项目) 3.0.2.5版本中改
  • 第22篇 基于ARM A9处理器用汇编语言实现中断<四>
  • Web前端------表单标签
  • Google地图瓦片爬虫
  • Node.js 与 JavaScript 是什么关系
  • 47,【5】BUUCTF web lovesql
  • 联德胜w801开发板(四)实现腾讯云mqtt的订阅和发布
  • 浅谈 JVM
  • Gitlab Runner安装与配置
  • mkv转码mp4(ffmpeg工具)
  • 寒假1.18
  • VUE学习笔记(入门)4__安装开发者工具
  • ElasticSearch上
  • 51.WPF应用加图标指南 C#例子 WPF例子
  • Node.js path.resolve
  • clang、C++23标准库模块基本使用
  • Vue如何构建项目
  • go采集注册表
  • imread和jpeg_read在MATLAB中处理图像时的不同
  • 1.17组会汇报
  • windows-本地部署Git仓库-安装Gitea
  • LQ1043 双面打印
  • flask项目中使用schedule定时任务案例
  • 第 7 课Python 容器类型与相关操作