暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Gin集成(一):集成viper配置解析包

猿码记 2021-07-06
1462


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"`
}
// MySQL信息
type mysql struct {
 Host     string `yaml:"host"`
 Port     string `yaml:"port"`
 User     string `yaml:"user"`
 Password string `yaml:"password"`
}
// Redis
type redis struct {
 Host string `yaml:"host"`
 Port string `yaml:"port"`
}
// ServerConfig 配置信息
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

// ViperInit 初始化viper配置解析包,函数可接受命令行参数
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-06 17:16:48"
}



长按二维码关注最新动态

“阅读原文”我们一起进步
文章转载自猿码记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论