|
@@ -6,6 +6,7 @@ import (
|
|
|
|
|
|
|
|
"dario.cat/mergo"
|
|
"dario.cat/mergo"
|
|
|
"git.ikuban.com/server/yaml"
|
|
"git.ikuban.com/server/yaml"
|
|
|
|
|
+ "github.com/bytedance/sonic"
|
|
|
"github.com/elliotchance/orderedmap/v3"
|
|
"github.com/elliotchance/orderedmap/v3"
|
|
|
"github.com/go-kratos/kratos/v2/config"
|
|
"github.com/go-kratos/kratos/v2/config"
|
|
|
)
|
|
)
|
|
@@ -46,23 +47,40 @@ func Load(sources []Source, bc any) error {
|
|
|
if !ok {
|
|
if !ok {
|
|
|
return fmt.Errorf("unknown config key,key:%s", kv.Key)
|
|
return fmt.Errorf("unknown config key,key:%s", kv.Key)
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- next := map[string]any{}
|
|
|
|
|
- err := yaml.Unmarshal(kv.Value, next)
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- return err
|
|
|
|
|
|
|
+ if kv.Format == "" {
|
|
|
|
|
+ // 处理环境变量配置(Format 为空)
|
|
|
|
|
+ // 环境变量的值已经是简单的字符串,不需要额外解析
|
|
|
|
|
+ // 将环境变量值直接设置到 sourceMap 中对应键的位置
|
|
|
|
|
+ // 这里需要将简单的键值对转换为嵌套结构
|
|
|
|
|
+ envMap := buildNestedMap(kv.Key, string(kv.Value))
|
|
|
|
|
+ sourceMap.Set(kv.Key, envMap)
|
|
|
|
|
+ } else if kv.Format == Yaml.String() {
|
|
|
|
|
+ next := map[string]any{}
|
|
|
|
|
+ err := yaml.Unmarshal(kv.Value, next)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ sourceMap.Set(kv.Key, convertMap(next))
|
|
|
|
|
+ } else if kv.Format == Json.String() {
|
|
|
|
|
+ next := map[string]any{}
|
|
|
|
|
+ err := sonic.Unmarshal(kv.Value, &next)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return err
|
|
|
|
|
+ }
|
|
|
|
|
+ sourceMap.Set(kv.Key, convertMap(next))
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- sourceMap.Set(kv.Key, convertMap(next))
|
|
|
|
|
-
|
|
|
|
|
|
|
+ // 在每个配置源处理完成后,立即合并并解析到目标结构体
|
|
|
|
|
+ // 这样确保配置热更新也能正常工作
|
|
|
merged := make(map[string]any)
|
|
merged := make(map[string]any)
|
|
|
for c := range sourceMap.Values() {
|
|
for c := range sourceMap.Values() {
|
|
|
- err = mergo.Merge(&merged, c, mergo.WithOverride)
|
|
|
|
|
|
|
+ err := mergo.Merge(&merged, c, mergo.WithOverride)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
return err
|
|
return err
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // 将合并后的配置序列化为 YAML 再解析到目标结构体
|
|
|
b, err := yaml.Marshal(merged)
|
|
b, err := yaml.Marshal(merged)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
return err
|
|
return err
|
|
@@ -73,6 +91,7 @@ func Load(sources []Source, bc any) error {
|
|
|
return err
|
|
return err
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // 执行默认配置函数
|
|
|
if defaultCfg != nil {
|
|
if defaultCfg != nil {
|
|
|
defaultCfg(bc)
|
|
defaultCfg(bc)
|
|
|
}
|
|
}
|
|
@@ -83,6 +102,7 @@ func Load(sources []Source, bc any) error {
|
|
|
if err := c.Load(); err != nil {
|
|
if err := c.Load(); err != nil {
|
|
|
return err
|
|
return err
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
return nil
|
|
return nil
|
|
|
}
|
|
}
|
|
|
|
|
|