我们推荐使用单例模式获取配置管理对象。我们可以方便地通过g.Cfg()获取默认的全局配置管理对象。同时,我们也可以通过gcfg.Instance包方法获取配置管理对象单例。

使用g.Cfg

我们来看一个示例,演示如何读取全局配置的信息。需要注意的是,全局配置是与框架相关的,因此统一使用g.Cfg()进行获取。以下是一个默认的全局配置文件,包含了模板引擎的目录配置以及MySQL数据库集群(两台master)的配置。

示例配置:

viewpath: "/home/www/templates/"
database:
  default:
  - link: "mysql:root:12345678@tcp(127.0.0.1:3306)/test"
    role: "master"
  - link: "mysql:root:12345678@tcp(127.0.0.1:3306)/test"
    role: "slave"

示例代码:

package main

import (
	"fmt"

	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/os/gctx"
)

func main() {
	var ctx = gctx.New()
	fmt.Println(g.Cfg().Get(ctx, "viewpath"))
	fmt.Println(g.Cfg().Get(ctx, "database.default.0.role"))
}

以上示例为读取数据库的第一个配置的role信息。运行后输出:

/home/www/templates/
master

可以看到,我们可以通过g.Cfg()方法获取一个全局的配置管理器单例对象。配置文件内容可以通过英文“.”号进行层级访问(数组默认从0开始),pattern参数database.default.0.role表示读取database配置项中default数据库集群中的第0项数据库服务器的role数据。

使用gcfg.Instance

当然也可以独立使用gcfg包,通过Instance方法获取单例对象。

package main

import (
	"fmt"

	"github.com/gogf/gf/v2/os/gcfg"
	"github.com/gogf/gf/v2/os/gctx"
)

func main() {
	var ctx = gctx.New()
	fmt.Println(gcfg.Instance().Get(ctx, "viewpath"))
	fmt.Println(gcfg.Instance().Get(ctx, "database.default.0.role"))
}

自动检索特性

单例对象在创建时会按照文件后缀toml/yaml/yml/json/ini/xml/properties自动检索配置文件。默认情况下会自动检索配置文件config.toml/yaml/yml/json/ini/xml/properties并缓存,配置文件在外部被修改时将会自动刷新缓存。

为方便多文件场景下的配置文件调用,简便使用并提高开发效率,单例对象在创建时将会自动使用单例名称进行文件检索。例如:g.Cfg("redis")获取到的单例对象将默认会自动检索redis.toml/yaml/yml/json/ini/xml/properties,如果检索成功那么将该文件加载到内存缓存中,下一次将会直接从内存中读取;当该文件不存在时,则使用默认的配置文件(config.toml)。


Content Menu

  • No labels

8 Comments

  1. .properties 配置不支持吗?怎么扩展支持?

    1. .properties是ini格式吧,默认就支持了。

      1. 强哥,是不支持.properties配置文件的。

            g.Cfg().GetAdapter().(*gcfg.AdapterFile).SetFileName("config.properties")

        报错

        load config file "xxxx\config\config.properties" failed: unsupported type "" for loading

        1. 是不是要执行解析采用的格式才可以?指定为ini?

          后缀改为.ini也不行,报错缺少section

  2. 如果想通过环境变量配置来覆盖文件配置呢?未找到有效方式

  3. 有没有办法通过不同的环境动态使用不同的配置文件呢。类似于

    spring.profiles.active
  4. 想请教一个设计上的问题:现配置的读取方式会导致代码种很多字符串的硬编码,与之对应的是把配置文件反序列化成一个 struct, 通过 struct 属性的方式来读取至少没那么多硬编码的字符串,所以想知道这块的设计上是怎样考虑的,

    g.Cfg().Get(ctx, "database.default.0.role")  ==>  Database.Default[0].Role




  5. 问题:  设置配置文件目录后,在读取配置时并未按照设置的目录搜索导致读取失败


    程序目录结构:

    /ipaas/deploy_center/bin/main

    /ipaas/deploy_center/conf/config.yaml

    /ipaas/deploy_center/conf/database.yaml


    cmd.go 修改配置文件目录:

    if err = g.Cfg().GetAdapter().(*gcfg.AdapterFile).SetPath("../conf"); err != nil {
       return
    }


    logic获取配置:

    config := g.Cfg("database").MustData(ctx)

    g.Dump(config)


    输出报错:

    possible config files "database" or "database.toml/yaml/yml/json/ini/xml/properties" not found in resource manager or following system searching paths:
    1. /ipaas/deploy_center/bin/
    2. /ipaas/deploy_center/bin/config
    3. /ipaas/deploy_center/bin/manifest/config
    4. /ipaas/deploy_center/
    5. /ipaas/deploy_center/config
    6. /ipaas/deploy_center/manifest/config