1. 概述
项目配置是整个项目中很重要的一部分,一般项目的配置有数据库配置,应用配置(地址,端口等),缓存配置,第三方扩展的配置,中间件配置等等,可见配置在一个项目中的地位是很重要的,但是,gin 中没有提供相关的配置管理的组件,我们可以使用 go 的第三方包来做配置管理,集成到 gin 中。
常用的第三方包有:
- ini
- yaml
- viper
- ….
本教程主要讲解 ini,其他的请执行 Google
2.ini 的使用
目录结构我们使用前面推荐项目结构
- 安装 gopkg.in/ini.v1
go get gopkg.in/ini.v1
- 在 conf 下创建 app.ini 配置文件
[server]
address = 0.0.0.0
port = 8080
- 在 pkg 中创建 config 目录,并创建 server.go,配置 Server 配置
package config
import (
"cn.sockstack/gin_demo/pkg/helper"
"gopkg.in/ini.v1"
)
var Server *server
type server struct {
Address string
Port int
source *ini.File
}
func (s *server) Load(path string) *server {
var err error
// 判断配置文件是否存在
exists, err := helper.PathExists(path)
if !exists {return s}
s.source, err = ini.Load(path)
if err != nil {panic(err)
}
return s
}
func (s *server)Init() *server {
// 判断配置是否加载成功
if s.source == nil {return s}
s.Address = s.source.Section("server").Key("address").MustString("0.0.0.0")
s.Port = s.source.Section("server").Key("port").MustInt(8080)
return s
}
注意:helper.PathExists(path)
是 pkg/helper/util.go 的工具方法,实现如下
package helper
import "os"
func PathExists(path string) (bool, error) {_, err := os.Stat(path)
if err == nil {return true, nil}
if os.IsNotExist(err) {return false, nil}
return false, err
}
- 测试配置,在 pkg/config 目录下创建 server_test.go,并运行
package config
import (
"fmt"
"testing"
)
func TestServer(t *testing.T) {Server = (&server{}).Load("../../conf/app.ini").Init()
fmt.Println(Server)
if Server == nil {t.Fail()
}
}
- 测试结果,测试通过
=== RUN TestServer
&{0.0.0.0 8081 0xc000118000}
--- PASS: TestServer (0.00s)
PASS
Process finished with exit code 0
- 在 pkg/config 目录下创建 init.go,初始化配置
package config
func init() {Server = (&server{}).Load("conf/app.ini").Init()}
- gin 整合配置,使用快速入门的例子
package main
// 导入 gin 包
import (
"cn.sockstack/gin_demo/pkg/config"
"fmt"
"github.com/gin-gonic/gin"
)
// 入口函数
func main() {
// 初始化一个 http 服务对象
r := gin.Default()
// 设置一个 get 请求的路由,url 为 /hello, 处理函数(或者叫控制器函数)是一个闭包函数。r.GET("/hello", func(c *gin.Context) {
// 通过请求上下文对象 Context, 直接往客户端返回一个 json
c.JSON(200, gin.H{"message": "hello world",})
})
r.Run(fmt.Sprintf("%s:%d", config.Server.Address, config.Server.Port)) // 监听并在 0.0.0.0:8080 上启动服务
}
- 控制台输出
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery m
iddleware already attached.
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in produ
ction.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET /hello --> main.main.func1 (3 handlers)
[GIN-debug] Listening and serving HTTP on 0.0.0.0:8080
- 浏览器输入 localhost:8080/hello 测试,响应结果
{"message": "hello world"}
3. 后记
本教程使用了 ini 配置,其他的配置使用方式类似,有兴趣的可以自行实现。