Golang: 配置文件热重载

使用Viper+fsnotify实现

package bootstrap

import (
	"fmt"
	"log"

	"github.com/fsnotify/fsnotify"
	"github.com/spf13/viper"
)

// 配置信息结构
type Config struct {
	Server struct {
		Version string `mapstructure:"VERSION"`
		Debug   bool   `mapstructure:"DEBUG"`
		Port    string `mapstructure:"PORT"`
	}
}

// 配置初始化
func InitConfig() error {
	var cfg Config
	serverConfig = &cfg
	viper.SetConfigName("config")
	viper.SetConfigType("yaml")
	viper.AddConfigPath("./config")
	viper.AutomaticEnv()
	if err := viper.ReadInConfig(); err != nil {
		return fmt.Errorf("加载配置文件失败: %w", err)
	}
	if err := viper.Unmarshal(&cfg); err != nil {
		return fmt.Errorf("解析配置文件失败: %w", err)
	}
	// 热重载
	viper.WatchConfig()
	viper.OnConfigChange(func(e fsnotify.Event) {
		if err := viper.Unmarshal(&cfg); err != nil {
			log.Printf("配置文件重新加载失败: %s", err)
			return
		}
		serverConfig = &cfg
	})
	return nil
}
暂无评论

发送评论 编辑评论


				
上一篇
下一篇