-
-
Notifications
You must be signed in to change notification settings - Fork 1.7k
feat(os/gcfg): add Loader with automatic struct binding and config watching (like Spring Boot @ConfigurationProperties) #4575
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
- 实现了 Configurator 泛型结构体用于配置绑定 - 支持从配置文件或内容字符串创建配置器 - 提供配置加载、监听和管理功能 - 实现了线程安全的操作机制 - 支持自定义转换器和错误处理函数 - 提供配置变更回调功能 - 添加了完整的单元测试覆盖 - 包含详细的使用文档和示例代码
- 实现了 GetPointer 方法用于获取当前配置结构体的指针 - 该方法是线程安全的,支持读操作但不应被修改 - 添加了相应的注释文档说明方法用途和安全性
|
建议在example中补充一下示例操作代码,谢谢 @LanceAdd |
是这个example吗?https://github.com/gogf/examples |
是的 |
- 添加 watcherName 字段用于跟踪监视器名称 - 在 Watch 方法中验证监视器名称不为空 - 添加 StopWatch 方法用于停止配置变更监视 - 添加 IsWatching 方法用于检查当前是否正在监视 - 添加相关单元测试验证监视器启停功能
- 将所有配置客户端的 AddWatcher 方法参数类型从 func(ctx context.Context) 修改为 gcfg.WatcherFunc - 在 gcfg 包中定义 WatcherFunc 类型别名,提高代码类型安全性 - 修改 WatcherRegistry 内部存储结构,使用泛型 KVMap 替代 StrAnyMap - 简化 WatcherRegistry.Notify 方法中的类型断言和迭代逻辑 - 移除多余的类型转换,使代码更加简洁和类型安全
- 将reuse默认值从true改为false以避免数据竞争 - 更新Configurator初始化逻辑确保默认不重用目标结构体 - 添加注释说明reuse字段的默认行为以避免数据竞争风险
等大家review完,如果能合并我直接维护到官网文档吧,有版本号了再去补到example里,没发版那个example里面go.mod写版本号写的也不对 |
- 将 WatcherFunc 类型定义从函数类型声明改为类型别名
|
@LanceAdd 除了命名外,我暂无其他疑问了。 |
- 将 Configurator 类型重命名为 Loader - 将 NewConfigurator 函数重命名为 NewLoader - 将 NewConfiguratorWithAdapter 函数重命名为 NewLoaderWithAdapter - 更新所有相关的方法接收者名称 - 重命名测试文件从 gcfg_z_unit_configurator_test.go 到 gcfg_z_unit_loader_test.go - 更新所有测试函数名称中的 Configurator 为 Loader - 更新类型定义和方法调用以使用新名称
- 统一将所有方法中的接收器变量名从c修改为l,提高代码一致性 - 修改OnChange、Load、MustLoad、Watch、MustWatch、MustLoadAndWatch等方法的接收器参数 - 更新Get、GetPointer、SetConverter、SetLoadErrorHandler、SetReuseTargetStruct等方法的接收器参数 - 调整StopWatch和IsWatching方法中的接收器变量引用
- OnChange方法现在返回Loader实例以支持链式调用 - SetConverter方法现在返回Loader实例以支持链式调用 - SetLoadErrorHandler方法现在返回Loader实例以支持链式调用 - SetReuseTargetStruct方法现在返回Loader实例以支持链式调用 - 保持原有功能不变,仅添加返回值以实现流畅接口模式
- 将 loadErrorFunc 字段重命名为 watchErrorFunc 以更准确反映其用途 - 移除直接加载操作中的错误处理回调调用 - 保留监听操作中的错误处理回调功能 - 更新单元测试以验证新的错误处理行为 - 修正方法名从 SetLoadErrorHandler 到 SetWatchErrorHandler - 调整测试逻辑以区分直接加载和监听期间的错误处理
Loader 配置加载器
Loader 是一个通用的配置管理器,提供了类似于 Spring Boot 的
@ConfigurationProperties的配置加载、监控、更新和管理功能。功能特性
安装
使用示例
1. 基本用法
用法一
用法二
2. 配置监控
3. 自定义转换器
4. 便捷方法
API 参考
NewLoader创建一个新的 Loader 实例。
参数:
config: 配置实例,用于监控变化propertyKey: 监控的属性键模式(使用 "" 或 "." 监控所有配置)targetStruct: 接收配置值的结构体指针(可选)NewLoaderWithAdapter使用适配器创建一个新的 Loader 实例。
Load从配置实例加载数据并绑定到目标结构体。
MustLoad与 Load 类似,但出错时会 panic。
Watch开始监控配置变化并自动更新目标结构体。
MustWatch与 Watch 类似,但出错时会 panic。
MustLoadAndWatch便捷方法,调用 MustLoad 和 MustWatch。
Get返回当前配置结构体。
GetPointer() *T返回指向当前配置结构体的指针。
OnChange设置配置变化时调用的回调函数。
SetConverter设置在 Load 操作期间使用的自定义转换函数。
SetWatchErrorHandler设置在 Watch 过程中 Load 操作失败时调用的错误处理函数。
SetReuseTargetStruct设置是否在更新时重用相同的目标结构体或创建新结构体。
StopWatch停止监控配置变化并移除关联的监控器。
IsWatching返回 Loader 是否正在监控配置变化。
高级用法
监控特定配置键
使用默认值
错误处理
Loader 提供了灵活的错误处理机制: