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 接口无法正常访问
相关推荐
小叶lr几秒前
python 从pycharm部署到新环境
开发语言·python·pycharm
R_.L2 分钟前
【项目】 :C++ - 仿mudou库one thread one loop式并发服务器实现(代码实现)
服务器·开发语言·c++
2301_7634710319 分钟前
Python单元测试(unittest)实战指南
python
xiaoxiongip66622 分钟前
动态ip适合挂什么项目
网络·爬虫·python·网络协议·tcp/ip·ip
Tiger_shl34 分钟前
【.Net技术栈梳理】08-控制反转(IoC)与依赖注入(DI)
开发语言·.net·.netcore
Tiger_shl36 分钟前
【.Net技术栈梳理】10-.NET Core 程序的执行
开发语言·.net·.netcore
Q_Q51100828537 分钟前
springboot+python+uniapp基于微信小程序的旅游服务系统景点信息展示 路线推荐 在线预约 评论互动系统
spring boot·python·微信小程序·django·flask·uni-app
薄荷撞~可乐1 小时前
C#高并发与并行理解处理
开发语言·c#
E___V___E1 小时前
设计模式--装饰器模式
python·设计模式·装饰器模式
孤廖1 小时前
【算法磨剑:用 C++ 思考的艺术・Dijkstra 实战】弱化版 vs 标准版模板,洛谷 P3371/P4779 双题精讲
java·开发语言·c++·程序人生·算法·贪心算法·启发式算法