GO语言使用Viper获取系统环境变量,动态监控配置文件是否更新

GO语言使用Viper获取系统环境变量,动态监控配置文件是否更新

package main

import (
   "fmt"
   "github.com/fsnotify/fsnotify"
   "github.com/spf13/viper"
   "time"
)

type MysqlConfig struct {
   Host string `mapstructure:"host"`
   Port int    `mapstructure:"port"`
}
type Server struct {
   Name  string      `mapstructure:"name"`
   Port  int         `mapstructure:"port"`
   Mysql MysqlConfig `mapstructure:"mysql"`
}

//getEnv 获取系统环境变量
func getEnv(env string) bool {
   viper.AutomaticEnv()
   return viper.GetBool(env)
}

func main() {
   v := viper.New()

   configFileName := "stu/viper_test/config-pro.yaml"
   if getEnv("GO_VIPER_TEST_DEV") {
      configFileName = "stu/viper_test/config-dev.yaml"
   }
   v.SetConfigFile(configFileName)

   if err := v.ReadInConfig(); err != nil {
      fmt.Println(err)
      return
   }

   server := Server{}

   err := v.Unmarshal(&server)
   if err != nil {
      fmt.Println(err)
      return
   }
   fmt.Printf("%+v", server)

   //动态监控配置文件是否更新
   v.WatchConfig()
   v.OnConfigChange(func(in fsnotify.Event) {
      fmt.Println("配置文件有更新", in.Name)
      if err := v.ReadInConfig(); err != nil {
         fmt.Println(err)
         return
      }

      err := v.Unmarshal(&server)
      if err != nil {
         fmt.Println(err)
         return
      }
      fmt.Printf("%+v", server)
   })

   time.Sleep(200 * time.Second)
}

image.png

最后编辑于:2022/01/15作者: 牛逼PHP

发表评论