基本介绍

GoFrame 框架提供了配置管理组件,采用了解耦化及接口化设计,可以很灵活地对接各种第三方配置管理中心。配置管理组件默认提供基于本地系统文件的实现,更多的实现请参考社区组件: https://github.com/gogf/gf/tree/master/contrib/config

社区组件提供了常用的多种配置中心实现,例如 polaris, apollo, nacos, consul 以及容器编排的 kubernetes configmap

组件启用

配置管理组件的启用采用了包初始化的方式,并且由于配置管理功能比较底层,因此需要保证社区包在 main 包的最顶部引入,防止踩坑。我们这里以 polaris 为例,社区组件的使用说明: https://github.com/gogf/gf/tree/master/contrib/config/polaris

需要提供一个独立的引入包,例如 boot

  1. package boot
  2. import (
  3. "github.com/gogf/gf/contrib/config/polaris/v2"
  4. "github.com/gogf/gf/v2/frame/g"
  5. "github.com/gogf/gf/v2/os/gctx"
  6. )
  7. func init() {
  8. var (
  9. ctx = gctx.GetInitCtx()
  10. namespace = "default"
  11. fileGroup = "TestGroup"
  12. fileName = "config.yaml"
  13. path = "manifest/config/polaris.yaml"
  14. logDir = "/tmp/polaris/log"
  15. )
  16. // Create polaris Client that implements gcfg.Adapter.
  17. adapter, err := polaris.New(ctx, polaris.Config{
  18. Namespace: namespace,
  19. FileGroup: fileGroup,
  20. FileName: fileName,
  21. Path: path,
  22. LogDir: logDir,
  23. Watch: true,
  24. })
  25. if err != nil {
  26. g.Log().Fatalf(ctx, `%+v`, err)
  27. }
  28. // Change the adapter of default configuration instance.
  29. g.Cfg().SetAdapter(adapter)
  30. }

其中:

  • Namespace 指定的是 polaris 配置中的命名空间。
  • FileGroup 指定的是 polaris 中的文件分组。
  • FileName 指定的是需要读取的 polaris 中的配置文件名称。
  • Path 指定的是 polaris 服务端配置,包括polaris的链接地址、监听地址、组件输出日志路径等。

Polaris 的配置文件如下:

  1. global:
  2. serverConnector:
  3. addresses:
  4. - 127.0.0.1:8091
  5. config:
  6. configConnector:
  7. addresses:
  8. - 127.0.0.1:8093
  9. consumer:
  10. localCache:
  11. persistDir: "/tmp/polaris/backup"

随后在 main.go 顶部引入 boot 包,保证该包的引入在所有组件的最前面:

  1. package main
  2. import (
  3. _ "github.com/gogf/gf/example/config/polaris/boot"
  4. "github.com/gogf/gf/v2/frame/g"
  5. "github.com/gogf/gf/v2/os/gctx"
  6. )
  7. func main() {
  8. var ctx = gctx.GetInitCtx()
  9. // Available checks.
  10. g.Dump(g.Cfg().Available(ctx))
  11. // All key-value configurations.
  12. g.Dump(g.Cfg().Data(ctx))
  13. // Retrieve certain value by key.
  14. g.Dump(g.Cfg().MustGet(ctx, "server.address"))
  15. }

注意其中顶部 import 的引入语句:

  1. _ "github.com/gogf/gf/example/config/polaris/boot"

常用组件

组件名称文档说明备注
file框架内置默认实现
apollohttps://github.com/gogf/gf/tree/master/contrib/config/apollo
kubecmhttps://github.com/gogf/gf/tree/master/contrib/config/kubecm常用于容器部署环境
nacoshttps://github.com/gogf/gf/tree/master/contrib/config/nacos
polarishttps://github.com/gogf/gf/tree/master/contrib/config/polaris
consulhttps://github.com/gogf/gf/tree/master/contrib/config/consul

更多组件,请参考: https://github.com/gogf/gf/tree/master/contrib/config

使用示例

https://github.com/gogf/gf/tree/master/example/config/polaris

运行 polaris

  1. docker run -d --name polaris -p 8080:8080 -p 8090:8090 -p 8091:8091 -p 8093:8093 loads/polaris-server-standalone:1.11.2

运行示例

  1. $ go run main.go
  2. true
  3. {}
  4. "failed to update local value: config file is empty"
  5. panic: failed to update local value: config file is empty
  6. goroutine 1 [running]:
  7. github.com/gogf/gf/v2/os/gcfg.(*Config).MustGet(0x0?, {0x1c1c4f8?, 0xc0000c2000?}, {0x1ac11ad?, 0x0?}, {0x0?, 0xc000002340?, 0xc000064738?})
  8. /Users/john/Workspace/gogf/gf/os/gcfg/gcfg.go:167 +0x5e
  9. main.main()
  10. /Users/john/Workspace/gogf/gf/example/config/polaris/main.go:20 +0x1b8

可以看到最后的 MustGet 方法执行有报错,这是因为 polaris 中并没有指定的命名空间、配置分组以及配置文件,即便查询不到任何数据但是涉及到配置问题因此返回错误了。由于这里使用的是 Must* 方法,那么在执行返回错误时将会直接 panic 而不是返回错误。

那么我们进入 polaris 的后台添加一些测试数据再试试。

添加测试数据

进入 http://127.0.0.1:8080/#/login 默认账号 polaris 密码 polaris

服务配置管理 - 图1

服务配置管理 - 图2

再次运行示例

  1. $ go run main.go
  2. true
  3. {
  4. "server": {
  5. "openapiPath": "/api.json",
  6. "swaggerPath": "/swagger",
  7. "address": ":8199",
  8. },
  9. }
  10. <nil>
  11. ":8199"

可以看到已经正确查询到了 polaris 中的配置数据。