From 5e1371218324027665682e1668ff00d7210195f3 Mon Sep 17 00:00:00 2001
From: fangyincheng <fangyincheng@sina.com>
Date: Sun, 15 Mar 2020 19:56:52 +0800
Subject: [PATCH] Imp: improve config reader

---
 common/extension/confit_reader.go             | 11 ++++++++
 config/base_config.go                         |  4 ++-
 config/config_loader.go                       | 25 +++++++++++++++++++
 config/consumer_config.go                     | 18 ++-----------
 config/provider_config.go                     | 19 +++-----------
 .../rest/config/reader/rest_config_reader.go  |  1 +
 .../reader/testdata/consumer_config.yml       |  3 +++
 .../reader/testdata/provider_config.yml       |  4 +++
 protocol/rest/rest_protocol.go                |  1 +
 9 files changed, 53 insertions(+), 33 deletions(-)

diff --git a/common/extension/confit_reader.go b/common/extension/confit_reader.go
index fe7124cf4..a3b8927ba 100644
--- a/common/extension/confit_reader.go
+++ b/common/extension/confit_reader.go
@@ -23,6 +23,7 @@ import (
 
 var (
 	configReaders = make(map[string]func() interfaces.ConfigReader)
+	defaults      = make(map[string]string)
 )
 
 // SetConfigReaders set a creator of config reader.
@@ -37,3 +38,13 @@ func GetConfigReaders(name string) interfaces.ConfigReader {
 	}
 	return configReaders[name]()
 }
+
+// SetDefaultConfitReader set {name} to default config reader for {module}
+func SetDefaultConfitReader(module, name string) {
+	defaults[module] = name
+}
+
+// GetDefaultConfitReader
+func GetDefaultConfitReader() map[string]string {
+	return defaults
+}
diff --git a/config/base_config.go b/config/base_config.go
index 787297c18..93c0ce6a6 100644
--- a/config/base_config.go
+++ b/config/base_config.go
@@ -18,6 +18,7 @@
 package config
 
 import (
+	"bytes"
 	"reflect"
 	"strconv"
 	"strings"
@@ -47,6 +48,8 @@ type BaseConfig struct {
 	fatherConfig       interface{}
 
 	MetricConfig *MetricConfig `yaml:"metrics" json:"metrics,omitempty"`
+
+	fileStream *bytes.Buffer
 }
 
 // startConfigCenter will start the config center.
@@ -361,5 +364,4 @@ func initializeStruct(t reflect.Type, v reflect.Value) {
 
 		}
 	}
-
 }
