酷Go推荐 Go 程序配置利器-viper 库

wentao · 2021年04月09日 · 804 次阅读
本帖已被设为精华帖!

Go 程序配置利器-viper 库

推荐理由

日常开发中,程序配置项会包含多种源,如:配置文件,系统环境变量、分布式 config 服务等等,常规方式是每种配置源写一套逻辑,虽然开发量不大,但总要花精力去维护后续的变更。Viper 库恰好能解决这类痛点,同时还支持多种配置文件格式,以及热加载能力,所以程序配置管理场景可以尝试用 Viper 库。

功能介绍

Viper 具体功能特性如下:

  • 设置配置项默认值
  • 支持显式设置配置项
  • 支持读取 JSON、TOML、YAML、HCL、envfile 和 Java properties 等配置格式
  • 支持读取环境变量
  • 支持读取 etcd、Consul 等分布式配置服务
  • 支持读取命令行参数
  • 支持读取内存
  • 配置热加载

使用指南

Viper 使用起来也是比较简单的,主要的代码流程大致如下:

  1. 初始化 viper,可以使用单个 viper 实例,也可以多个 viper 实例

  2. 针对不同的配置源设置相对应的参数,如:配置文件路径,文件类型,ectd/consul 服务器访问地址和 key 等

  3. 读取配置项,可以直接使用 viper.GetXXX() 方法获取某个具体配置项,也可以将所有或部分配置项反序列化为 struct 或 map

以读取配置文件为例,配置文件内容:

Hacker: true
name: steve
hobbies:
- skateboarding
- snowboarding
- go
clothing:
  jacket: leather
  trousers: denim
age: 35
eyes : brown
beard: true

代码:

package main

import (
    "fmt"
    "log"

    "github.com/spf13/viper"
)

func main() {
    viper.SetConfigName("config") // 配置文件名称
    viper.SetConfigType("yaml") // 文件名无扩展名,需要显式指定
    viper.AddConfigPath("/etc/appname/")   // 配置文件搜索路径
    viper.AddConfigPath("$HOME/.appname")  // 多次调用以添加多个
    viper.AddConfigPath(".")               // 也可以设置为工作目录
    if err := viper.ReadInConfig(); err != nil {
        if _, ok := err.(viper.ConfigFileNotFoundError); ok {
            // Config file not found; ignore error if desired
        } else {
            // Config file was found but another error was produced
        }
        log.Fatal(err)
    }
    fmt.Println("获取配置文件的Hacker", viper.GetBool("hacker"))
    fmt.Println("获取配置文件的hobbies", viper.GetStringSlice("hobbies"))
    fmt.Println("获取配置文件的clothing.jacket", viper.GetString(`clothing.jacket`))
}

更详细的使用可以参考 Viper官方文档

总结

日常开发中程序配置管理的绝大部分场景都可以使用 Viper,实际使用中也可以对 Viper 二次封装,来支持读取更多平台的远程文件。

最后 Viper v2 启动了,也在收集广大使用者的需求和反馈。传送门

参考资料

https://github.com/spf13/viper

更多原创文章干货分享,请关注公众号
  • 加微信实战群请加微信(注明:实战群):gocnio
astaxie 将本帖设为了精华贴 04月09日 03:31
_Lin GoCN 每日新闻 (2021-04-09) 中提及了此贴 04月09日 03:32
cuteLittleDevil GoCN 每日新闻 (2021-04-10) 中提及了此贴 04月10日 06:25
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册