什么是Viper

Viper是一个方便Go语言应用程序处理配置信息的库。它可以处理多种格式的配置。它支持的特性:

  • 设置默认值
  • 从JSON、TOML、YAML、HCL和Java properties文件中读取配置数据
  • 可以监视配置文件的变动、重新读取配置文件
  • 从环境变量中读取配置数据
  • 从远端配置系统中读取数据,并监视它们(比如etcd、Consul)
  • 从命令参数中读物配置
  • 从buffer中读取
  • 调用函数设置配置信息

为什么要使用Viper

在构建现代应用程序时,您不必担心配置文件格式; 你可以专注于构建出色的软件。

Viper 可以做如下工作:

  • 加载并解析JSON、TOML、YAML、HCL 或 Java properties 格式的配置文件
  • 可以为各种配置项设置默认值
  • 可以在命令行中指定配置项来覆盖配置值
  • 提供了别名系统,可以不破坏现有代码来实现参数重命名
  • 可以很容易地分辨出用户提供的命令行参数或配置文件与默认相同的区别

Viper读取配置信息的优先级顺序,从高到低,如下:

  • 显式调用Set函数
  • 命令行参数
  • 环境变量
  • 配置文件
  • key/value 存储系统
  • 默认值

Viper 的配置项的key不区分大小写。

项目地址:https://github.com/spf13/viper

使用

设置默认值

默认值不是必须的,如果配置文件、环境变量、远程配置系统、命令行参数、Set函数都没有指定时,默认值将起作用。

  1. viper.SetDefault("name", "xiaoming")
  2. viper.SetDefault("age", "12")
  3. viper.SetDefault("notifyList", []string{"xiaohong","xiaoli","xiaowang"})
读取配置文件

Viper支持JSON、TOML、YAML、HCL和Java properties文件。

Viper可以搜索多个路径,但目前单个Viper实例仅支持单个配置文件

Viper默认不搜索任何路径。

以下是如何使用Viper搜索和读取配置文件的示例。

路径不是必需的,但最好至少应提供一个路径,以便找到一个配置文件。

  1. viper.SetConfigName("dbConfig") // 设置配置文件名 (不带后缀)
  2. viper.AddConfigPath("/workspace/appName/") // 第一个搜索路径
  3. viper.AddConfigPath("/workspace/appName1") // 可以多次调用添加路径
  4. viper.AddConfigPath(".") // 比如添加当前目录
  5. err := viper.ReadInConfig() // 搜索路径,并读取配置数据
  6. if err != nil {
  7. panic(fmt.Errorf("Fatal error config file: %s \n", err))
  8. }
监视配置文件,重新读取配置数据

Viper支持让你的应用程序在运行时拥有读取配置文件的能力。

只需要调用viper实例的WatchConfig函数,你也可以指定一个回调函数来获得变动的通知。

  1. viper.WatchConfig()
  2. viper.OnConfigChange(func(e fsnotify.Event) {
  3. fmt.Println("Config file changed:", e.Name)
  4. })
从 io.Reader 中读取配置

Viper预先定义了许多配置源,例如文件、环境变量、命令行参数和远程K / V存储系统。也可以实现自己的配置源,并提供给viper。

现在有如下yaml文件:


  1. userName: "xiaoming"
  2. address: "广州市XXX"
  3. sex: 1
  4. company:
  5. name: "xxx"
  6. employeeId: 1000
  7. department:
  8. - "技术部"

读取文件的代码如下:

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/spf13/viper"
  5. )
  6. type UserInfo struct {
  7. UserName string
  8. Address string
  9. Sex byte
  10. Company Company
  11. }
  12. type Company struct {
  13. Name string
  14. EmployeeId int
  15. Department []interface{}
  16. }
  17. func main() {
  18. //读取yaml文件
  19. v := viper.New()
  20. //设置读取的配置文件名
  21. v.SetConfigName("userInfo")
  22. //windows环境下为%GOPATH,linux环境下为$GOPATH
  23. v.AddConfigPath("/Users/yangyue/workspace/go/src/webDemo/")
  24. //设置配置文件类型
  25. v.SetConfigType("yaml")
  26. if err := v.ReadInConfig();err != nil {
  27. fmt.Printf("err:%s\n",err)
  28. }
  29. fmt.Printf("userName:%s sex:%s company.name:%s \n", v.Get("userName"), v.Get("sex"), v.Get("company.name"))
  30. //也可以直接反序列化为Struct
  31. var userInfo UserInfo
  32. if err := v.Unmarshal(&userInfo) ; err != nil{
  33. fmt.Printf("err:%s",err)
  34. }
  35. fmt.Println(userInfo)
  36. }

