Go语言搬砖 viper配置文件库

·  阅读 883

「这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战」。

简介

继续介绍一个spf13大佬的项目viper用于读取配置文件的库

viper官网: github.com/spf13/viper

官网声称可以读取所有类型的配置和格式,还具有热加载配置功能,非常强大

特点

支持的配置类型和格式:

  • 支持读取JSON,TOML,YAML,HCL,envfile以及java properties配置文件
  • 支持读取环境变量
  • 支持读取远程组件的配置(etcd或者consul)
  • 支持Go命令行参数(flags)
  • 支持设置默认值和确定值
  • 不区分配置大小写

配置格式优先顺序:

  • explicit call to Set
  • flag
  • env
  • config
  • key/value store
  • default

使用

本文不会将所有配置类型和所有功能做演示,只演示自已常用的部分

安装

基于go model的方式安装

go get -u github.com/spf13/viper
复制代码

在代码中引入

import "github.com/spf13/viper"
复制代码

例子1(简单读取配置然后输出)

先写一份yaml的配置文件,取名为dev.yaml

serverPort: 8808
logLevel: "INFO"
mysql:
  host: "127.0.0.1"
  port: 3306
  database: "viper"
  user: "viper"
  password: "viper33"
复制代码

编写demo,读取配置文件,然后打印出来

viper默认没有配置路径,类型和名称,需要自行定义

package main

import (
   "fmt"
   "github.com/spf13/viper"
)

func main() {
   //定义配置文件名称
   viper.SetConfigName("dev")
   //定义配置文件类型
   viper.SetConfigType("yaml")
   //定义配置路径
   viper.AddConfigPath(".")
   err := viper.ReadInConfig()
   if err != nil {
      panic(fmt.Errorf("找不到配置文件,错误日志:: %w \n", err))
   }
   
   //读取值,并打印出来
   fmt.Printf("serverPort: %v\n",viper.Get("serverPort"))
   fmt.Printf("logLevel: %v\n",viper.Get("logLevel"))
   fmt.Println("mysql info:",viper.Get("mysql.host"),
      viper.Get("mysql.port"),viper.Get("mysql.database"),
      viper.Get("mysql.user"),viper.Get("mysql.password"))
}
复制代码

效果如下 image.png

例子2(热加载和默认值)

配置文件还是以例子1为例

设置默认值调用SetDefault,填入k/v既可,不过默认值是优先级最低的。如果配置文件或环境变量有 相同key,默认值就会失效

这里的热加载需要注意点是,,在修改了配置后,一定要Ctrl+c保存,否则配置不会变化

package main

import (
   "fmt"
   "github.com/spf13/viper"
   "time"
)

func main() {
   //定义配置文件名称
   viper.SetConfigName("dev")
   //定义配置文件类型
   viper.SetConfigType("yaml")
   //定义配置路径
   viper.AddConfigPath(".")
   //定义默认值
   viper.SetDefault("env","production")
   err := viper.ReadInConfig()
   if err != nil {
      panic(fmt.Errorf("找不到配置文件,错误日志:: %w \n", err))
   }

   //监听配置文件变化,自动热加载
   viper.WatchConfig()
   //读取自定义的默认值
   fmt.Printf("env: %v\n",viper.Get("env"))
   //测试配置变化
   fmt.Printf("logLevel: %v\n",viper.Get("logLevel"))
   time.Sleep(8 * time.Second)
   fmt.Printf("logLevel: %v\n",viper.Get("logLevel"))
}
复制代码

运行效果如下

image.png

远程配置

根据官网编写了读取远程etcd的demo,一直报错: panic: Remote Configurations Error: No Files Found,一直没有弄好

image.png

不过有位小哥的博客弄了另一套解决方案,传送门: blog.huoding.com/2020/08/10/…

nacos支持

另外还有大佬写了关于viper支持以nacos配置的库,非常不错哦 github.com/yoyofxteam/…

参考

github.com/spf13/viper

分类:
后端
标签:
分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改