如何将生产环境和开发环境的配置文件优雅进行隔离
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的配置