Go程序配置利器-viper庫
VSole2022-08-01 10:50:15
推薦理由
日常開發中,程序配置項會包含多種源,如:配置文件,系統環境變量、分布式config服務等等,常規方式是每種配置源寫一套邏輯,雖然開發量不大,但總要花精力去維護后續的變更。Viper庫恰好能解決這類痛點,同時還支持多種配置文件格式,以及熱加載能力,所以程序配置管理場景可以嘗試用Viper庫。
功能介紹
Viper具體功能特性如下:
- 設置配置項默認值
- 支持顯式設置配置項
- 支持讀取JSON、TOML、YAML、HCL、envfile和Java properties等配置格式
- 支持讀取環境變量
- 支持讀取etcd、Consul等分布式配置服務
- 支持讀取命令行參數
- 支持讀取內存
- 配置熱加載
使用指南
Viper使用起來也是比較簡單的,主要的代碼流程大致如下:
- 初始化viper,可以使用單個viper實例,也可以多個viper實例
- 針對不同的配置源設置相對應的參數,如:配置文件路徑,文件類型,ectd/consul服務器訪問地址和key等
- 讀取配置項,可以直接使用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啟動了,也在收集廣大使用者的需求和反饋。傳送門。
本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
VSole
網絡安全專家