上面的代码使用两种方式获取配置文件:第一种直接解析为key,value;第二种你可以手动的反序列化为Struct。

从命令行参数中读取
  1. package main
  2. import (
  3. "fmt"
  4. "github.com/spf13/pflag"
  5. "github.com/spf13/viper"
  6. )
  7. func main() {
  8. pflag.String("ip", "127.0.0.1", "Server running address")
  9. pflag.Int64("port", 8080, "Server running port")
  10. pflag.Parse()
  11. viper.BindPFlags(pflag.CommandLine)
  12. fmt.Printf("ip :%s , port:%s", viper.GetString("ip"), viper.GetString("port"))
  13. }

命令行执行上面程序:

  1. # go run test.go --ip=192.168.7.3 --port=3306

可以看到输出的是我们自定义的参数。

读取环境变量参数

一般获取环境变量使用os包,比如:

  1. getenv := os.Getenv("JAVA_HOME")
  2. fmt.Print(getenv)

Viper也提供了一种方式:

  1. //表示 先预加载匹配的环境变量
  2. viper.AutomaticEnv()
  3. //读取已经加载到default中的环境变量
  4. if env := viper.Get("JAVA_HOME"); env == nil {
  5. println("error!")
  6. } else {
  7. fmt.Printf("%#v\n", env)
  8. }

由获取环境变量我们是不是可以想到多环境参数配置呢?针对线上环境,开发环境分别加载不同yml中的参数。

  1. func initConfig() (err error) {
  2. env := os.Getenv("GO_ENV")
  3. viper.SetConfigName(env)
  4. viper.AddConfigPath("./configs")
  5. viper.SetConfigType("yml")
  6. err = viper.ReadInConfig()
  7. return
  8. }

因为无论是线上环境还是测试环境,肯定有一些参数是公共不变的,那么这一部分参数是否可以抽出来作为一个单独的配置文件呢。所以这样配置文件可以分为两个部分:

  1. "github.com/gobuffalo/packr"
  2. func initConfig() (err error) {
  3. box := packr.NewBox("./configs")
  4. configType := "yml"
  5. defaultConfig, _ := box.Find("default.yml")
  6. v := viper.New()
  7. v.SetConfigType(configType)
  8. err = v.ReadConfig(bytes.NewReader(defaultConfig))
  9. if err != nil {
  10. return
  11. }
  12. configs := v.AllSettings()
  13. // 将default中的配置全部以默认配置写入
  14. for k, v := range configs {
  15. viper.SetDefault(k, v)
  16. }
  17. env := os.Getenv("GO_ENV")
  18. // 根据配置的env读取相应的配置信息
  19. if env != "" {
  20. envConfig, _ := box.Find(env + ".yml")
  21. viper.SetConfigType(configType)
  22. err = viper.ReadConfig(bytes.NewReader(envConfig))
  23. if err != nil {
  24. return
  25. }
  26. }
  27. return
  28. }

首先读取default.yml中的参数,将其写入default中。然后再根据环境变量读取不同环境中的参数。

这里使用了packr包,packr包的作用在于将静态资源打包至应用程序中。

