前言
在我们开发过程中,像数据库信息、邮件配置和其他的第三方服务密钥等这些固定的信息都会写在配置文件中,而配置文件又有多种表现形式和格式,有 JSON, TOML, YAML各种格式,而且测试环境,开发环境和生产环境用的配置文件也不是同一份,那就让我们说说Go 中用于加载配置信息的Viper。
什么是Viper?
Viper是Go应用程序的完整配置解决方案,包括12-Factor应用程序。它旨在在应用程序中工作,并可以处理所有类型的配置需求和格式。它支持:
- 设置默认值
- 从JSON,TOML,YAML,HCL和Java属性配置文件中读取
- 实时观看和重新读取配置文件(可选)
- 从环境变量中读取
- 从远程配置系统(etcd或Consul)读取,并观察变化
- 从命令行标志读取
- 从缓冲区读取
- 设置显式值
Viper可以被认为是所有应用程序配置需求的注册表。
为什么要使用Viper
在构建现代应用程序时,您不必担心配置文件格式; 你可以专注于构建出色的软件。 Viper 可以做如下工作:
- 加载并解析JSON、TOML、YAML、HCL 或 Java properties 格式的配置文件
- 可以为各种配置项设置默认值
- 可以在命令行中指定配置项来覆盖配置值
- 提供了别名系统,可以不破坏现有代码来实现参数重命名
- 可以很容易地分辨出用户提供的命令行参数或配置文件与默认相同的区别
Viper读取配置信息的优先级顺序,从高到低,如下:
- 显式调用Set函数
- 命令行参数
- 环境变量
- 配置文件
- key/value 存储系统
- 默认值
- Viper 的配置项的key不区分大小写。
如果使用Viper
使用 go get -u github.com/spf13/viper 进行安装
const (
// gRPC 服务地址
Address = "0.0.0.0:9090"
)
......
复制代码
像上面这种地址写死在代码里,我们可以把它放入配置文件中进行读取,安装完viper后,利用viper写toml格式的文件
func init(){
viper.SetConfigFile("hello.toml")//文件名
viper.Set("Address","0.0.0.0:9090")//统一把Key处理成小写 Address->address
err := viper.WriteConfig()//写入文件
if err != nil { // Handle errors reading the config file
panic(fmt.Errorf("Fatal error config file: %s \n", err))
}
}
复制代码
运行一下,会发现当前目录会出现一个hello.toml的文件✅
相对于写入配置文件的操作,读取配置文件在代码中反而会常见得多
viper.SetConfigFile("hello.toml")
err := viper.ReadInConfig() // 会查找和读取配置文件
if err != nil { // Handle errors reading the config file
panic(fmt.Errorf("Fatal error config file: %s \n", err))
}
Address = viper.GetString("Address")
//key取Address或者address都能取到值,反正viper转成小写处理
fmt.Println(Address)
复制代码
其他用法
设置默认值
viper.SetDefault("ContentDir", "content")
viper.SetDefault("LayoutDir", "layouts")
viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "categories"})
复制代码
监听配置变化
viper.WatchConfig()
viper.OnConfigChange(func(e fsnotify.Event) {
fmt.Println("配置发生变更:", e.Name)
})
复制代码
读取远程 Key/Value
启用该功能,需要导入 viper/remot 包:
import _ "github.com/spf13/viper/remote"
viper.AddRemoteProvider("etcd", "http://127.0.0.1:4001", "/config/hello.json")
viper.SetConfigType("json") // 因为不知道格式,所以需要指定
err := viper.ReadRemoteConfig()
复制代码
其他
以下是全部代码截图
总结
viper代码短小精悍,就三个文件,非常适合初学者阅读,如果有需要,以后会出源码阅读篇。
有疑问加站长微信联系(非本文作者)