- Created by 郭强, last modified by monchickey on Oct 17, 2023
基本介绍
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
:
package boot import ( "github.com/gogf/gf/contrib/config/polaris/v2" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/gctx" ) func init() { var ( ctx = gctx.GetInitCtx() namespace = "default" fileGroup = "TestGroup" fileName = "config.yaml" path = "manifest/config/polaris.yaml" logDir = "/tmp/polaris/log" ) // Create polaris Client that implements gcfg.Adapter. adapter, err := polaris.New(ctx, polaris.Config{ Namespace: namespace, FileGroup: fileGroup, FileName: fileName, Path: path, LogDir: logDir, Watch: true, }) if err != nil { g.Log().Fatalf(ctx, `%+v`, err) } // Change the adapter of default configuration instance. g.Cfg().SetAdapter(adapter) }
其中:
Namespace
指定的是polaris
配置中的命名空间。FileGroup
指定的是polaris
中的文件分组。FileName
指定的是需要读取的polaris
中的配置文件名称。Path
指定的是polaris
服务端配置,包括polaris的链接地址、监听地址、组件输出日志路径等。
Polaris
的配置文件如下:
global: serverConnector: addresses: - 127.0.0.1:8091 config: configConnector: addresses: - 127.0.0.1:8093 consumer: localCache: persistDir: "/tmp/polaris/backup"
随后在main.go
顶部引入boot
包,保证该包的引入在所有组件的最前面:
package main import ( _ "github.com/gogf/gf/example/config/polaris/boot" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/gctx" ) func main() { var ctx = gctx.GetInitCtx() // Available checks. g.Dump(g.Cfg().Available(ctx)) // All key-value configurations. g.Dump(g.Cfg().Data(ctx)) // Retrieve certain value by key. g.Dump(g.Cfg().MustGet(ctx, "server.address")) }
注意其中顶部import
的引入语句:
_ "github.com/gogf/gf/example/config/polaris/boot"
常用组件
更多组件,请参考:https://github.com/gogf/gf/tree/master/contrib/config
使用示例
https://github.com/gogf/gf/tree/master/example/config/polaris
运行polaris
docker run -d --name polaris -p 8080:8080 -p 8090:8090 -p 8091:8091 -p 8093:8093 loads/polaris-server-standalone:1.11.2
运行示例
$ go run main.go true {} "failed to update local value: config file is empty" panic: failed to update local value: config file is empty goroutine 1 [running]: github.com/gogf/gf/v2/os/gcfg.(*Config).MustGet(0x0?, {0x1c1c4f8?, 0xc0000c2000?}, {0x1ac11ad?, 0x0?}, {0x0?, 0xc000002340?, 0xc000064738?}) /Users/john/Workspace/gogf/gf/os/gcfg/gcfg.go:167 +0x5e main.main() /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
再次运行示例
$ go run main.go true { "server": { "openapiPath": "/api.json", "swaggerPath": "/swagger", "address": ":8199", }, } <nil> ":8199"
可以看到已经正确查询到了polaris
中的配置数据。
- No labels
4 Comments
智刚
北极星安装文档:点击查看
青苹果泡泡糖
如果同时使用gf提供的 github.com/gogf/gf/contrib/config/nacos/v2 和 github.com/gogf/gf/contrib/registry/nacos/v2 这两个包用于获取nacos远程配置文件和服务注册时有可能遇到nacos-sdk-go的monitor panic问题,然后我github提了issuse https://github.com/gogf/gf/issues/3680但是暂时无人处理,没办法,我就抄了这两个包,然后写了一个包暂时用用 https://github.com/LanceAdd/nacos-gf,只依赖gf和nacos-sdk-go,主体代码仍然是以上两个包的代码,但是用 github.com/nacos-group/nacos-sdk-go/v2 替换了 github.com/joy999/nacos-sdk-go,然后简化了下配置方式,使用类似springboot那种配置方式,有需求可以暂时先用下,等社区包更新后再使用社区包。
cqyhuaming
我也遇到这个问题,只要同时使用nacos的配置中心和服务注册和发现,就会出问题,研究了下代码,造成的原因就是,使用的nacos-sdk-go包不同. 导致在启动的时候init函数执行两次初始化,在两个不同的包中都初始化相同的monitor.
青苹果泡泡糖
是的,提了pr但是暂时没合并,正好我需要在远程配置文件内容发生变化时触发一些自定义操作,我就顺便也加了个参数用来传入自定义操作,原本的配置方式也有点繁琐了,我改成了这个样子的