gin简单上手viper配置管理
前言
Viper是适用于Go应用程序的完整配置解决方案。它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式。
安装
go get github.com/spf13/viper
viper简介
Viper是适用于Go应用程序(包括Twelve-Factor App
)的完整配置解决方案。它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式。它支持以下特性:
- 设置默认值
- 从
JSON
、TOML
、YAML
、HCL
、envfile
和Java properties
格式的配置文件读取配置信息 - 实时监控和重新读取配置文件(可选)
- 从环境变量中读取
- 从远程配置系统(etcd或Consul)读取并监控配置变化
- 从命令行参数读取配置
- 从buffer读取配置
- 显式配置值
gin框架项目中使用(以配置zap日志为例)
json文件的配置
config.json
配置文件
{
"level": "info",
"filename": "logs/viper_zap_gin.log",
"maxsize": "1",
"max_age": "30",
"max_backups": "5",
"version": "v1.8"
}
启动文件main.go
package main
import (
"fmt"
"gin_demo/config"
"gin_demo/logger"
"gin_demo/router"
"github.com/gin-gonic/gin"
"github.com/spf13/viper"
"log"
"net/http"
)
type user struct {
Name string `json:"name"`
Age int
}
func sayHi(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "hello gin",
"version":viper.GetString("version"),
})
}
func sayBye(c *gin.Context) {
c.JSON(http.StatusOK, user{"bob", 22})
}
var logConf = new(config.LogConfig) // 使用new返回的对象就是一个指针
func main() {
viper.SetConfigFile("./config/conf.json") //指定json配置文件的路径
// viper.SetConfigFile("./config/conf.yaml") //指定yaml配置文件的路径
err := viper.ReadInConfig() // 读取配置信息
if err != nil{ // 配置失败
panic(fmt.Errorf("Fatal error config file: %s \n", err))
}
if err = viper.Unmarshal(logConf); err != nil{
panic(fmt.Errorf("unmarshal conf failed, err:%s \n", err))
}
// 监控配置文件变化
viper.WatchConfig()
// zap 初始化
if err := logger.InitLogger(logConf); err != nil {
fmt.Printf("init logger failed, err:%v\n", err)
return
}
r := gin.New()
r = router.SetupRouter()
//r := gin.Default()
r.GET("/hello", sayHi)
r.GET("/bye", sayBye)
err = r.Run(":8888")
if err != nil {
log.Fatal("gin run wrong")
}
}
Logger.go
日志的配置结构体
package config
type LogConfig struct {
Level string `mapstructure:"level"`
Filename string `mapstructure:"filename"`
MaxSize int `mapstructure:"maxsize"`
MaxAge int `mapstructure:"max_age"`
MaxBackups int `mapstructure:"max_backups"`
Version string `mapstructure:"version"`
}
// 配置文件的配置信息也可以写成
type LogConfig1 struct {
Level string `json:"level"`
Filename string `json:"filename"`
MaxSize int `json:"maxsize"`
MaxAge int `json:"max_age"`
MaxBackups int `json:"max_backups"`
Version string `json:"version"`
}
yaml文件的配置
config.yaml
配置文件
level: "info"
filename: "logs/viper_gin.log"
maxsize: 1
max_age: 30
max_backups: 5
version: "v1.1"
启动文件只需修改viper.SetConfigFile("./config/conf.yaml")
即可
参考:李文周