nacos是一个分布式配置中心,可用它做配置管理、服务发现等,目前用到它的是配置中心的功能
在日常的web开发中常常会用到一些配置,如数据库连接地址、端口、账号、密码,jwt密钥等配置,如果是直接写在config配置文件中的话,等项目启动后再想变更配置参数会很麻烦,而且如果服务多的话修改起来也麻烦,所有需要一个配置中心记录配置信息,各个服务都从配置中心中拉取配置参数,后端服务做个长轮训监听配置中心的配置消息,如果有变动则更新服务中的配置
nacos安装启动
选用docker安装nacos
docker pull nacos/nacos-server
# MODE=standalone 参数表明是单机运行,nacos可以集群部署
# nacos是java写的,如果服务器内存小的话需要配置jvm参数
docker run --name nacos-standalone -e MODE=standalone -e JVM_XMS=512m -e JVM_XMX=512m -e
JVM_XMN=256m -p 8848:8848 -d nacos/nacos-server:latest
启动后默认账号密码都是nacos
nacos使用配置
新建命名空间,命名空间相当于服务的配置,一个服务下可以有多个配置
新增配置
新增或修改完配置后点击发布将配置添加或修改到配置中心里
后端获取nacos配置
import hashlib
import aiohttp
# 配置参数区
NacosConfig = {
"dataid": "cook_info_srv", # 配置的dataid
"group": "cook_info", # 配置的分组
"host": "http://192.168.146.140",
"port": 8848,
"namespaceid": "600e3596-7f1f-4f73-8e7a-3a035df7dedd", # 配置命名空间id
"md5": "" # 用来保存服务配置的md5值,在监听过程中就是使用md5的值来判断nacos中的配置数据是否有修改
}
WxConfig = dict()
JWT_ENCRYPT_KEY = ""
# 监听nacos配置
async def listener_config_update():
listenerConfigUrl = "{}:{}/nacos/v1/cs/configs/listener".format(NacosConfig["host"], NacosConfig["port"])
# http长链接,nacos会保存请求30秒,在30秒内如果有变动就返回
header = {"Long-Pulling-Timeout": "30000"}
while True:
session = aiohttp.ClientSession()
try:
# 监听配置参数,
data = {"Listening-Configs": NacosConfig["dataid"] + "\002" + NacosConfig["group"]
+ "\002" + NacosConfig["md5"] + "\002" + NacosConfig["namespaceid"] + "\001"}
re = await session.post(listenerConfigUrl, data=data, headers=header)
ret = await re.text()
# 如果配置文件有变动,则更新配置文件
if ret:
await init_env(session)
except Exception as e:
print("监听配置文件出现错误: ", e)
finally:
await session.close()
# 获取nacos配置
async def get_config(session: aiohttp.ClientSession):
# 获取nacos配置url
getConfigUrl = "{}:{}/nacos/v1/cs/configs".format(NacosConfig["host"], NacosConfig["port"])
params = {
"dataId": NacosConfig["dataid"],
"group": NacosConfig["group"],
"tenant": NacosConfig["namespaceid"]
}
re = await session.get(getConfigUrl, params=params)
ret = await re.text()
md5 = hashlib.md5()
md5.update(ret.encode())
# 获取配置md5
NacosConfig["md5"] = md5.hexdigest()
config = await re.json()
return config
# 初始化配置
async def init_env(session: aiohttp.ClientSession):
# 获取nacos配置json
config = await get_config(session)
# 初始化数据库连接
# if config["database"] != Database:
# await init_databases(config["database"])
# Database = config["database"]
if config.get("WxConfig") != WxConfig:
WxConfig = config.get("WxConfig")
JWT_ENCRYPT_KEY = config.get("JWTConfig").get("JWT_ENCRYPT_KEY")
在web服务器启动的时候从nacos中获取配置参数动态初始化项目配置, 初始化完成后监听nacos配置,如果监听发现nacos中配置有变动,那么就调用初始化方法重新初始化变动的部分