Nacos 分布式配置中心配置
Docker 安装 Nacos
JVM_XMS=512m -e JVM_XMX=512m -e JVM_XMN=256m
如果你的内存足够大则不需要设置,使用默认即可
docker run --name nacos-standalone -p 8848:8848 -e MODE=standalone -e JVM_XMS=512m -e JVM_XMX=512m -e JVM_XMN=256m -d nacos/nacos-server:latest
访问Nacos
如果访问失败 可尝试重启系统!
http://你的docker ip:8848/nacos
账号:nacos
密码:nacos
持久化的 Mysql 中
简单使用不需要配置,在生产环境中需要配置
环境要求
- Mysql 5.7 以上
注意,mysql5.6版本会报错:Specified key was too long; max key length is 767 bytes,原因是mysql5.6最长的索引是767,要用Mysql5.7以上版本解决该问题。
步骤
https://github.com/alibaba/nacos/releases
目前 docker Nacos 版本为 2.3.0
-
下载 对应版本的 Nacos 获得配置文件中的
conf/nacos-mysql.sql
2.创建数据库nacos_config
并到导入nacos-mysql.sql
- 进入容器中修改配置文件
sudo docker ps -a
sudo docker exec -it 0d8 /bin/bash
vim conf/application.properties
修改以下内容
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://lzscxb.cn:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456
登录 Nacos 新建命名空间查看数据库是否成功!
Nacos 的使用
命名空间
可以隔离配置集,将某些配置集放到某一个命名空间之下。
命名空间我们一般用来区分 微服务
组
抛出一个问题: 你现在确实能够隔离微服务,但是不同的微服务的开发、测试、生产环境如何区别,
组可以用来区别区别开发、测试、生产环境
dataid - 配置集
一个配置集就是一个配置文件, 实际上可以更灵活
Python
def update_cfg(args):
print("配置发生了变化")
global config
config = json.dumps(args)
print(config)
NACOS = {
"host": "172.17.0.1",
"port": 8848,
"user": "nacos",
"password": "000",
"name_space": "7319546d-df6f-4366-b1cc-005c41f3e054", # 命名空间
"group": "dev",
"user_srv_data_id": "user-srv", # 数据集id
"db_data_id": "db",
}
nacos_client = nacos.NacosClient(f'{NACOS["host"]}:{NACOS["port"]}', namespace=NACOS["name_space"])
# nacos 返回的是字符串,需要使用json.loads加载
config = json.loads(nacos_client.get_config(NACOS["user_srv_data_id"], NACOS["group"]))
print(config)
# 监听配置文件修改 PS:如果是Window系统可能会出现错误,需要在 main方法中调用
nacos_client.add_config_watcher(NACOS["user_srv_data_id"], NACOS["group"], update_cfg)
Golang
// 从 Nacos 中获取配置信息
//create clientConfig
clientConfig := constant.ClientConfig{
NamespaceId: 命名空间ID,
TimeoutMs: 5000,
NotLoadCacheAtStart: true,
LogDir: "tmp/nacos/log",
CacheDir: "tmp/nacos/cache",
LogLevel: "debug",
}
// At least one ServerConfig
serverConfigs := []constant.ServerConfig{
{
IpAddr: global.NacosConfig.Host, // nacos服务地址
Port: global.NacosConfig.Port, // nacos服务端口
},
}
configClient, err := clients.CreateConfigClient(map[string]interface{}{
"serverConfigs": serverConfigs,
"clientConfig": clientConfig,
})
if err != nil {
panic(err)
}
content, err := configClient.GetConfig(vo.ConfigParam{
DataId: global.NacosConfig.UserApiDataId, // 数据集ID
Group: global.NacosConfig.Group, // 组
})
if err != nil {
zap.S().Fatalw("获取 Nacos 配置信息失败", err.Error())
}
// 解析获取到的Json文本
// &global.Config 为配置文件结构体
err = json.Unmarshal([]byte(content), &global.Config)
if err != nil {
zap.S().Fatalw("解析 Nacos 配置信息失败", err.Error())
}
// 监听配置文件
err = configClient.ListenConfig(vo.ConfigParam{
DataId: global.NacosConfig.UserApiDataId,
Group: global.NacosConfig.Group,
OnChange: func(namespace, group, dataId, data string) {
fmt.Println(global.Config.Services.UserSrvName)
err = json.Unmarshal([]byte(data), &global.Config)
if err != nil {
zap.S().Fatalw("文件发生变化,解析 Nacos 配置信息失败", err.Error())
}
fmt.Println(global.Config.Services.UserSrvName)
},
})
if err != nil {
zap.S().Fatalw("监听配置文件出现异常", err.Error())
}