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),我们将立即处理