Gin 框架 -十三-: 集成 Viper 配置解析包

1. 介紹

Viper 是適用於 Go 應用程序(包括 Twelve-Factor App)的完整配置解決方案。它被設計用於在應用程序中工作,並且可以處理所有類型的配置需求和格式。目前Star 15.8k, 它支持以下特性:

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