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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/956188.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenEuler学习笔记(一):常见命令

OpenEuler是一个开源操作系统,有许多命令可以用于系统管理、软件安装、文件操作等诸多方面。以下是一些常见的命令: 一、系统信息查看命令 uname 用途:用于打印当前系统相关信息,如内核名称、主机名、内核版本等。示例&#xff…

聊聊如何实现Android 放大镜效果

一、前言 很久没有更新Android 原生技术内容了,前些年一直在做跨端方向开发,最近换工作用重新回到原生技术,又回到了熟悉但有些生疏的环境,真是感慨万分。 近期也是因为准备做地图交互相关的需求,功能非常复杂&#x…

C++,设计模式,【目录篇】

文章目录 1. 简介2. 设计模式的分类2.1 创建型模式(Creational Patterns):2.2 结构型模式(Structural Patterns):2.3 行为型模式(Behavioral Patterns): 3. 使用设计模式…

RabbitMQ集群安装rabbitmq_delayed_message_exchange

1、单节点安装rabbitmq安装延迟队列 安装延迟队列rabbitmq_delayed_message_exchange可以参考这个文章: rabbitmq安装延迟队列-CSDN博客 2、集群安装rabbitmq_delayed_message_exchange 在第二个节点 join_cluster 之后,start_app 就会报错了 (CaseC…

【C++】如何从源代码编译红色警戒2地图编辑器

【C】如何从源代码编译红色警戒2地图编辑器 操作视频视频中的代码不需要下载三方库,已经包含三方库。 一、运行效果:二、源代码来源及编程语言:三、环境搭建:安装红警2安装VS2022下载代码,源代码其实不太多&#xff0c…

下定决心不去读研了。。。

大家好,我是苍何。 之前发表过一篇文章,表达了自己读研的困惑和纠结,得到了大家很多的建议,也引起了很多人的共鸣,在留言区分享了自己的故事,看着这些故事,我觉得都够苍何写一部小说了。 可惜苍…

重温STM32之环境安装

缩写 CMSIS:common microcontroller software interface standard 1,keil mdk安装 链接 Keil Product Downloads 安装好后,开始安装平台软件支持包(keil 5后不在默认支持所有的平台软件开发包,需要自行下载&#…

[苍穹外卖] 1-项目介绍及环境搭建

项目介绍 定位:专门为餐饮企业(餐厅、饭店)定制的一款软件产品 功能架构: 管理端 - 外卖商家使用 用户端 - 点餐用户使用 技术栈: 开发环境的搭建 整体结构: 前端环境 前端工程基于 nginx 运行 - Ngi…

能源物联网数据采集设备 串口服务器功能参数介绍

摘要 ​随着物联网技术的快速发展,各种传统设备的联网需求愈发迫切。串口服务器作为一种桥接传统串口设备与现代网络的关键设备,在工业控制、智能电网、交通运输等域发挥了重要作用。本文以APort100串口服务器为例,探讨串口服务器在现代物联…

20250118拿掉荣品pro-rk3566开发板上Android13下在uboot和kernel启动阶段的Rockchip这个LOGO标识

20250118拿掉荣品pro-rk3566开发板上Android13下在uboot和kernel启动阶段的Rockchip这个LOGO标识 2025/1/18 15:12 缘起:做飞凌OK3588-C开发板/核心板【Linux R4】的时候,测试/生产要求没有开机LOGO【飞凌/Rockchip】 要求:黑屏或者中性界面。…

【STM32-学习笔记-4-】PWM、输入捕获(PWMI)

文章目录 1、PWMPWM配置 2、输入捕获配置3、编码器 1、PWM PWM配置 配置时基单元配置输出比较单元配置输出PWM波的端口 #include "stm32f10x.h" // Device headervoid PWM_Init(void) { //**配置输出PWM波的端口**********************************…

RocketMQ源码之消息刷盘分析

前言 刷盘是将内存中的消息写入磁盘,分为同步刷盘和异步刷盘。同步刷盘指一条消息写入磁盘才返回成功,异步刷盘指写入内存就返回成功,稍后异步线程刷盘。 在创建CommitLog对象的时候,会初始化刷盘服务: //代码位置:org.apache.rocketmq.store.CommitLog public CommitL…

navicat 折线图或面积图

折线图或面积图将信息显示为以直线段连接的一系列数据点。 折线图 面积图 堆积面积图 图表属性 选择图表类型后,可以更改其属性来自定义图表: 选项 描述 常规 背景颜色 设置图表区域的背景颜色。 不透明度 设置背景颜色的不透明度。 显示边框…

【数模学习笔记】插值算法和拟合算法

声明:以下笔记中的图片以及内容 均整理自“数学建模学习交流”清风老师的课程资料,仅用作学习交流使用 文章目录 插值算法定义三个类型插值举例插值多项式分段插值三角插值 一般插值多项式原理拉格朗日插值法龙格现象分段线性插值 牛顿插值法 Hermite埃尔…

机器学习皮马印第安人糖尿病数据集预测报告

目录 1.项目选题与设计方案 1.1项目选题 1.2设计方案 2.功能实现 2.1 主要功能介绍 2.2 开发环境及平台介绍 2.3 实现过程 2.3.1数据分析 2.3.2算法设计 2.3.3 python代码 3.个人心得体会 1.项目选题与设计方案 1.1项目选题 我国的糖尿病患者初诊时约8&a…

STM32 FreeRTOS任务通知

目录 任务通知的简介 任务通知相关API函数介绍 任务通知的简介 任务通知是 FreeRTOS 中一种用于任务间通信的机制,它允许一个任务向其他任务发送简单的通知或信号,以实现任务间的同步和协作。任务通知通常用于替代二值信号量或事件标志组,提…

提示词的艺术----AI Prompt撰写指南(个人用)

提示词的艺术 写在前面 制定提示词就像是和朋友聊天一样,要求我们能够清楚地表达问题。通过这个过程,一方面要不断练习提高自己地表达能力,另一方面还要锻炼自己使用更准确精炼的语言提出问题的能力。 什么样的提示词有用? 有…

微服务网关,如何选择?

什么是API网关 API网关(API Gateway)是微服务架构中的一个关键组件,它充当了客户端与后端服务之间的中间层。其主要功能包括请求路由、协议转换、负载均衡、安全认证、限流熔断等。通过API网关,客户端无需直接与多个微服务交互&a…

PortSwigger靶场练习---第二关-查找和利用未使用的 API 端点

第二关:Finding and exploiting an unused API endpoint 实验:查找和利用未使用的 API 端点 PortSwigger靶场地址: Dashboard | Web Security Academy - PortSwigger 题目: 官方提示: 在 Burp 的浏览器中&#xff0c…

深度学习中的张量 - 使用PyTorch进行广播和元素级操作

深度学习中的张量 - 使用PyTorch进行广播和元素级操作 元素级是什么意思? 元素级操作在神经网络编程中与张量的使用非常常见。让我们从一个元素级操作的定义开始这次讨论。 一个_元素级_操作是在两个张量之间进行的操作,它作用于各自张量中的相应元素…