Golang配置管理Viper的实现

Written by

in

文章目录
  • 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)) }
  • 如下有一个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)
  • Viper基本的使用介绍就这些了, 虽然viper支持多配置同时使用,但是一个Viper实例只能寻一个配置路径。至于很多细节我们多去实践就很清楚啦 到此这篇关于Golang配置管理Viper的实现的文章就介绍到这了,更多相关Golang配置管理Viper内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: golang使用viper解析配置文件的示例代码 Golang工具库viper的使用教程 浅谈Golang如何使用Viper进行配置管理 golang下的viper包的简单使用方式 GoLang实现Viper库的封装流程详解 Golang配置管理库 Viper的教程详解 Golang配置解析神器go viper使用详解 golang配置管理神器Viper使用教程 聊聊Golang中很好用的viper配置模块 golang 使用 viper 读取自定义配置文件
  • 目录
    • viper简介
    • 基本使用
    • 从Viper中获取配置值得方式
    • 从IO/Reader中获取配置
      • 自定义配置源
      • 监听读取配置
      • 读取远程配置
    • 总结

      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))
      }
      

      如下有一个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)
      

      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内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

      您可能感兴趣的文章:

      • golang使用viper解析配置文件的示例代码
      • Golang工具库viper的使用教程
      • 浅谈Golang如何使用Viper进行配置管理
      • golang下的viper包的简单使用方式
      • GoLang实现Viper库的封装流程详解
      • Golang配置管理库 Viper的教程详解
      • Golang配置解析神器go viper使用详解
      • golang配置管理神器Viper使用教程
      • 聊聊Golang中很好用的viper配置模块
      • golang 使用 viper 读取自定义配置文件

      站内搜索