Golang项目的配置管理——Viper简易入门配置
What is Viper? From:github.com/spf13/viper Viper is a complete configuration solution for Go applications including 12-Factor apps. (VIPER是实现遵循12-Factor的GO应用程序的完整配置解决方案) 它支持:
·支持 JSON/TOML/YAML/HCL/envfile/Java properties 等多种格式的配置文件
· 实时监控及重载配置文件(可选)
· 从环境变量、命令行标记、缓存中读取配置;
· 从远程配置系统中读取和监听修改,如 etcd/Consul;
· 显式设置键值。
Why Viper? When building a modern application, you don’t want to worry about configuration file formats; you want to focus on building awesome software. Viper is here to help with that. (构建现代应用程序时,你不想去过多关注配置文件的格式,你想专注于建立更棒的软件,Viper可以帮助你)
Install go get github.com/spf13/viper
Example 初始化: package settings import ( "fmt" "github.com/fsnotify/fsnotify" "github.com/spf13/viper" ) //初始化一个viper配置 func Init() (err error) {
//制定配置文件的路径
viper.SetConfigFile("conf/config.yaml") // 读取配置信息
err = viper.ReadInConfig()
if err != nil {
// 读取配置信息失败
fmt.Printf("viper.ReadInConfig()failed,err:%v\n", err)
return
}
//监听修改
viper.WatchConfig()
//为配置修改增加一个回调函数
viper.OnConfigChange(func(in fsnotify.Event) {
fmt.Println("配置文件修改了...")
})
return }
配置文件示例(yaml): mysql: host: "127.0.0.1" port: 3306 user: "root" password: "123456" dbname: "web_app" max_open_conns: 200 max_idle_conns: 50 redis: host: "127.0.0.1" port: 6379 db: 0 password: "" pool_size: 100
取配置: package mysql //省略package func Init() (err error) {
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True",
viper.GetString("mysql.user"),
viper.GetString("mysql.password"),
viper.GetString("mysql.host"),
viper.GetInt("mysql.port"),
viper.GetString("mysql.dbname"),
)
db, err = sqlx.Connect("mysql", dsn)
db.SetMaxOpenConns(viper.GetInt("mysql.max_open_conns"))
db.SetMaxIdleConns(viper.GetInt("mysql.max_idle_conns"))
return } // @version 1.0
程序内显示声明配置: 如果某个键通过viper.Set设置了值,那么这个值的优先级最高。如: viper.Set("redis.port", 9000)
此时redis的接口就不是配置文件中设置的6379,而是后面配置的9000。
命令行选项: func init() { pflag.Int("redis.port", 9001, "Redis port to connect") // 绑定命令行 viper.BindPFlags(pflag.CommandLine) }
代码运行时传入参数:$ ./main.exe --redis.port 9001 此时程序配置的redis端口为:9001。 如果我们不传入参数直接执行$ ./main.exe 此时程序配置的redis端口为配置文件中的6379(没有在程序中显示声明配置时viper.Set("redis.port", 9000))。
环境变量: func init() { // 绑定环境变量 viper.AutomaticEnv() }
在没有于前面的方法中取得配置的情况下,则会绑定环境变量。 也可以指定绑定对应的环境变量: func init() { // 绑定环境变量 viper.BindEnv("redis.port") viper.BindEnv("go.path", "GOPATH") }
BindEnv()如果只传入一个参数,则这个参数既表示键名,又表示环境变量名。如果传入两个参数,则第一个参数表示键名,第二个参数表示环境变量名。 也可以通过viper.SetEnvPrefix()设置环境变量前缀,设置后前面的方法会为传入的值加上变量后再去查找环境变量。 · 默认值可以调用viper.SetDefault设置。
总结优先级: 调用Set显式设置的>命令行选项传入的>环境变量>配置文件>默认值;
总结 初始化: 1. 设置配置文件路径viper.SetConfigFile() 2. 读取配置viper.ReadInConfig() 3. 监听修改viper.WatchConfig() 4. 设置修改后回调viper.OnConfigChange(func())
调用: 取配置viper.Get*()
设置优先级: 声明调用Set显式设置的>命令行选项传入的>环境变量>配置文件>默认值。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
权威发布,测试选择不纠结!第15届软件测试行业报告,直击行业发展,把握未来方向!
原文地址:http://www.51testing.com/?action-viewnews-itemid-6637652
免责声明:本文来源于互联网,版权归合法拥有者所有,如有侵权请公众号联系管理员
* 本站提供的一些文章、资料是供学习研究之用,如用于商业用途,请购买正版。