1.介绍
Viper是适用于Go应用程序(包括Twelve-Factor App)的完整配置解决方案。它被设计用于在应用程序中工作,并且可以处理所有类型的配置需求和格式。目前Star 15.8k
,它支持以下特性:
- 设置默认值
- 从
JSON
、TOML
、YAML
、HCL
、envfile
和Java properties
格式的配置文件读取配置信息
- 实时监控和重新读取配置文件(可选)
- 从环境变量中读取
- 从远程配置系统(
etcd
或Consul
)读取并监控配置变化
- 从命令行参数读取配置
- 从
buffer
读取配置
- 显式配置值
2.项目介绍
Gin
框架学习使用,并实践常用包在Gin
框架中的集成和使用。源码地址: https://github.com/52lu/gin-import-template.git
2.1 项目结构
├── api ├── config ├── core ├── global ├── initialize ├── logs ├── main.go ├── model ├── router └── middleware ├── test └── utils
|
2.2 集成流程
3.安装
go get github.com/spf13/viper
|
4.配置
4.1 创建全局配置文件
新建./config/app.yaml
app: desc: Gin框架学习实践 version: v1.0.0 addr: 0.0.0.0:8080 env: dev mysql: host: 127.0.0.1 port: 3306 user: root password: 123456 redis: host: 127.0.0.1 port: 6379
|
4.2 创建全局配置结构体
新建结构体./config/app.go
package config
type app struct { Desc string `yaml:"desc"` Addr string `yaml:"addr"` ConfigFile string `yaml:"configFile"` Version string `yaml:"version"` Env string `yaml:"env"` }
type mysql struct { Host string `yaml:"host"` Port string `yaml:"port"` User string `yaml:"user"` Password string `yaml:"password"` }
type redis struct { Host string `yaml:"host"` Port string `yaml:"port"` }
type ServerConfig struct { App app `yaml:"app"` Mysql mysql `yaml:"mysql"` Redis redis `yaml:"redis"` Log log `yaml:"log"` }
|
4.3 定义全局变量和常量
新建./global/global.go
const ( ConfigFile = "./config/app.yaml" )
var ( GvaConfig config.ServerConfig )
|
5.具体集成
5.1 集成入口(InitConfig
)
新建./initialize/viper.go
func InitConfig() { var configFile string flag.StringVar(&configFile,"c",global.ConfigFile,"配置配置") if len(configFile) == 0 { panic("配置文件不存在!") } v := viper.New() v.SetConfigFile(configFile) if err := v.ReadInConfig();err != nil { panic(fmt.Errorf("配置解析失败:%s\n",err)) } v.WatchConfig() v.OnConfigChange(func(in fsnotify.Event) { fmt.Println("配置文件发生改变") if err := v.Unmarshal(&global.GvaConfig); err != nil { panic(fmt.Errorf("配置重载失败:%s\n",err)) } }) if err := v.Unmarshal(&global.GvaConfig); err != nil { panic(fmt.Errorf("配置重载失败:%s\n",err)) } global.GvaConfig.App.ConfigFile = configFile }
|
5.2 验证测试
➜ curl http://127.0.0.1:8080/config { "code": 0, "msg": "请求成功", "data": { "App": { "Desc": "Gin框架学习实践", "Addr": "0.0.0.0:8080", "ConfigFile": "./config/app.yaml", "Version": "v1.0.0", "Env": "dev" }, "Mysql": { "Host": "127.0.0.1", "Port": "3306", "User": "root", "Password": "123456" }, "Redis": { "Host": "127.0.0.1", "Port": "6379" }, "Log": { "Path": "./logs", "Level": "debug", "FilePrefix": "gin", "FileFormat": "2006-01-02", "OutFormat": "json", "LumberJack": { "MaxSize": 1, "MaxBackups": 3, "MaxAge": 30, "Compress": false } } }, "time": "2021-06-03 17:16:48" }
|