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