gin项目配置

递归棱镜
• 阅读 3844

1.概述

项目配置是整个项目中很重要的一部分,一般项目的配置有数据库配置,应用配置(地址,端口等),缓存配置,第三方扩展的配置,中间件配置等等,可见配置在一个项目中的地位是很重要的,但是,gin中没有提供相关的配置管理的组件,我们可以使用go的第三方包来做配置管理,集成到gin中。

常用的第三方包有:

本教程主要讲解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配置,其他的配置使用方式类似,有兴趣的可以自行实现。

出处gin从入门到实践更多精彩文章,请关注我的博客SOCKSTACK,分享我的工作经验。
点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
springboot操作redis基础说明
软件环境:springboot1.5.2,redis3.2.1配置在application.properties,增加redis的配置,主要配置项包括redis的ip,端口,密码等,具体如下:\redisRedis数据库索引(默认为0)spring.redis.database0Redis服务器地址spring
Stella981 Stella981
3年前
Nacos配置中心动态获取数组配置
有的时候我们需要动态获取一系列的配置项,假设我们在nacos配置中心的配置如下,nacos配置中心的其他设置请参考Nacos搭建流程(https://my.oschina.net/u/3768341/blog/3138297)skill:name:爆炸冲刺在SpringCloud代
Wesley13 Wesley13
3年前
JavaEE进阶知识学习
SpringCloudConfig配置中心概述就前面项目而言,分布面临的问题是配置问题,每一个项目都有一个yml文件,不好运维管理,所有需要一套集中式,动态的配置管理设施,SpringCloud提供了ConfigServer来解决这个问题。SpringCloudConfig是为微服务架构中的微服
Wesley13 Wesley13
3年前
Go配置文件热加载
在日常项目的开发中,我们经常会使用配置文件来保存项目的基本元数据,配置文件的类型有很多,如:JSON、xml、yaml、甚至可能是个纯文本格式的文件。不管是什么类型的配置数据,在某些场景下,我们可会有热更新当前配置文件内容的需求,比如:使用Go运行的一个常驻进程,运行了一个WebServer服务进程。此时,如果配置文件发生变化,我们
Stella981 Stella981
3年前
ELK学习笔记之配置logstash消费kafka多个topic并分别生成索引
0x00 filebeat配置多个topicfilebeat.prospectors:input_type:logencoding:GB2312fields_under_root:truefields:添加字段
Wesley13 Wesley13
3年前
KAFKA官方教程笔记
 因为kafka配置较多,所以单独写一篇博客来记录。       1,broker配置   主要的配置项有三个broker.id集群内唯一log.dir数据目录zookeeper.connectzookeeper连接地址Topiclevelconfigurationsanddefaultsa
Wesley13 Wesley13
3年前
thinkphp5.0数据库操作
ThinkPHP数据库处理:1.MySQL的数据库连接首先配置database.php文件使用{dump(config('database));}来查看数据库的配置项使用{$resDb::connect();dump($res);}来查看数据库的连接信息我们可以在{Db::connect()}中来配置数据库的连接,具体
Easter79 Easter79
3年前
SpringBoot2.0之六 多环境配置
  开发过程中面对不同的环境,例如数据库、redis服务器等的不同,可能会面临一直需要修改配置的麻烦中,在以前的项目中,曾通过Tomcat的配置来实现,有的项目甚至需要手动修改相关配置,这种方式费时费力,出错的概率还极大,SpringBoot为我们提供了更加简单方便的配置方案来解决多环境的配置问题,下面我们看看怎么实现。一、新建一个项目(本文以上篇的代码
Stella981 Stella981
3年前
Disconf部署安装
DistributedConfigurationManagementPlatform(分布式配置管理平台)专注于各种 分布式系统配置管理 的通用组件/通用平台,提供统一的配置管理服务。主要目标:部署极其简单:同一个上线包,无须改动配置,即可在多个环境中(RD/QA/PRODUCTION)上线
Stella981 Stella981
3年前
SpringBoot2.0之六 多环境配置
  开发过程中面对不同的环境,例如数据库、redis服务器等的不同,可能会面临一直需要修改配置的麻烦中,在以前的项目中,曾通过Tomcat的配置来实现,有的项目甚至需要手动修改相关配置,这种方式费时费力,出错的概率还极大,SpringBoot为我们提供了更加简单方便的配置方案来解决多环境的配置问题,下面我们看看怎么实现。一、新建一个项目(本文以上篇的代码
美凌格栋栋酱 美凌格栋栋酱
4个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(