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 接口无法正常访问
相关推荐
databook32 分钟前
概率图模型:机器学习的结构化概率之道
python·机器学习·scikit-learn
拾回程序猿的圈圈∞35 分钟前
实战二:开发网页端界面完成黑白视频转为彩色视频
python·ai编程
亚林瓜子37 分钟前
AWS Elastic Beanstalk + CodePipeline(Python Flask Web的国区CI/CD)
python·ci/cd·flask·web·aws·beanstalk·codepipeline
春末的南方城市38 分钟前
中山大学&美团&港科大提出首个音频驱动多人对话视频生成MultiTalk,输入一个音频和提示,即可生成对应唇部、音频交互视频。
人工智能·python·深度学习·计算机视觉·transformer
深科文库1 小时前
构建 MCP 服务器:第 4 部分 — 创建工具
python·chatgpt·prompt·aigc·agi·ai-native
witton1 小时前
美化显示LLDB调试的数据结构
数据结构·python·lldb·美化·debugger·mupdf·pretty printer
SteveDraw2 小时前
C++动态链接库封装,供C#/C++ 等编程语言使用——C++动态链接库概述(总)
开发语言·c++·c#·封装·动态链接库
十五年专注C++开发2 小时前
设计模式之单例模式(二): 心得体会
开发语言·c++·单例模式·设计模式
nenchoumi31192 小时前
AirSim/Cosys-AirSim 游戏开发(一)XBox 手柄 Windows + python 连接与读取
windows·python·xbox