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