Viper中的yaml配置文件入门,Viper开发环境和生产环境的隔离

如何将生产环境和开发环境的配置文件优雅进行隔离

package main

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

/*
如何将线上和线下的配置文件进行隔离
不用改任何代码,线上和线下的文件都能隔离开
设置了环境变量之后要重启goland
*/
type MysqlConfig struct {
	Host string `mapstructure:"Host"`
	Port int    `mapstructure:"Port"`
}

type ServerConfig struct {
	Name      string      `mapstructure:"name"`
	MysqlInfo MysqlConfig `mapstructure:"mysql"`
}

func GetEnvInfo(env string) bool  {
	viper.AutomaticEnv()
	fmt.Println(viper.GetBool(env))
	return viper.GetBool(env)
}

func main() {
	v := viper.New()
	//指定文件的目录如何色痕
	configFileName := ""
	if GetEnvInfo("SHOP-DEBUG") {
		//说明是本地环境
		configFileName = "user-web/everydemo/viperdemo/config.yaml"
	}else {
		//说明是线上环境
		configFileName= "user-web/everydemo/viperdemo/config-pro.yaml"
	}
	v.SetConfigFile(configFileName) //此处为项目的相对路径
	if err := v.ReadInConfig(); err != nil {
		panic(err)
	}
	ServerConfig := ServerConfig{}
	if err := v.Unmarshal(&ServerConfig); err != nil {
		panic(err)
	}
	fmt.Println(ServerConfig)
	/*
	viper的动态监控变化
	 */
	v.WatchConfig()
	v.OnConfigChange(func(in fsnotify.Event) {
		fmt.Println("config had channed:" ,in.Name)
		_= v.ReadInConfig()
		_=v.Unmarshal(&ServerConfig)
		fmt.Println(ServerConfig)
	})
	time.Sleep(300*time.Second)
}

本地开发环境

name: 'user-service'
port: 8888

mysql:
  host: '127.0.0.1'
  port: 3306

生产环境

name: 'user-service'
port: 8989

mysql:
  host: '43.22.111.123'
  port: 2222

在本地配置环境变量为true,然后设置函数读取,如果为true那就说明是开发环境,读取DEBUG文件,否则没有环境变量,默认为false就是生产环境,避免了项目上线频繁的更换yaml的配置

你可能感兴趣的:(golang,go)