Viper-Go一站式配置管理工具的更多相关文章

  1. Sql server 2008 R2 配置管理工具服务显示远程过程调用失败:0x800706be

    Sql server 2008 R2 配置管理工具服务显示远程过程调用失败:0x800706be   今天在其他电脑配置 SQl server 2008 R2,安装完成后,发现打开配置管理工具服务 : ...

  2. SQL 2008配置管理工具服务显示 远程过程调用失败0x800706be

    摘自: http://www.cnblogs.com/cool-fire/archive/2012/09/15/2686131.html 基本上我的解决方案也是根据该文提示 操作的. 因为 我后来 装 ...

  3. SQO2008配置管理工具服务显示远程过程调用失败

    前两天,装了VS2012后,打开SQL2008配置管理工具,发现SQL服务名称里什么也没有,只有一个提示:(如图) 卸载了一个叫"Microsoft SQL Server 2012Local ...

  4. Ansible@一个高效的配置管理工具--Ansible configure management--翻译(一)

    未经书面许可,请勿转载 ---      Ansible is the simplest way to automate apps and IT infrastructure 这是Ansible官方站 ...

  5. 关于SQL配置管理工具无法打开0x8004100e问题!

    今天犯了个很“2”得问题,因为在远程数据库可以访问,并且也在安装程序中有看到装有SQLserver Mamngement Studio及其它程序,所以想在本地使用数据库应该可以但没想却总是报SQL配置 ...

  6. SQL2008配置管理工具服务显示远程过程调用失败

    问题: 打开SQL2008配置管理工具,发现SQL服务名称里什么也没有,只有一个提示:   解决办法: 这是由于电脑中安装有Visual Stuido, 它内含一个本地SQL数据库服务:Microso ...

  7. sql server 2008 R2 配置管理工具打不开

    使用 sql server 配置管理工具是报如下错误: 解决方法:   1 找出 sqlmgmproviderxpsp2up.mof 这个文件的位置   2 以管理员身份运行 mofcomp &quo ...

  8. sql server2008配置管理工具服务显示远程过程调用失败

    SQL SERVER2008配置管理工具服务显示远程过程调用失败   前两天,装了VS2012后,打开SQL2008配置管理工具,发现SQL服务名称里什么也没有,只有一个提示:(如图) 上网搜了,试了 ...

  9. Kapitan 通用terraform&& kubernetes 配置管理工具

    Kapitan 是一个通用的配置管理工具,可以帮助我们管理terraform .kubernetes 以及其他的配置. Kapitan 自生基于jsonnet 开发,对于我们日常进行软件的部署(tf以 ...

随机推荐

  1. .Net高级编程-自定义错误页 web.config中<customErrors>节点配置

    错误页 1.当页面发生错误的时候,ASP.Net会将错误信息展示出来(Sqlconnection的错误就能暴露连接字符串),这样一来不好看,二来泄露网站的内部实现信息,给网站带来安全隐患,因此需要定制 ...

  2. scala刷LeetCode--26 删除排序数组中的重复项

    一.题目描述 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完 ...

  3. 最近学习了HBase

    HBase是什么 最近学习了HBase,正常来说写这篇文章,应该从DB有什么缺点,HBase如何弥补DB的缺点开始讲会更有体感,但是本文这些暂时不讲,只讲HBase,把HBase相关原理和使用讲清楚, ...

  4. 免费rar/zip解压缩工具BandZip

    今天为大家推荐一款解压缩类软件--BandZip bandzip是我认为的最好用的解压缩软件,速度快没广告 能够秒杀其他的压缩类软件 下载地址 bandzip点我 1 BandZip简介 BandZi ...

  5. .Net Core 学习新建Core MVC 项目

    一.新建空的Core web项目 二.在Startup文件中添加如下配置 1.  在ConfigureServices 方法中添加 services.AddMvc();MVC服务 2. app.Use ...

  6. 基于webpack4+vue-cli3项目的换肤功能

    起因 最近因公司需求,需要实现主题换肤功能,不仅仅是颜色的更改,还需要包括图片,字体等文件等更换,因此在百度里各种实现方案后,决定根据scss+style-loader/useable做换肤. 项目开 ...

  7. android_aidl

    好久未更新博客了.人都是这样,刚开始对某一样东东冲劲十足,时间一长,很难坚持下去了,我这博客也是.所以我要打破成规,继续更新. 本次博客谈谈adil的用法.aidl的全称叫什么来着忘了,不过不要紧,重 ...

  8. ServiceFabric极简文档-3. 发布脚本

    web: Trap { Write-Host $_.Exception.Message; Continue }; Connect-ServiceFabricCluster Remove-Service ...

  9. excel报表开发-- 根据datatable个数自动生成新sheet

    总结一下很久之前做的报表小程序,今日有问题又调试了一下. DB中存在一个表,记录了ID<自增长>,SqlStatement<sql查询语句>及其他必要字段,比如SheetNam ...

  10. 使用ML-Agents Toolkit(0.5)训练游戏ai之环境搭建

    ML-Agents toolkit目前已经更新到0.5版本了. 要想使用这个Unity插件训练人工智能需要如下软件 1.Anaconda指的是一个开源的Python发行版本,主要是让你的训练环境与其它 ...