经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
Golang项目的配置管理——Viper简易入门配置
来源:cnblogs  作者:学习先生  时间:2021/12/31 9:00:17  对本文有异议

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

What is Viper?

From:https://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

  1. go get github.com/spf13/viper

Example

初始化:

  1. package settings
  2. import (
  3. "fmt"
  4. "github.com/fsnotify/fsnotify"
  5. "github.com/spf13/viper"
  6. )
  7. //初始化一个viper配置
  8. func Init() (err error) {
  9. //制定配置文件的路径
  10. viper.SetConfigFile("conf/config.yaml")
  11. // 读取配置信息
  12. err = viper.ReadInConfig()
  13. if err != nil {
  14. // 读取配置信息失败
  15. fmt.Printf("viper.ReadInConfig()failed,err:%v\n", err)
  16. return
  17. }
  18. //监听修改
  19. viper.WatchConfig()
  20. //为配置修改增加一个回调函数
  21. viper.OnConfigChange(func(in fsnotify.Event) {
  22. fmt.Println("配置文件修改了...")
  23. })
  24. return
  25. }

配置文件示例(yaml):

  1. mysql:
  2. host: "127.0.0.1"
  3. port: 3306
  4. user: "root"
  5. password: "123456"
  6. dbname: "web_app"
  7. max_open_conns: 200
  8. max_idle_conns: 50
  9. redis:
  10. host: "127.0.0.1"
  11. port: 6379
  12. db: 0
  13. password: ""
  14. pool_size: 100

取配置:

  1. package mysql
  2. //省略package
  3. func Init() (err error) {
  4. dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True",
  5. viper.GetString("mysql.user"),
  6. viper.GetString("mysql.password"),
  7. viper.GetString("mysql.host"),
  8. viper.GetInt("mysql.port"),
  9. viper.GetString("mysql.dbname"),
  10. )
  11. db, err = sqlx.Connect("mysql", dsn)
  12. db.SetMaxOpenConns(viper.GetInt("mysql.max_open_conns"))
  13. db.SetMaxIdleConns(viper.GetInt("mysql.max_idle_conns"))
  14. return
  15. }
  16. // @version 1.0

程序内显示声明配置:

如果某个键通过viper.Set设置了值,那么这个值的优先级最高。如:

  1. viper.Set("redis.port", 9000)

此时redis的接口就不是配置文件中设置的6379,而是后面配置的9000

命令行选项:

  1. func init() {
  2. pflag.Int("redis.port", 9001, "Redis port to connect")
  3. // 绑定命令行
  4. viper.BindPFlags(pflag.CommandLine)
  5. }

代码运行时传入参数:$ ./main.exe --redis.port 9001

此时程序配置的redis端口为:9001。

如果我们不传入参数直接执行$ ./main.exe

此时程序配置的redis端口为配置文件中的6379(没有在程序中显示声明配置时viper.Set("redis.port", 9000))。

环境变量:

  1. func init() {
  2. // 绑定环境变量
  3. viper.AutomaticEnv()
  4. }

在没有于前面的方法中取得配置的情况下,则会绑定环境变量。

也可以指定绑定对应的环境变量:

  1. func init() {
  2. // 绑定环境变量
  3. viper.BindEnv("redis.port")
  4. viper.BindEnv("go.path", "GOPATH")
  5. }

BindEnv()如果只传入一个参数,则这个参数既表示键名,又表示环境变量名。如果传入两个参数,则第一个参数表示键名,第二个参数表示环境变量名。

也可以通过viper.SetEnvPrefix()设置环境变量前缀,设置后前面的方法会为传入的值加上变量后再去查找环境变量。

  • 默认值可以调用viper.SetDefault设置。

总结优先级:

调用Set显式设置的>命令行选项传入的>环境变量>配置文件>默认值;

总结

初始化:

  1. 设置配置文件路径viper.SetConfigFile()
  2. 读取配置viper.ReadInConfig()
  3. 监听修改viper.WatchConfig()
  4. 设置修改后回调viper.OnConfigChange(func())

调用:

? 取配置viper.Get*()

设置优先级:

声明调用Set显式设置的>命令行选项传入的>环境变量>配置文件>默认值;

我的个人站:mrxuexi.com

头像

原文链接:http://www.cnblogs.com/Mrxuexi/p/15750455.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号