spf13/viper——Go应用程序的完整配置解决方案
一、viper的简单介绍
1.viper支持的功能:
1、可以设置默认值
2、可以加载多种格式的配置文件,如JSON,TOML,YAML,HCL和Java属性配置文件
3、应用程序运行过程中,保持监听和重新读取配置文件
4、可以从环境变量读取配置
5、可以从远程配置系统读取配置
6、可以读取命令行标志作为配置
7、可以从缓冲区中读取
8、设置显式的值
- 在GitHub中,作者是这样描述viper对于开发人员的作用:在构建现代化应用程序的过程中,开发人员可以通过使用viper而不必考虑配置文件的格式问题。
2.viper具体的帮助如下:
1、可以查找、加载和反序列化多种格式的配置文件,如JSON, TOML, YAML, HCL, Java属性配置格式。
2、提供一种为不同配置选项设置默认值的机制
3、提供一种通过命令行标志覆盖指定配置选项值的机制
4、提供了一种别名系统,可以在避免破坏现有代码的前提下,轻松地重命名参数
5、当用户提供的命令行或配置文件的配置选项与默认的配置选项相同时,可以很容易通过选项值结果看出优先级的差异。
3.viper提供的配置方式的优先级顺序如下(由高到低):
1.设置显示调用(explicit call to Set)
2.命令行标志(flag)
3.环境变量(env)
4.配置文件(config)
5.远程键/值存储(key/value store)
6.默认值(default)
##viper的简单使用
二、viper的简单使用
就我个人理解,应用程序的源代码里写的配置选项值的优先级应该低一些,如果太高会很不灵活(除非有些配置是涉及安全等方面,而钻牛角尖地说,这样的参数又不必穿上配置选项的马甲了~~)。所以我的理解和目前的使用范围,我认为比较常用的是flag
、env
、config
和default
,并且基本够用了。下面也仅仅涉及这四种配置选项方式。
当启动一个应用程序的时候,用户通过命令行标志可以实现最高优先级的配置。而用户有些懒,不想写flag,同样不想改配置文件,但是又想实现一些动态可变的配置适配,那么可以考虑到环境变量配置选项,比如本地ip等值,可以通过相关api获取并设置为环境变量,绑定到指定的配置项。有些用户比较迟钝,将配置文件放在了错误的目录下,误删了配置文件,或者干脆忘记了配置文件这回事,怎么办呢?有一些基本不会更改的配置选项会通过设置默认值在应用程序中配置好,那么没有找到配置文件的时候,给到一个日志提醒就足够了,并不会影响应用程序的正常启动。
啰嗦了这么多,还是放码过来吧!
package main
import (
flag "github.com/spf13/pflag"
"fmt"
"github.com/spf13/viper"
"reflect"
"os"
)
var ( // 命令行标志的定义
kafkaBrokers = flag.StringArray("kb", []string{
"192.168.0.0:9092","192.168.0.1:9092"}, "kafka brokers")
conf = flag.String("c", "doria.toml", "specify the configuration file, default is doria.toml")
num = flag.Int("n", 6,"specify the number")
)
func SetEnvFor() {
// 设置环境变量
os.Setenv("WINTER.NAME", "Bingham")
os.Setenv("KAFKA.BROKERS", "192.168.1.1:9092 192.168.1.2:9092")
os.Setenv("WINTER.AGE", "23")
}
func main