Golang项目的配置管理——Viper简易入门配置

测试管理 创建于:2022-05-11
 
 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

免责声明:本文来源于互联网,版权归合法拥有者所有,如有侵权请公众号联系管理员

* 本站提供的一些文章、资料是供学习研究之用,如用于商业用途,请购买正版。

发表于:2022-5-11 08:55 作者:Mrxuexi 来源:稀土掘金