Go语言搬砖 viper配置文件库

「这是我参与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的方式安装

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

在代码中引入

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

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

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

1
2
3
4
5
6
7
8
yaml复制代码serverPort: 8808
logLevel: "INFO"
mysql:
host: "127.0.0.1"
port: 3306
database: "viper"
user: "viper"
password: "viper33"

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
go复制代码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保存,否则配置不会变化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
js复制代码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

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%