「这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战」。
简介
继续介绍一个spf13大佬的项目viper
用于读取配置文件的库
viper
官网: github.com/spf13/viper
官网声称可以读取所有类型的配置和格式,还具有热加载配置功能,非常强大
特点
支持的配置类型和格式:
- 支持读取JSON,TOML,YAML,HCL,envfile以及java properties配置文件
- 支持读取环境变量
- 支持读取远程组件的配置(etcd或者consul)
- 支持Go命令行参数(flags)
- 支持设置默认值和确定值
- 不区分配置大小写
配置格式优先顺序:
- explicit call to
Set
- flag
- env
- config
- key/value store
- default
使用
本文不会将所有配置类型和所有功能做演示,只演示自已常用的部分
安装
基于go model的方式安装
go get -u github.com/spf13/viper
复制代码
在代码中引入
import "github.com/spf13/viper"
复制代码
例子1(简单读取配置然后输出)
先写一份yaml的配置文件,取名为dev.yaml
serverPort: 8808
logLevel: "INFO"
mysql:
host: "127.0.0.1"
port: 3306
database: "viper"
user: "viper"
password: "viper33"
复制代码
编写demo,读取配置文件,然后打印出来
viper默认没有配置路径,类型和名称,需要自行定义
package main
import (
"fmt"
"github.com/spf13/viper"
)
func main() {
//定义配置文件名称
viper.SetConfigName("dev")
//定义配置文件类型
viper.SetConfigType("yaml")
//定义配置路径
viper.AddConfigPath(".")
err := viper.ReadInConfig()
if err != nil {
panic(fmt.Errorf("找不到配置文件,错误日志:: %w \n", err))
}
//读取值,并打印出来
fmt.Printf("serverPort: %v\n",viper.Get("serverPort"))
fmt.Printf("logLevel: %v\n",viper.Get("logLevel"))
fmt.Println("mysql info:",viper.Get("mysql.host"),
viper.Get("mysql.port"),viper.Get("mysql.database"),
viper.Get("mysql.user"),viper.Get("mysql.password"))
}
复制代码
效果如下
例子2(热加载和默认值)
配置文件还是以例子1为例
设置默认值调用SetDefault,填入k/v既可,不过默认值是优先级最低的。如果配置文件或环境变量有 相同key,默认值就会失效
这里的热加载需要注意点是,,在修改了配置后,一定要Ctrl+c保存,否则配置不会变化
package main
import (
"fmt"
"github.com/spf13/viper"
"time"
)
func main() {
//定义配置文件名称
viper.SetConfigName("dev")
//定义配置文件类型
viper.SetConfigType("yaml")
//定义配置路径
viper.AddConfigPath(".")
//定义默认值
viper.SetDefault("env","production")
err := viper.ReadInConfig()
if err != nil {
panic(fmt.Errorf("找不到配置文件,错误日志:: %w \n", err))
}
//监听配置文件变化,自动热加载
viper.WatchConfig()
//读取自定义的默认值
fmt.Printf("env: %v\n",viper.Get("env"))
//测试配置变化
fmt.Printf("logLevel: %v\n",viper.Get("logLevel"))
time.Sleep(8 * time.Second)
fmt.Printf("logLevel: %v\n",viper.Get("logLevel"))
}
复制代码
运行效果如下
远程配置
根据官网编写了读取远程etcd的demo,一直报错: panic: Remote Configurations Error: No Files Found,一直没有弄好
不过有位小哥的博客弄了另一套解决方案,传送门: blog.huoding.com/2020/08/10/…
nacos支持
另外还有大佬写了关于viper支持以nacos配置的库,非常不错哦 github.com/yoyofxteam/…