在我们开发过程中,像数据库信息、邮件配置和其他的第三方服务密钥等这些固定的信息都会写在配置文件中,而配置文件又有多种表现形式和格式,有 JSON, TOML, YAML各种格式,而且测试环境,开发环境和生产环境用的配置文件也不是同一份,那就让我们说说Go 中用于加载配置信息的Viper。
Viper是Go应用程序的完整配置解决方案,包括12-Factor应用程序。它旨在在应用程序中工作,并可以处理所有类型的配置需求和格式。它支持:
Viper可以被认为是所有应用程序配置需求的注册表。
在构建现代应用程序时,您不必担心配置文件格式; 你可以专注于构建出色的软件。 Viper 可以做如下工作:
Viper读取配置信息的优先级顺序,从高到低,如下:
使用 go get -u github.com/spf13/viper 进行安装
const ( // gRPC 服务地址 Address = "0.0.0.0:9090" ) ...... 复制代码
像上面这种地址写死在代码里,我们可以把它放入配置文件中进行读取,安装完viper后,利用viper写toml格式的文件
func init(){ viper.SetConfigFile("hello.toml")//文件名 viper.Set("Address","0.0.0.0:9090")//统一把Key处理成小写 Address->address err := viper.WriteConfig()//写入文件 if err != nil { // Handle errors reading the config file panic(fmt.Errorf("Fatal error config file: %s /n", err)) } } 复制代码
运行一下,会发现当前目录会出现一个hello.toml的文件:white_check_mark:
相对于写入配置文件的操作,读取配置文件在代码中反而会常见得多
viper.SetConfigFile("hello.toml") err := viper.ReadInConfig() // 会查找和读取配置文件 if err != nil { // Handle errors reading the config file panic(fmt.Errorf("Fatal error config file: %s /n", err)) } Address = viper.GetString("Address") //key取Address或者address都能取到值,反正viper转成小写处理 fmt.Println(Address) 复制代码
viper.SetDefault("ContentDir", "content") viper.SetDefault("LayoutDir", "layouts") viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "categories"}) 复制代码
viper.WatchConfig() viper.OnConfigChange(func(e fsnotify.Event) { fmt.Println("配置发生变更:", e.Name) }) 复制代码
启用该功能,需要导入 viper/remot 包:
import _ "github.com/spf13/viper/remote"
viper.AddRemoteProvider("etcd", "http://127.0.0.1:4001", "/config/hello.json") viper.SetConfigType("json") // 因为不知道格式,所以需要指定 err := viper.ReadRemoteConfig() 复制代码