Viper主要是用来在配置管理方面用的,只要是稍微大一点的项目都需要进行配置管理,而Viper支持多种配置格式(JSON、YAML、TOML)登,可以配置环境变量,命令行参数登,使得应用程序配置的管理变得非常灵活,可以根据选择不同的喷子源,它还支持为配置设置默认值,以及配置重载,即可以在不重启应用程序的情况下动态的重新加载配置。
1.安装Viper库
首先使用以下命令安装Viper到项目中:
go get -u github.com/spf13/viper
2.导入Viper模块
import "github.com/spf13/viper"
3.创建一个配置文件
我们可以在项目的根目录下创建一个config文件夹然后在文件夹里创建第一个配置文件叫 local.yml
以及创建一个pkg文件夹下面创建一个config文件夹,和config.go和在项目中创建一个main.go文件
在local.yml中输入要进行配置的内容,注意这个文件内容中的空格位置和换行。
env: local # 本地开发环境
http:
host: 0.0.0.0
# host: 127.0.0.1
port: 8000
security:
api_sign:
app_key: 123456
app_security: 123456
jwt:
key: QsYjsIruThlAkrfB89fw8prOaObmrch8
data:
db:
user:
driver: mysql
dsn: root:xxxxxxxxxx@tcp(121.196.222.111:3306)/al_smart_library?charset=utf8mb4&parseTime=True&loc=Local
4.初始化config
首先在config.go文件中写一下初始化配置文件对象的函数。
我在这里把基本的函数注释,以及作用都写在了里面,
基本上的理解就是通过传入参数配置文件(local.yml)的路径去查看内容然后绑定到conf对象。然后监听这个配置文件(local.yml)如果发现改变就及时的更新conf对象。
func NewConfig(p string) *viper.Viper {
//查询环境变量中配置的路径,如果没有路径就设置为p
envConf := os.Getenv("APP_CONF")
if envConf == "" {
envConf = p
}
fmt.Println("load conf file:", envConf)
return getConfig(envConf)
}
func getConfig(path string) *viper.Viper {
//初始化一个viper对象,里面是很多map[string]interface{}对象
conf := viper.New()
//再次设定config的路径
conf.SetConfigFile(path)
//conf会通过路径去读取配置文件的内容
err := conf.ReadInConfig()
if err != nil {
panic(fmt.Errorf("ReadInConfig failed, err: %v", err))
}
//监听配置文件,当配置文件被修改的情况下,会重新读取conf
conf.WatchConfig()
conf.OnConfigChange(func(in fsnotify.Event) {
fmt.Println("夭寿啦~配置文件被人修改啦...")
err := conf.ReadInConfig()
if err != nil {
panic(fmt.Errorf("ReadInConfig failed, err: %v", err))
}
})
return conf
}
5.在main方法中使用config
最后在main方法中就可以调用这个初始化config的方法
可以通过我注释的两个fmt.Println(),可以看到打印的内容和local.yml里面的内容一样,说明读取成功了
在下面启动了一个路由器监听8080端口,
尝试在local.yml里面修改配置,控制台也会打印 “夭寿啦~配置文件被人修改啦…”说明配置监听成功了
func main() {
var envConf = flag.String("conf", "config/local.yml", "config path, eg: -conf ./config/local.yml")
//flag.Parse的作用是当用户在启动项目的时候会把传递的命令行参数解析为对应变量的值
//比如说 go run main.go -conf ./config/prod.yml 此时运行项目配置文件就会变成prod.yml了
flag.Parse()
//初始化conf,其会自动的查看路径地点的文件内容。
conf := config.NewConfig(*envConf)
fmt.Println(conf.GetString("env")) //local
fmt.Println(conf.GetString("security.api_sign.app_key")) //123456
// 在启动 Gin 服务时使用 Go 协程
if err := gin.Default().Run(":8080"); err != nil {
log.Fatalf("Failed to start Gin server: %v", err)
}
}
在之后比如要写一个数据库的初始化函数的时候,就可以在这个函数中传入conf对象,就可以把数据库的账号密码,ip,端口等信息都放到local.yml文件中,然后在数据库的初始化函数中读取这些信息进行创造db(数据库)对象。