You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by al...@apache.org on 2022/10/26 11:02:16 UTC
[dubbo-go] 01/07: resolve placeholder
This is an automated email from the ASF dual-hosted git repository.
alexstocks pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git
commit 3cd7828145e3882f6626a62d178bd83fce8b153b
Author: zlb <10...@qq.com>
AuthorDate: Thu Aug 11 23:43:05 2022 +0800
resolve placeholder
---
config/config_resolver.go | 39 +++++++++++++++++++++++-
config/config_resolver_test.go | 25 +++++++++++++++
config/testdata/config/resolver/application.yaml | 36 ++++++++++++++++++++++
3 files changed, 99 insertions(+), 1 deletion(-)
diff --git a/config/config_resolver.go b/config/config_resolver.go
index 0e4eefd4a..95b4c60e8 100644
--- a/config/config_resolver.go
+++ b/config/config_resolver.go
@@ -18,11 +18,14 @@
package config
import (
+ log "github.com/dubbogo/gost/log/logger"
"github.com/knadh/koanf"
"github.com/knadh/koanf/parsers/json"
"github.com/knadh/koanf/parsers/toml"
"github.com/knadh/koanf/parsers/yaml"
+ "github.com/knadh/koanf/providers/confmap"
"github.com/knadh/koanf/providers/rawbytes"
+ "strings"
"github.com/pkg/errors"
)
@@ -66,5 +69,39 @@ func GetConfigResolver(conf *loaderConf) *koanf.Koanf {
if err != nil {
panic(err)
}
- return k
+ return resolvePlaceholder(k)
+}
+
+const (
+ PlaceholderPrefix = "${"
+ PlaceholderSuffix = "}"
+)
+
+// resolvePlaceholder replace ${xx} with real value
+func resolvePlaceholder(resolver *koanf.Koanf) *koanf.Koanf {
+ m := make(map[string]interface{})
+ for k, v := range resolver.All() {
+ if _, ok := v.(string); !ok {
+ continue
+ }
+ s := v.(string)
+ newKey := checkPlaceholder(s)
+ if newKey == "" {
+ continue
+ }
+ m[k] = resolver.Get(newKey)
+ }
+ err := resolver.Load(confmap.Provider(m, resolver.Delim()), nil)
+ if err != nil {
+ log.Errorf("resolvePlaceholder error %s", err)
+ }
+ return resolver
+}
+
+func checkPlaceholder(s string) string {
+ s = strings.Trim(s, " ")
+ if !strings.HasPrefix(s, PlaceholderPrefix) || !strings.HasSuffix(s, PlaceholderSuffix) {
+ return ""
+ }
+ return strings.Trim(s[len(PlaceholderPrefix):len(s)-len(PlaceholderSuffix)], " ")
}
diff --git a/config/config_resolver_test.go b/config/config_resolver_test.go
new file mode 100644
index 000000000..97b496cd3
--- /dev/null
+++ b/config/config_resolver_test.go
@@ -0,0 +1,25 @@
+package config
+
+import (
+ "github.com/knadh/koanf"
+ "github.com/stretchr/testify/assert"
+ "testing"
+)
+
+func TestResolvePlaceHolder(t *testing.T) {
+ t.Run("test resolver", func(t *testing.T) {
+ conf := NewLoaderConf(WithPath("/Users/zlb/GolandProjects/dubbo-go/config/testdata/config/resolver/application.yaml"))
+ koan := GetConfigResolver(conf)
+ assert.Equal(t, koan.Get("dubbo.config-center.address"), koan.Get("dubbo.registries.nacos.address"))
+ assert.Equal(t, koan.Get("localhost"), koan.Get("dubbo.protocols.dubbo.ip"))
+ assert.Equal(t, nil, koan.Get("dubbo.registries.nacos.group"))
+
+ rc := NewRootConfigBuilder().Build()
+ err := koan.UnmarshalWithConf(rc.Prefix(), rc, koanf.UnmarshalConf{Tag: "yaml"})
+ assert.Nil(t, err)
+ assert.Equal(t, rc.ConfigCenter.Address, rc.Registries["nacos"].Address)
+ //not exist, default
+ assert.Equal(t, "", rc.Registries["nacos"].Group)
+
+ })
+}
diff --git a/config/testdata/config/resolver/application.yaml b/config/testdata/config/resolver/application.yaml
new file mode 100644
index 000000000..91714ddff
--- /dev/null
+++ b/config/testdata/config/resolver/application.yaml
@@ -0,0 +1,36 @@
+localhost: 127.0.0.1
+dubbo:
+ application:
+ name: dubbo-go
+ module: local
+ version: 1.0.0
+ owner: zhaoyunxing
+ config-center:
+ address: nacos://127.0.0.1:8848
+ cluster: dev
+ namespace: dubbo
+ log-dir: ./logs
+ protocols:
+ dubbo:
+ name: dubbo
+ ip: ${localhost}
+ port: 20000
+ registries:
+ nacos:
+ timeout: 5s
+ group: ${notexist}
+ address: ${dubbo.config-center.address}
+ zk:
+ protocol: zookeeper
+ group: dev
+ address: 127.0.0.1:2181
+ services:
+ helloService:
+ interface: org.dubbo.service.HelloService
+ registry-ids: nacos,zk
+ orderService:
+ interface: org.dubbo.service.OrderService
+ registry-ids: nacos
+ provider:
+ register: true
+ services:
\ No newline at end of file