今天给大家摆一哈我最近捣鼓的这个叫 Viper 的东西,搞配置管理简直不要太方便!
最开始接触
最开始嘛我是想搞个程序,能读取各种配置文件,啥 .yaml、.json、.toml,甚至还能从环境变量里头扒拉配置。搜一圈,发现好多人都推荐 Viper,说是 Go 语言里头处理配置的扛把子。我想,这么多人说那肯定有两把刷子,就决定试试水。
上手操作
先装上再说,直接在终端里头敲行命令: go get */spf13/viper
,等进度条走完,就算安装好。然后我就建个 * 文件,里头随便写点配置:
name: "我的程序"
port: 8080
在我的 Go 程序里头,我开始引入 Viper:
import (
"fmt"
"*/spf13/viper"
读取文件
然后,我开始琢磨咋个读取这个配置文件。Viper 提供几个方法,我先用最简单的 SetConfigName
和 AddConfigPath
:
func main() {
*("config") // 配置文件名,不需要带后缀
*(".") // 配置文件路径,这里我用的当前目录
//*("$HOME/.appname") // 配置文件路径,这里我用的当前目录
err := *() // 读取配置
if err != nil { // 处理错误
panic(*("Fatal error config file: %s \n", err))
运行一下,没报错,说明配置文件读进来。我再试着用 *("name")
获取配置项的值:
*(*("name"))
*(*("port"))
控制台输出 "我的程序" 和 8080,还真读出来!
多种格式支持
我寻思着,这玩意儿不会只支持 yaml ?我把配置文件名改成 *,内容也改成 JSON 格式:
"name": "我的程序",
"port": 8080
再运行,一样能读出来!看来 Viper 确实能自动识别配置文件格式。
环境变量
听说 Viper 还能从环境变量里读取配置,我设置个环境变量 APP_PORT=9090
,然后在程序里头加这么一句:
*("port", "APP_PORT") // 绑定环境变量
把读取配置文件那段注释掉,再运行,发现端口变成 9090!说明环境变量的优先级比配置文件高。
监听配置变化
Viper 还有一个很厉害的功能,就是能监听配置文件的变化,实时更新配置。我加这么一段代码:
*(func(e *) {
*("Config file changed:", *)
然后在程序运行的时候,我手动修改配置文件,控制台立马输出 "Config file changed: *",说明 Viper 确实监听到变化。
总结
这一通折腾下来,我对 Viper 算是有个初步的解。这玩意儿确实挺好使,读取配置方便,支持多种格式,还能从环境变量读取,甚至能监听配置文件变化。以后再也不用为配置管理头疼!