Golang 配置管理 Nemo
Nemo来源于Nightwish的歌曲 《Nemo》期望
Nemo的配置管理能力,作为项目的基础设施默默的提供支持,就如其名一样。
关于 Golang 的配置管理,已经有比较优秀的开源项目了,比如: viper。
那为什么自己还来造轮子呢?
1.期望功能:
1.1.多绝对路径
/opt/data/opt/configs...
1.2.多相对路径
./resources./configs....
1.3.多文件名
applicationconfigsconfig...
1.4.多环境
devapplication-devconfig-dev...
testprod
1.5.多文件类型
yamlymlapplication.ymlapplication-dev.ymlconfig.ymlconfig-dev.tml...
tomlproperties
1.6.支持自动加载环境变量
1.7.支持变量扩展
其中
${a.b.c....z}中的a.b.c....z可以是上下文中的 任意变量 ,也可以是 环境变量
1.7.1.简单扩展
${a.b.c....z}
1.7.2.默认值扩展
${a.b.c....z:hello}
1.8.操作
1.8.1.设置
1.8.1.1.普通设置
Get("key", "value")
1.8.1.2.嵌套设置
NestedSet("a.b.c....z", "value")
1.8.2.获取
1.8.2.1.普通获取
Get("key")
1.8.2.2.嵌套获取
NestedGet("a.b.c....z")
2.属性绑定
2.1.内置 Binder
2.2.Binder 支持自定义前缀
当设置了前缀:
a.b.c之后, 结构体的绑定会通过a.b.c.xa.b.c.x.ya.b.c.x.z等key从环境上下文获取变量,然后绑定在指定的结构体上面属性的绑定需要通过
Go特有的Tagbinder:"xxx"实现。
实例: 结构体
type Sub struct {
X string `binder:"x"`
Y int `binder:"y"`
}
type Main struct {
A string `binder:"d"`
B int `binder:"e"`
C bool `binder:"f"`
Z float64 `binder:"g.h"`
Sub Sub `binder:"sub"`
}
// 模拟定义: 环境上下文
// collection.AnyMap == map[string]any == map[string]interface{}
ctx := collection.AnyMap{
"a": collection.AnyMap{
"b": collection.AnyMap{
"c": collection.AnyMap{
"d": "Hello",
"e": 42,
"f": true,
"g": collection.AnyMap{
"h": 3.14,
},
"sub": collection.AnyMap{
"x": "Nested",
"y": 123,
},
},
},
},
}
// 执行绑定
// 1.默认绑定
binder := &Binder{Prefix: "a.b.c"}
binder.DefaultBind(&targetBean,ctx)
// 2.指定前缀绑定
binder := &Binder{}
binder.Bind(${prefix},&targetBean,ctx)
3.事件处理
- 同步事件
- 异步事件
- 暂未实现
3.1.准备事件
- 自定义启动变量
- 加载远程配置中心
3.2.加载前事件
- 加载前校验
- 比如:
- 搜索的路径是否发正确
- 文件名称是否正确
- 文件类型是否匹配
- 文件全名是否拼接正常
- …
- 比如:
3.2.加载后事件
- 处理变量扩展
- 回调钩子函数
- 比如:
- 一些初始化的操作需要在环境准备好之后立即执行
- 比如:
以上就是: Nemo 作为配置管理期望有的功能。
4.结尾
Nemo 还在设计和开发中,欢迎各位小伙伴踊提意见和建议。
Github 见 😄