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

发表于:2022-5-11 08:55

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Mrxuexi    来源:稀土掘金

  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),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号