拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 Golang项目的配置管理——Viper简易入门配置

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

白鹭 - 2022-01-26 1958 0 0

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

What is Viper?

Why 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显式设定的>命令列选项传入的>环境变量>组态档>默认值;

我的个人站:mrxuexi.com

头像

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *