nacos做配置中心
demo仓库
- docker安装nacos
docker pull nacos/nacos-server
使用docker每次需要sudo可以执行如下命令
sudo groupadd docker #添加用户组
sudo gpasswd -a username docker #将当前用户添加至用户组-d就是删除该组中的用户
newgrp docker #更新用户组
- docker运行nacos
docker run --env MODE=standalone --name nacos -d -p 8848:8848 nacos/nacos-server
- 访问nacos
http://127.0.0.1:8848/nacos/index.html
- 创建配置
- 新建namespace
这个namespace是命令空间做分类使用的,可以理解为一个项目环境如dev
,prod
等,一个项目下可以有多个配置文件。
- 新建配置
配置内容如下:
kitex:service: "application"address: ":8889"log_level: infolog_file_name: "log/kitex.log"log_max_size: 10log_max_age: 3log_max_backups: 50registry:registry_address:- 127.0.0.1:2379username: ""password: ""mysql:dsn: "root:root@tcp(192.168.5.118:3306)/food?charset=utf8mb4&parseTime=True&loc=Local"redis:address: "127.0.0.1:6379"username: ""password: ""db: 0
- 远程获取naocs配置
func main() {// 至少一个ServerConfigserverConfigs := []constant.ServerConfig{{IpAddr: "localhost",Port: 8848,Scheme: "http",ContextPath: "/nacos",},}// 创建clientConfigclientConfig := constant.ClientConfig{NamespaceId: "public", // 如果需要支持多namespace,我们可以场景多个client,它们有不同的NamespaceId。当namespace是public时,此处填空字符串。TimeoutMs: 5000,NotLoadCacheAtStart: true,LogDir: "/tmp/nacos/xlog",CacheDir: "/tmp/nacos/cache", // 不加/ 开头的路径默认在更目录下下LogLevel: "debug",Username: "",Password: "",}// 创建动态配置客户端的另一种方式 (推荐)configClient, err := clients.NewConfigClient(vo.NacosClientParam{ClientConfig: &clientConfig,ServerConfigs: serverConfigs,},)if err != nil {panic(err)}// 获取配置信息content, err := configClient.GetConfig(vo.ConfigParam{DataId: "mysql",Group: "dev_food_platform",})if err != nil {fmt.Println("GetConfig err: ", err)return}var conf RpcConfigerr = yaml.Unmarshal([]byte(content), &conf)if err != nil {fmt.Println("yaml err: ", err)return}fmt.Printf("conf: %+v", conf)return
}
解析变量:
type RpcConfig struct {Env string `yaml:"env"`Kitex KitexLogConfig `yaml:"kitex"`Registry RegistryConfig `yaml:"registry"`MySQL MySQLConfig `yaml:"mysql"`Redis RedisConfig `yaml:"redis"`
}type KitexLogConfig struct {Service string `yaml:"service"`Address string `yaml:"address"`LogLevel string `yaml:"log_level"`LogFileName string `yaml:"log_file_name"`LogMaxSize int `yaml:"log_max_size"`LogMaxAge int `yaml:"log_max_age"`LogMaxBackups int `yaml:"log_max_backups"`
}type RegistryConfig struct {RegistryAddress []string `yaml:"registry_address"`Username string `yaml:"username"`Password string `yaml:"password"`
}type MySQLConfig struct {DSN string `yaml:"dsn"`
}type RedisConfig struct {Address string `yaml:"address"`Username string `yaml:"username"`Password string `yaml:"password"`DB int `yaml:"db"`
}
nacos提供的方法远程读取的配置文件内容是字节,需要使用yaml.Unmarshal将字节转换为结构体。在go结构体的tag:yml
的字段必须与远程配置一致。
项目demo
nacos配置
在上面一节已经可以通过代码获取nacos的配置了,但是还是存在缺陷,nacos客户端自己的配置,还是在代码中。
对于一部分隐私数据例如用户名名和密码可以配置在环境变量中,go也提供非常方便的环境变量获取方式 os.Getenv("GOPATH")
。
但是如果端口
,scheme
,ip
,groupid
,dataid
等都存在环境变量中有点不优雅。那么就还是需要配置文件。
所以还是需要本地配置文件,配置文件时不随打包的,一旦配置文件在开发时读取的路径定了,运维时配置文件也要按照相同的目录结构存放配置文件。