Golang 实现类 Spring Environment 的配置管理

177 阅读1分钟

Golang 配置管理 Nemo

Nemo 来源于 Nightwish 的歌曲 《Nemo

期望 Nemo 的配置管理能力,作为项目的基础设施默默的提供支持,就如其名一样。

Nemo-Github

关于 Golang 的配置管理,已经有比较优秀的开源项目了,比如: viper

那为什么自己还来造轮子呢?

  • viper 在使用过程中还有一些不如意的地方,见: issue
  • 自己动手写也是加深对 Go 的理解
  • 作为开源爱好者,也希望能把自己的思路开放出来,小伙伴们一起探讨

1.期望功能:

1.1.多绝对路径

  • /opt/data
  • /opt/configs
  • ...

1.2.多相对路径

  • ./resources
  • ./configs
  • .
  • ...

1.3.多文件名

  • application
  • configs
  • config
  • ...

1.4.多环境

  • dev
    • application-dev
    • config-dev
    • ...
  • test
  • prod

1.5.多文件类型

  • yaml
    • yml
    • application.yml
    • application-dev.yml
    • config.yml
    • config-dev.tml
    • ...
  • toml
  • properties

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.x a.b.c.x.y a.b.c.x.zkey 从环境上下文获取变量,然后绑定在指定的结构体上面

属性的绑定需要通过 Go 特有的 Tag binder:"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 见 😄