Gin 框架 -十三-: 集成 Viper 配置解析包
1. 介紹
Viper 是適用於 Go 應用程序(包括 Twelve-Factor App)的完整配置解決方案。它被設計用於在應用程序中工作,並且可以處理所有類型的配置需求和格式。目前Star 15.8k
, 它支持以下特性:
-
設置默認值
-
從
JSON
、TOML
、YAML
、HCL
、envfile
和Java properties
格式的配置文件讀取配置信息 -
實時監控和重新讀取配置文件(可選)
-
從環境變量中讀取
-
從遠程配置系統(
etcd
或Consul
)讀取並監控配置變化 -
從命令行參數讀取配置
-
從
buffer
讀取配置 -
顯式配置值
2. 安裝
go get github.com/spf13/viper
3. 目錄介紹
├── api #接口目錄
│ └── v1
│ └── system_info.go
├── app.yaml #配置文件
├── config #配置結構體
│ └── app.go
├── global #全局變量和常量
│ ├── constant.go
│ └── variable.go
├── initialize # 初始化相關
│ ├── register_router.go
│ ├── server.go
│ └── viper.go
├── main.go
└── router # 路由註冊
└── system_info.go
4. 配置解析
4.1 創建全局配置文件
新建./app.yaml
app:
desc: Gin框架學習實踐
version: v1.0.0
addr: 0.0.0.0:8080
mysql:
host: 127.0.0.1
port: 3306
user: root
password: 123456
redis:
host: 127.0.0.1
port: 6379
4.2 創建結構體
新建結構體./config/app.go
package config
// 應用信息
type app struct {
Desc string `yaml:"desc"`
Addr string `yaml:"addr"`
ConfigFile string `yaml:"configFile"`
Version string `yaml:"version"`
}
// MySQL信息
type mysql struct {
Host string `yaml:"host"`
Port string `yaml:"port"`
User string `yaml:"user"`
Password string `yaml:"password"`
}
// Redis
type redis struct {
Host string `yaml:"host"`
Port string `yaml:"port"`
}
// 配置信息
type ViperConfig struct {
App app `yaml:"app"`
Mysql mysql `yaml:"mysql"`
Redis redis `yaml:"redis"`
}
4.3 定義全局配置變量
新建./global/variable.go
package global
import "go-learn/config"
var (
GVA_CONFIG config.ViperConfig // 全局配置
)
4.4 解析代碼開發
新建./initialize/viper.go
package initialize
import (
"flag"
"fmt"
"github.com/fsnotify/fsnotify"
"github.com/spf13/viper"
"go-learn/global"
)
// 初始化viper配置解析包,函數可接受命令行參數
func ViperInit() {
var configFile string
// 讀取配置文件優先級: 命令行 > 默認值
flag.StringVar(&configFile,"c",global.ConfigFile,"配置配置")
if len(configFile) == 0 {
// 讀取默認配置文件
panic("配置文件不存在!")
}
// 讀取配置文件
v := viper.New()
v.SetConfigFile(configFile)
if err := v.ReadInConfig();err != nil {
panic(fmt.Errorf("配置解析失敗:%s\n",err))
}
// 動態監測配置文件
v.WatchConfig()
v.OnConfigChange(func(in fsnotify.Event) {
fmt.Println("配置文件發生改變")
if err := v.Unmarshal(&global.GVA_CONFIG); err != nil {
panic(fmt.Errorf("配置重載失敗:%s\n",err))
}
})
if err := v.Unmarshal(&global.GVA_CONFIG); err != nil {
panic(fmt.Errorf("配置重載失敗:%s\n",err))
}
// 設置配置文件
global.GVA_CONFIG.App.ConfigFile = configFile
}
4.5 在main.go
調用解析
編輯./main.go
package main
import (
"github.com/gin-gonic/gin"
"go-learn/global"
"go-learn/initialize"
)
func main() {
// 初始化Viper
initialize.ViperInit()
// 啓動服務
engine := gin.Default()
engine.GET("/", func(context *gin.Context) {
context.JSON(200,gin.H{"config":global.GVA_CONFIG})
})
_ = engine.Run()
}
4.6 訪問驗證
➜ curl http://127.0.0.1:8080
{
"config": {
"App": {
"Desc": "Gin框架學習實踐",
"Addr": "0.0.0.0:8080",
"ConfigFile": "./app.yaml",
"Version": "v1.0.0"
},
"Mysql": {
"Host": "127.0.0.1",
"Port": "3306",
"User": "root",
"Password": "123456"
},
"Redis": {
"Host": "127.0.0.1",
"Port": "6379"
}
}
}
更多使用方法,可查看文檔: https://github.com/spf13/viper/
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/H3PenuPWMPn_hbz2L04TUg