使用方式

接口文档

配置管理

默认读取的配置文件为config.tomltoml类型文件也是默认的、推荐的配置文件格式(语法参考 章节),如果想要自定义文件格式,可以通过SetFileName方法修改默认读取的配置文件名称(如:config.json, cfg.yaml, cfg.xml, cfg.ini等等)。

例如,我们可以通过以下方式读取config.json配置文件中的数据库database配置项。

  1. // 设置默认配置文件,默认的 config.toml 将会被覆盖
  2. g.Cfg().SetFileName("config.json")
  3. // 后续读取时将会读取到 config.json 配置文件内容,
  4. g.Cfg().Get("database")

我们有两种方式进行配置文件的管理,使用全局的g.Cfg()获取单例对象(推荐),或者单独使用gcfg模块进行管理。

示例配置文件 config.toml

  1. # 模板引擎目录
  2. viewpath = "/home/www/templates/"
  3. # MySQL数据库配置
  4. [database]
  5. [[database.default]]
  6. host = "127.0.0.1"
  7. port = "3306"
  8. user = "root"
  9. pass = "123456"
  10. name = "test1"
  11. type = "mysql"
  12. role = "master"
  13. charset = "utf8"
  14. priority = "1"
  15. port = "3306"
  16. user = "root"
  17. pass = "123456"
  18. name = "test2"
  19. type = "mysql"
  20. role = "master"
  21. charset = "utf8"
  22. priority = "1"
  23. # Redis数据库配置
  24. [redis]
  25. disk = "127.0.0.1:6379,0"
  26. cache = "127.0.0.1:6379,1"

gcfg包最大的特点是支持按层级获取配置数据,层级访问默认通过英文”.“号指定,其中pattern参数和 gjson (数据动态编解码)pattern参数一致。

例如针对以上config.toml配置文件内容的层级读取:

gcfg配置管理器支持非常灵活的多目录自动搜索功能,通过SetPath可以修改目录管理目录为唯一的一个目录地址,同时,我们推荐通过AddPath方法添加多个搜索目录,配置管理器底层将会按照添加目录的顺序作为优先级进行自动检索。直到检索到一个匹配的文件路径为止,如果在所有搜索目录下查找不到配置文件,那么会返回失败。

gcfg配置管理对象初始化时,默认会自动添加以下配置文件搜索目录:

  1. 当前工作目录及其下的config目录:例如当前的工作目录为/home/www时,将会添加/home/www/home/www/config
  2. 当前可执行文件所在目录及其下的config目录:例如二进制文件所在目录为/tmp时,将会添加/tmp/tmp/config
  3. 当前main源代码包所在目录及其下的config目录(仅对源码开发环境有效):例如main包所在目录为/home/john/workspace/gf-app时,将会添加/home/john/workspace/gf-app/home/john/workspace/gf-app/config

我们可以通过以下方式修改配置管理器的配置文件搜索目录,配置管理对象将会只在该指定目录执行配置文件检索:

  1. 通过配置管理器的SetPath方法手动修改;
  2. 修改命令行启动参数 - ;
  3. 修改指定的环境变量 - GF_GCFG_PATH

假如我们的执行程序文件为main,那么可以通过以下方式修改配置管理器的配置文件目录(Linux下):

  1. (推荐)通过单例模式

    1. g.Cfg().SetPath("/opt/config")
    1. ./main --gf.gcfg.path=/opt/config/
  2. 通过环境变量(常用在容器中)

    • 启动时修改环境变量:

    • 使用genv模块来修改环境变量:

    注意事项

    大家都知道,在Golang里面,map/slice类型其实是一个”引用类型”(也叫”指针类型”),因此当你对这种类型的变量 键值对/索引项 进行修改时,会同时修改到其对应的底层数据。

    从效率上考虑,gcfg包某些获取方法返回的数据类型为map/slice时,没有对齐做值拷贝,因此当你对返回的数据进行修改时,会同时修改gcfg对应的底层数据。

    例如:

    1. // For testing/example only.
    2. content := `{"map":{"key":"value"}, "slice":[59,90]}`
    3. gcfg.SetContent(content)
    4. defer gcfg.RemoveContent()
    5. m := g.Cfg().GetMap("map")
    6. fmt.Println(m)
    7. // Change the key-value pair.
    8. m["key"] = "john"
    9. // It changes the underlying key-value pair.
    10. fmt.Println(g.Cfg().GetMap("map"))
    11. s := g.Cfg().GetArray("slice")
    12. fmt.Println(s)
    13. // Change the value of specified index.
    14. s[0] = 100
    15. // It changes the underlying slice.
    16. fmt.Println(g.Cfg().GetArray("slice"))
    17. // output:
    18. // map[key:value]
    19. // map[key:john]

    自动检测更新

    配置管理器使用了缓存机制,当配置文件第一次被读取后会被缓存到内存中,下一次读取时将会直接从缓存中获取,以提高性能。同时,配置管理器提供了对配置文件的自动检测更新机制,当配置文件在外部被修改后,配置管理器能够即时地刷新配置文件的缓存内容。