Golang配置管理Viper的实现

 更新时间:2025年07月25日 09:30:23   作者:小许cod  
Viper是Go语言配置管理库,支持JSON/YAML/TOML等多格式,可动态监听配置变更,本文就来介绍一下Golang配置管理Viper的实现,感兴趣的可以了解一下

viper简介

Viper 是一个完整的 Go 应用程序配置解决方案,优势就在于开发项目中你不必去操心配置文件的格式而是让你腾出手来专注于项目的开发。其特性如下:

  • 支持 JSON/TOML/YAML/HCL/envfile/Java properties 等多种格式的配置文件
  • 可以设置监听配置文件的修改,修改时自动加载新的配置
  • 从环境变量、命令行选项和io.Reader,远程K/V中读取配置
  • 从远程配置系统中读取和监听修改,如 etcd/Consul
  • 代码逻辑中显示设置键值

总结起来就是支持多种类型,支持动态更新,而且非常便捷。毕竟大家都用的东西肯定是得到了大部分人的认可!

基本使用

使用流程可以概括为设置文件名(SetConfigName)、配置类型(SetConfigType )和搜索路径( AddConfigPath),然后读取配置(ReadInConfig)。
因为Viper没有默认配置,因为需要在初始化前告诉上面这些信息

viperConfig.SetConfigName("config")
viperConfig.SetConfigType("yaml")
viperConfig.AddConfigPath("/etc/appname/")  
err := viperConfig.ReadInConfig() 
if err != nil {
    panic(fmt.Errorf("Fatal error config file: %w \n", err))
}

从Viper中获取配置值得方式

如下有一个redis的yaml文件的配置

redis:
    user:admin                
    password: 123456          
    host: 127.0.0.1
    port: 6379               
    database: 0  

主要有以下方式获取配置的值,没有找到对应的值将返回对应类型的零值,比如 int返回0

Get(key string) : interface{}
GetBool(key string) : bool
GetFloat64(key string) : float64
GetInt(key string) : int
GetIntSlice(key string) : []int
GetString(key string) : string
GetStringMap(key string) : map[string]interface{}
GetStringMapString(key string) : map[string]string
GetStringSlice(key string) : []string
GetTime(key string) : time.Time
GetDuration(key string) : time.Duration
IsSet(key string) : bool
AllSettings() : map[string]interface{}

获取嵌套类型的user的值

GetString("redis.user")

如果你需要一次性加载所有文件到并解析到变量中,可以用viper.Unmarshal,将会以map[struct{}]的形式解析。或者只需要一部分配置时,比如解析到struct可以用UnmarshalKey,其实redis就是Key指的是对应的redis配置的父节点。

viper.Unmarshal(&ConfigSetting)
viper.UnmarshalKey("redis", &param.RedisConfig)

从IO/Reader中获取配置

自定义配置源

viper.SetConfigType("yaml") 

// 你的程序需要的任何配置,如下
var yamlDemo = []byte(`
name: zhangsan
age:18
`)

viper.ReadConfig(bytes.NewBuffer(yamlDemo))

viper.Get("name") //获取到的值是zhangsan

io.Reader读取配置,Viper.Set将设置并覆盖配置值

监听读取配置

运行时动态读取更新配置能力是非常方便的,如果不能动态更新配置,那么线上的服务要修改某个配置就不得不重启服务,Viper支持在程序运行时动态的监听配置。只需告诉viper实例watchConfig,前提是在基本使用部分一样设置文件名,类型等配置

viper.WatchConfig()
viper.OnConfigChange(func(e fsnotify.Event) {
  // 配置文件发生变更之后会调用的回调函数
    fmt.Println("Config file changed:", e.Name)
})

配置说明:WatchConfig()方法、OnConfigChange()方法。WatchConfig()方法用来开启事件监听,确定用户操作文件后该文件是否可正常读取,并将内容注入到viper实例的config字段

viper的动态监听配置时使用的fsnotify,fsnotify是用来监控目录及文件的第三方库; watcher, err := fsnotify.NewWatcher() 用来建立新的监视处理程序,它会开启一个协程开始等待读取事件,完成 从I / O完成端口读取任务,将事件注入到Event对象中,即Watcher.Events,具体大家可以看看源码。

读取远程配置

从Etcd中或Consul中读取配置,在Viper中启用远程支持需要导入viper/remote这个包,并且使用viper.AddRemoteProvider

import _ "github.com/spf13/viper/remote"

viper.AddSecureRemoteProvider("etcd",
        "https://127.0.0.1:2379",
        "conf.yaml",
        "key_path")
viper.SetConfigType("yaml")
err := viper.ReadRemoteConfig()
viper.Unmarshal(&remoteConfig)
if err != nil {
    panic(err)

总结

Viper基本的使用介绍就这些了, 虽然viper支持多配置同时使用,但是一个Viper实例只能寻一个配置路径。至于很多细节我们多去实践就很清楚啦

到此这篇关于Golang配置管理Viper的实现的文章就介绍到这了,更多相关Golang配置管理Viper内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言使用Swiss Table实现更快的map

    Go语言使用Swiss Table实现更快的map

    wiss Table 是一种高效的哈希表实现,最初由 Google 在 C++ 中引入,后来也被其他语言(如 Rust)采用,下面我们看看如何使用 Swiss Table 的思想来实现一个更快的 Go map
    2025-03-03
  • Golang中map的三种声明定义方式实现

    Golang中map的三种声明定义方式实现

    本文主要介绍了Golang中map的三种声明定义方式实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • 深入学习Golang并发编程必备利器之sync.Cond类型

    深入学习Golang并发编程必备利器之sync.Cond类型

    Go 语言的 sync 包提供了一系列同步原语,其中 sync.Cond 就是其中之一。本文将深入探讨 sync.Cond 的实现原理和使用方法,帮助大家更好地理解和应用 sync.Cond,需要的可以参考一下
    2023-05-05
  • golang结构体slice排序方式

    golang结构体slice排序方式

    go语言的slice()不仅可以对int类型的数组进行排序,还可以对struct类型的数组进行排序,排序函数包括Slice()、SliceStable()和SliceIsSorted(),结构体可以定义为更复杂的类型
    2025-12-12
  • Go语言范围Range的实现示例

    Go语言范围Range的实现示例

    range是Go语言中一个非常有用的功能,它可以帮助我们更方便地遍历各种类型的序列,通过本文的介绍,相信你已经对range有了一定的了解,感兴趣的可以了解一下
    2025-10-10
  • Go构建器模式构建复杂对象方法实例

    Go构建器模式构建复杂对象方法实例

    本文介绍了构建器模式,如何通过构建器对象构建复杂业务对象的方法实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Go调用链可视化工具使用实例探究

    Go调用链可视化工具使用实例探究

    本文介绍一款工具 go-callvis,它能够将 Go 代码的调用关系可视化出来,并提供了可交互式的 web 服务,在接手他人代码或调研一些开源项目时,如果能够理清其中的代码调用链路,这将加速我们对实现的理解
    2024-01-01
  • golang中为什么Response.Body需要被关闭详解

    golang中为什么Response.Body需要被关闭详解

    这篇文章主要给大家介绍了关于golang中为什么Response.Body需要被关闭的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-08-08
  • golang切片反序实例

    golang切片反序实例

    这篇文章主要介绍了golang切片反序实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • golang flag包的使用教程

    golang flag包的使用教程

    golang 的 flag 包是用于处理命令行参数的工具包,我们可以基于这个包来开发自定义的命令行工具,下面小编就来为大家介绍一下flag包的具体使用吧
    2023-09-09

最新评论