探索Viper框架-适用于GoLang的完整配置解决方案

135 阅读1分钟

注:本文为学习时记录的笔记,内容尚浅,后续有时间可能会完善

viper框架学习记录

1.安装与配置

安装viper库

go get github.com/spf13/viper

支持的文件类型

  • json
  • toml
  • yaml
  • yml
  • properties
  • props
  • prop
  • hcl
  • tfvars
  • dotenv
  • env
  • ini

2.使用示例

编写配置文件,以yaml为例

app: # 应用基本配置
  env: local # 环境名称
  port: 8080 # 服务监听端口号
  app_name: online-practice-system # 应用名称
  app_url: http://localhost # 应用域名

定义配置对应的结构体

// Configuration为管理全部配置的父结点
type Configuration struct {
	App      App      `mapstructure:"app" yaml:"app"`
}

// 如果是多层配置,就需要定义多层结构体
type App struct {
    // 在tag标签中加入yaml:"env"`,声明配置对应关系
    Env     string `mapstructure:"env" yaml:"env"`
    Port    string `mapstructure:"port" yaml:"port"`
    AppName string `mapstructure:"app_name" yaml:"app_name"`
    AppUrl  string `mapstructure:"app_url" yaml:"app_url"`
}

定义viper读取配置的初始化代码

package bootstrap

import (
	"fmt"
	"github.com/fsnotify/fsnotify"
	"github.com/spf13/viper"
	"online-practice-system/global"
	"os"
)

// viper读取配置文件初始化
func InitializeConfig() *viper.Viper {
	// 设置配置文件路径
	config := "config.yaml"
	// 生产环境可以通过设置环境变量来改变配置文件路径
	if configEnv := os.Getenv("VIPER_CONFIG"); configEnv != "" {
		config = configEnv
	}

	// 初始化 viper
	v := viper.New()
	v.SetConfigFile(config)
	v.SetConfigType("yaml")
	if err := v.ReadInConfig(); err != nil {
		panic(fmt.Errorf("read config failed: %s \n", err))
	}

	// 监听配置文件
	v.WatchConfig()
	v.OnConfigChange(func(in fsnotify.Event) {
		fmt.Println("config fileDriver changed:", in.Name)
		// 重载配置,这里可以进行重启服务器,或者其他操作
		if err := v.Unmarshal(&global.App.Config); err != nil {
			fmt.Println(err)
		}
	})
	// 将配置赋值给全局变量
	if err := v.Unmarshal(&global.App.Config); err != nil {
		fmt.Println(err)
	}

	return v
}

在main函数中调用初始化函数

func main() {
    //  初始化yaml配置文件
    InitializeConfig()
    ///////////////
}