diff --git a/config/config_loader.go b/config/config_loader.go
index 14acc7bd7..8b6f43f24 100644
--- a/config/config_loader.go
+++ b/config/config_loader.go
@@ -19,6 +19,8 @@ package config
 
 import (
 	"fmt"
+	"github.com/apache/dubbo-go/common/extension"
+	perrors "github.com/pkg/errors"
 	"log"
 	"os"
 	"time"
@@ -79,6 +81,29 @@ func checkApplicationName(config *ApplicationConfig) {
 // Load Dubbo Init
 func Load() {
 
+	// init other consumer config
+	conConfigType := consumerConfig.ConfigType
+	for key, value := range extension.GetDefaultConfitReader() {
+		if v, ok := conConfigType[key]; ok {
+			value = v
+		}
+		if err := extension.GetConfigReaders(value).ReadConsumerConfig(consumerConfig.fileStream); err != nil {
+			logger.Errorf("ReadConsumerConfig error: %#v for %s", perrors.WithStack(err), value)
+		}
+	}
+
+	// init other provider config
+	proConfigType := providerConfig.ConfigType
+	for key, value := range extension.GetDefaultConfitReader() {
+		if v, ok := proConfigType[key]; ok {
+			value = v
+		}
+
+		if err := extension.GetConfigReaders(value).ReadProviderConfig(providerConfig.fileStream); err != nil {
+			logger.Errorf("ReadProviderConfig error: %#v for %s", perrors.WithStack(err), value)
+		}
+	}
+
 	// init router
 	if confRouterFile != "" {
 		if errPro := RouterInit(confRouterFile); errPro != nil {
diff --git a/config/consumer_config.go b/config/consumer_config.go
index 868aa31fd..1fa68415b 100644
--- a/config/consumer_config.go
+++ b/config/consumer_config.go
@@ -19,9 +19,6 @@ package config
 
 import (
 	"bytes"
-	"fmt"
-	"github.com/apache/dubbo-go/common/extension"
-	"strings"
 	"time"
 )
 
@@ -62,7 +59,7 @@ type ConsumerConfig struct {
 	ProtocolConf   interface{}                 `yaml:"protocol_conf" json:"protocol_conf,omitempty" property:"protocol_conf"`
 	FilterConf     interface{}                 `yaml:"filter_conf" json:"filter_conf,omitempty" property:"filter_conf" `
 	ShutdownConfig *ShutdownConfig             `yaml:"shutdown_conf" json:"shutdown_conf,omitempty" property:"shutdown_conf" `
-	ConfigType     string                      `yaml:"config_type" json:"config_type,omitempty" property:"config_type"`
+	ConfigType     map[string]string           `yaml:"config_type" json:"config_type,omitempty" property:"config_type"`
 }
 
 // UnmarshalYAML ...
@@ -97,6 +94,7 @@ func ConsumerInit(confConFile string) error {
 	if err != nil {
 		return perrors.Errorf("unmarshalYmlConfig error %v", perrors.WithStack(err))
 	}
+	consumerConfig.fileStream = bytes.NewBuffer(fileStream)
 	//set method interfaceId & interfaceName
 	for k, v := range consumerConfig.References {
 		//set id for reference
@@ -121,18 +119,6 @@ func ConsumerInit(confConFile string) error {
 	}
 	logger.Debugf("consumer config{%#v}\n", consumerConfig)
 
-	// init other consumer config
-	conConfigType := consumerConfig.ConfigType
-	if len(conConfigType) > 0 {
-		for _, t := range strings.Split(conConfigType, ",") {
-			if len(t) > 0 {
-				if err = extension.GetConfigReaders(t).ReadConsumerConfig(bytes.NewBuffer(fileStream)); err != nil {
-					return perrors.New(fmt.Sprintf("ReadConsumerConfig error: %v for %s", perrors.WithStack(err), t))
-				}
-			}
-		}
-	}
-
 	return nil
 }
 
diff --git a/config/provider_config.go b/config/provider_config.go
index 765e91393..14b77cafb 100644
--- a/config/provider_config.go
+++ b/config/provider_config.go
@@ -19,8 +19,6 @@ package config
 
 import (
 	"bytes"
-	"fmt"
-	"strings"
 )
 
 import (
@@ -30,7 +28,6 @@ import (
 
 import (
 	"github.com/apache/dubbo-go/common/constant"
-	"github.com/apache/dubbo-go/common/extension"
 	"github.com/apache/dubbo-go/common/logger"
 	"github.com/apache/dubbo-go/common/yaml"
 )
@@ -53,7 +50,7 @@ type ProviderConfig struct {
 	ProtocolConf      interface{}                `yaml:"protocol_conf" json:"protocol_conf,omitempty" property:"protocol_conf" `
 	FilterConf        interface{}                `yaml:"filter_conf" json:"filter_conf,omitempty" property:"filter_conf" `
 	ShutdownConfig    *ShutdownConfig            `yaml:"shutdown_conf" json:"shutdown_conf,omitempty" property:"shutdown_conf" `
-	ConfigType        string                     `yaml:"config_type" json:"config_type,omitempty" property:"config_type"`
+	ConfigType        map[string]string          `yaml:"config_type" json:"config_type,omitempty" property:"config_type"`
 }
 
 // UnmarshalYAML ...
@@ -88,6 +85,8 @@ func ProviderInit(confProFile string) error {
 	if err != nil {
 		return perrors.Errorf("unmarshalYmlConfig error %v", perrors.WithStack(err))
 	}
+
+	providerConfig.fileStream = bytes.NewBuffer(fileStream)
 	//set method interfaceId & interfaceName
 	for k, v := range providerConfig.Services {
 		//set id for reference
@@ -99,18 +98,6 @@ func ProviderInit(confProFile string) error {
 
 	logger.Debugf("provider config{%#v}\n", providerConfig)
 
-	// init other provider config
-	proConfigType := providerConfig.ConfigType
-	if len(proConfigType) > 0 {
-		for _, t := range strings.Split(proConfigType, ",") {
-			if len(t) > 0 {
-				if err = extension.GetConfigReaders(t).ReadProviderConfig(bytes.NewBuffer(fileStream)); err != nil {
-					return perrors.New(fmt.Sprintf("ReadProviderConfig error: %v for %s", perrors.WithStack(err), t))
-				}
-			}
-		}
-	}
-
 	return nil
 }
 
diff --git a/protocol/rest/config/reader/rest_config_reader.go b/protocol/rest/config/reader/rest_config_reader.go
index ff19e97e2..0691096bf 100644
--- a/protocol/rest/config/reader/rest_config_reader.go
+++ b/protocol/rest/config/reader/rest_config_reader.go
@@ -40,6 +40,7 @@ const REST = "rest"
 
 func init() {
 	extension.SetConfigReaders(REST, NewRestConfigReader)
+	extension.SetDefaultConfitReader(REST, REST)
 }
 
 type RestConfigReader struct {
diff --git a/protocol/rest/config/reader/testdata/consumer_config.yml b/protocol/rest/config/reader/testdata/consumer_config.yml
index 4cbb86fd5..27d7fdafe 100644
--- a/protocol/rest/config/reader/testdata/consumer_config.yml
+++ b/protocol/rest/config/reader/testdata/consumer_config.yml
@@ -2,6 +2,9 @@
 
 filter: ""
 
+config_type:
+  rest: "rest"
+
 # client
 request_timeout : "100ms"
 # connect timeout
diff --git a/protocol/rest/config/reader/testdata/provider_config.yml b/protocol/rest/config/reader/testdata/provider_config.yml
index 7ca544491..71d056e72 100644
--- a/protocol/rest/config/reader/testdata/provider_config.yml
+++ b/protocol/rest/config/reader/testdata/provider_config.yml
@@ -1,6 +1,10 @@
 # dubbo server yaml configure file
 
 filter: ""
+
+config_type:
+  rest: "rest"
+
 # application config
 application:
   organization : "ikurento.com"
diff --git a/protocol/rest/rest_protocol.go b/protocol/rest/rest_protocol.go
index 880169753..47ecb6093 100644
--- a/protocol/rest/rest_protocol.go
+++ b/protocol/rest/rest_protocol.go
@@ -33,6 +33,7 @@ import (
 	"github.com/apache/dubbo-go/protocol/rest/client"
 	_ "github.com/apache/dubbo-go/protocol/rest/client/client_impl"
 	rest_config "github.com/apache/dubbo-go/protocol/rest/config"
+	_ "github.com/apache/dubbo-go/protocol/rest/config/reader"
 	"github.com/apache/dubbo-go/protocol/rest/server"
 	_ "github.com/apache/dubbo-go/protocol/rest/server/server_impl"
 )
-- 
GitLab