美文网首页
spf13/viper

spf13/viper

作者: JunChow520 | 来源:发表于2021-12-26 12:00 被阅读0次

参考资料

Viper(毒蛇,蝰蛇)是Golang应用程序开源配置解决方案,包括12-Factor应用程序。旨在应用程序中处理各种类型的配置需求和格式。Vipper又被认为是应用程序配置需求的"注册表"。

Viper配置解决方案

  • 可以设置监听配置文件的修改,修改时自动加载新的配置
  • 从环境变量、命令行选项和io.Reader中读取配置
  • 从远程配置系统中读取和监听修改,如 etcd/Consul
  • 代码逻辑中显示设置键值

安装Viper包

$ go get -u https://github.com/spf13/viper

实例化 viper.New

v := viper.New()

设置参数 SetConfigXxx

func (v *Viper) SetConfigName(in string) //设置配置文件名称
func (v *Viper) SetConfigFile(in string) //设置配置文件路径
func (v *Viper) SetConfigType(in string) //设置配置文件类型

例如:

v.SetConfigName(configName) 
v.SetConfigFile(configFile) 
v.SetConfigType(configType) 

读取配置 ReadInConfig

  • Viper只需要最少的配置,因为它知道在哪里读取配置文件。
  • Viper支持 JSON/TOML/YAML/HCL/envfile/Java properties 等多种格式的配置文件
  • Viper可以搜索多个路径,单个Viper实例仅支持单个配置文件。
  • Viper不会默认使用任何配置搜索路径,而是将默认值决定应用于...
func (v *Viper) ReadInConfig() error

例如:

//读取配置文件
err := v.ReadInConfig()
if err != nil {
    panic(fmt.Errorf("Fatal error config file: %s \n", err))
}

Viper读取配置顺序

顺序 类型 描述
1 explict call to Set 设置显式调用,读取viper.Set()设置的值。
2 flag 命令行标志,从命令行读取配置。
3 env 操作系统环境变量,从环境变量读取配置。
4 config 配置文件,监控配置文件改动并热加载。
5 key/value store 远程键值存储,从远程配置中心读取配置并监控变动。
6 default 默认值,直接设置配置项值。
// 获取配置文件路径
func getConfigFile(path ...string) string {
    //从入参获取
    if len(path) > 0 {
        return path[0]
    }
    //命令行标记
    var p string
    flag.StringVar(&p, "c", "", "choose config file.")
    flag.Parse()
    if p != "" {
        return p
    }
    //操作系统环境变量
    p = os.Getenv("CONFIG_HOME")
    if p != "" {
        return p
    }
    //默认值
    return "config.yaml"
}

监控配置 WatchConfig

  • Viper支持在运行时让应用程序实时读取配置文件,无需重启服务器使配置生效。
func (v *Viper) WatchConfig()
func (v *Viper) OnConfigChange(run func(in fsnotify.Event))

例如:

//监控配置并获取最新配置
v.WatchConfig()

//配置文件修改时触发并解析
v.OnConfigChange(func(e fsnotify.Event) {
    fmt.Println("config file changed:", e.Name)
    if err := v.Unmarshal(&config.Cfg); err != nil {
        fmt.Println(err)
    }
})

例如:读取YAML配置并实时监听改动

// 解析配置文件
func Viper(path ...string) *viper.Viper {
    //获取配置文件路径
    configFile := getConfigFile()
    fmt.Printf("Vipper Config File is %v\n", configFile)

    //实例化
    v := viper.New()
    v.SetConfigFile(configFile)        //设置配置文件路径
    v.SetConfigType(config.ConfigType) //设置配置文件类型

    //读取配置文件
    err := v.ReadInConfig()
    if err != nil {
        panic(fmt.Errorf("Fatal error config file: %s \n", err))
    }

    //监控配置并获取最新配置
    v.WatchConfig()
    //配置文件修改时触发并解析
    v.OnConfigChange(func(e fsnotify.Event) {
        fmt.Println("config file changed:", e.Name)
        if err := v.Unmarshal(&config.Cfg); err != nil {
            fmt.Println(err)
        }
    })

    //解析全局配置
    if err := v.Unmarshal(&config.Cfg); err != nil {
        fmt.Println(err)
    }

    return v
}

相关文章

网友评论

      本文标题:spf13/viper

      本文链接:https://www.haomeiwen.com/subject/hkdqbltx.html