阅读 333

手把手,带你从零封装Gin框架(二):配置初始化 & 全局变量

前言

配置文件是每个项目必不可少的部分,用来保存应用基本数据、数据库配置等信息,避免要修改一个配置项需要到处找的尴尬。这里我使用 viper 作为配置管理方案,它支持 JSON、TOML、YAML、HCL、envfile、Java properties 等多种格式的配置文件,并且能够监听配置文件的修改,进行热重载,详细介绍大家可以去官方文档查看

安装

go get -u github.com/spf13/viper  复制代码

编写配置文件

在项目根目录下新建一个文件 config.yaml ,初期先将项目的基本配置放入,后续我们会添加更多配置信息

app: # 应用基本配置   env: local # 环境名称   port: 8888 # 服务监听端口号   app_name: gin-app # 应用名称   app_url: http://localhost # 应用域名 复制代码

编写配置结构体

在项目根目录下新建文件夹 config,用于存放所有配置对应的结构体

新建 config.go 文件,定义 Configuration 结构体,其 App 属性对应 config.yaml 中的 app

package config type Configuration struct {     App App `mapstructure:"app" json:"app" yaml:"app"` } 复制代码

新建 app.go 文件,定义 App 结构体,其所有属性分别对应 config.yamlapp 下的所有配置

package config type App struct {     Env string `mapstructure:"env" json:"env" yaml:"env"`     Port string `mapstructure:"port" json:"port" yaml:"port"`     AppName string `mapstructure:"app_name" json:"app_name" yaml:"app_name"`     AppUrl string `mapstructure:"app_url" json:"app_url" yaml:"app_url"` } 复制代码

注意:配置结构体中 mapstructure  标签需对应 config.ymal 中的配置名称, viper 会根据标签 value 值把 config.yaml 的数据赋予给结构体

全局变量

新建 global/app.go 文件,定义 Application 结构体,用来存放一些项目启动时的变量,便于调用,目前先将 viper 结构体和 Configuration 结构体放入,后续会添加其他成员属性

package global import (     "github.com/spf13/viper"     "jassue-gin/config" ) type Application struct {     ConfigViper *viper.Viper     Config config.Configuration } var App = new(Application) 复制代码

使用 viper 载入配置

新建 bootstrap/config.go 文件,编写代码:

package bootstrap import (     "fmt"     "github.com/fsnotify/fsnotify"     "github.com/spf13/viper"     "jassue-gin/global"     "os" ) func InitializeConfig() *viper.Viper {     // 设置配置文件路径     config := "config.yaml"     // 生产环境可以通过设置环境变量来改变配置文件路径     if configEnv := os.Getenv("VIPER_CONFIG"); configEnv != "" {         config = configEnv     }     // 初始化 viper     v := viper.New()     v.SetConfigFile(config)     v.SetConfigType("yaml")     if err := v.ReadInConfig(); err != nil {         panic(fmt.Errorf("read config failed: %s \n", err))     }     // 监听配置文件     v.WatchConfig()     v.OnConfigChange(func(in fsnotify.Event) {         fmt.Println("config file changed:", in.Name)         // 重载配置         if err := v.Unmarshal(&global.App.Config); err != nil {             fmt.Println(err)         }     })     // 将配置赋值给全局变量     if err := v.Unmarshal(&global.App.Config); err != nil {        fmt.Println(err)     }     return v } 复制代码

初始化配置

修改 main.go 文件

package main import (     "github.com/gin-gonic/gin"     "jassue-gin/bootstrap"     "jassue-gin/global"     "net/http" ) func main() {     // 初始化配置     bootstrap.InitializeConfig()     r := gin.Default()     // 测试路由     r.GET("/ping", func(c *gin.Context) {         c.String(http.StatusOK, "pong")     })     // 启动服务器     r.Run(":" + global.App.Config.App.Port) } 复制代码

执行 go run main.go ,启动应用,服务器监听的端口是已经是配置文件里的端口号了

image-20211009162116315.png


作者:jassue
链接:https://juejin.cn/post/7016979344094396424

文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