add config_loader_options
diff --git a/config/base_config.go b/config/base_config.go
index 7cb25a5..e3fadda 100644
--- a/config/base_config.go
+++ b/config/base_config.go
@@ -19,6 +19,7 @@
import (
"bytes"
+ "github.com/apache/dubbo-go/common/yaml"
"reflect"
"strconv"
"strings"
@@ -52,6 +53,19 @@
fileStream *bytes.Buffer
}
+func BaseInit(confBaseFile string) error {
+ if confBaseFile == "" {
+ return perrors.Errorf("application configure(base) file name is nil")
+ }
+ baseConfig = &BaseConfig{}
+ fileStream, err := yaml.UnmarshalYMLConfig(confBaseFile, baseConfig)
+ if err != nil {
+ return perrors.Errorf("unmarshalYmlConfig error %v", perrors.WithStack(err))
+ }
+ baseConfig.fileStream = bytes.NewBuffer(fileStream)
+ return nil
+}
+
// nolint
func (c *BaseConfig) GetServiceDiscoveries(name string) (config *ServiceDiscoveryConfig, ok bool) {
config, ok = c.ServiceDiscoveries[name]
diff --git a/config/config_loader.go b/config/config_loader.go
index f907051..8eabd87 100644
--- a/config/config_loader.go
+++ b/config/config_loader.go
@@ -54,11 +54,12 @@
maxWait = 3
confRouterFile string
+ confBaseFile string
)
// loaded consumer & provider config from xxx.yml, and log config from xxx.xml
// Namely: dubbo.consumer.xml & dubbo.provider.xml in java dubbo
-func init() {
+func DefaultInit() []LoaderInitOption {
var (
confConFile string
confProFile string
@@ -83,30 +84,7 @@
if confRouterFile == "" {
confRouterFile = constant.DEFAULT_ROUTER_CONF_FILE_PATH
}
-
- if errCon := ConsumerInit(confConFile); errCon != nil {
- log.Printf("[consumerInit] %#v", errCon)
- consumerConfig = nil
- } else {
- // Check if there are some important key fields missing,
- // if so, we set a default value for it
- setDefaultValue(consumerConfig)
- // Even though baseConfig has been initialized, we override it
- // because we think read from config file is correct config
- baseConfig = &consumerConfig.BaseConfig
- }
-
- if errPro := ProviderInit(confProFile); errPro != nil {
- log.Printf("[providerInit] %#v", errPro)
- providerConfig = nil
- } else {
- // Check if there are some important key fields missing,
- // if so, we set a default value for it
- setDefaultValue(providerConfig)
- // Even though baseConfig has been initialized, we override it
- // because we think read from config file is correct config
- baseConfig = &providerConfig.BaseConfig
- }
+ return []LoaderInitOption{RouterInitOption(confRouterFile), BaseInitOption(""), ConsumerInitOption(confConFile), ProviderInitOption(confProFile)}
}
// setDefaultValue set default value for providerConfig or consumerConfig if it is null
@@ -363,24 +341,17 @@
// Load Dubbo Init
func Load() {
+ options := DefaultInit()
+ LoadWithOptions(options...)
+}
- // init router
- initRouter()
-
- // init the global event dispatcher
- extension.SetAndInitGlobalDispatcher(GetBaseConfig().EventDispatcherType)
-
- // start the metadata report if config set
- if err := startMetadataReport(GetApplicationConfig().MetadataType, GetBaseConfig().MetadataReportConfig); err != nil {
- logger.Errorf("Provider starts metadata report error, and the error is {%#v}", err)
- return
+func LoadWithOptions(options ...LoaderInitOption) {
+ for _, option := range options {
+ option.init()
}
-
- // reference config
- loadConsumerConfig()
-
- // service config
- loadProviderConfig()
+ for _, option := range options {
+ option.apply()
+ }
// init the shutdown callback
GracefulShutdownInit()
diff --git a/config/config_loader_options.go b/config/config_loader_options.go
new file mode 100644
index 0000000..dda5bec
--- /dev/null
+++ b/config/config_loader_options.go
@@ -0,0 +1,142 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package config
+
+import (
+ "github.com/apache/dubbo-go/common/extension"
+ "github.com/apache/dubbo-go/common/logger"
+ "log"
+)
+
+type LoaderInitOption interface {
+ init()
+ apply()
+}
+
+type optionFunc struct {
+ initFunc func()
+ applyFunc func()
+}
+
+func (f *optionFunc) init() {
+ f.initFunc()
+}
+
+func (f *optionFunc) apply() {
+ f.applyFunc()
+}
+
+func ConsumerInitOption(confConFile string) LoaderInitOption {
+ return consumerInitOption(confConFile, false)
+}
+
+func ConsumerMustInitOption(confConFile string) LoaderInitOption {
+ return consumerInitOption(confConFile, true)
+}
+
+func consumerInitOption(confConFile string, must bool) LoaderInitOption {
+ return &optionFunc{
+ func() {
+ if consumerConfig != nil && !must {
+ return
+ }
+ if errCon := ConsumerInit(confConFile); errCon != nil {
+ log.Printf("[consumerInit] %#v", errCon)
+ consumerConfig = nil
+ } else if confBaseFile == "" {
+ // Check if there are some important key fields missing,
+ // if so, we set a default value for it
+ setDefaultValue(consumerConfig)
+ // Even though baseConfig has been initialized, we override it
+ // because we think read from config file is correct config
+ baseConfig = &consumerConfig.BaseConfig
+ }
+ },
+ func() {
+ loadConsumerConfig()
+ },
+ }
+}
+
+func ProviderInitOption(confProFile string) LoaderInitOption {
+ return providerInitOption(confProFile, false)
+}
+
+func ProviderMustInitOption(confProFile string) LoaderInitOption {
+ return providerInitOption(confProFile, false)
+}
+
+func providerInitOption(confProFile string, must bool) LoaderInitOption {
+ return &optionFunc{
+ func() {
+ if providerConfig != nil && !must {
+ return
+ }
+ if errPro := ProviderInit(confProFile); errPro != nil {
+ log.Printf("[providerInit] %#v", errPro)
+ providerConfig = nil
+ } else if confBaseFile == "" {
+ // Check if there are some important key fields missing,
+ // if so, we set a default value for it
+ setDefaultValue(providerConfig)
+ // Even though baseConfig has been initialized, we override it
+ // because we think read from config file is correct config
+ baseConfig = &providerConfig.BaseConfig
+ }
+ },
+ func() {
+ loadProviderConfig()
+ },
+ }
+}
+
+func RouterInitOption(crf string) LoaderInitOption {
+ return &optionFunc{
+ func() {
+ confRouterFile = crf
+ },
+ func() {
+ initRouter()
+ },
+ }
+}
+
+func BaseInitOption(cbf string) LoaderInitOption {
+ return &optionFunc{
+ func() {
+ if cbf == "" {
+ return
+ }
+ confBaseFile = cbf
+ if err := BaseInit(cbf); err != nil {
+ log.Printf("[BaseInit] %#v", err)
+ baseConfig = nil
+ }
+ },
+ func() {
+ // init the global event dispatcher
+ extension.SetAndInitGlobalDispatcher(GetBaseConfig().EventDispatcherType)
+
+ // start the metadata report if config set
+ if err := startMetadataReport(GetApplicationConfig().MetadataType, GetBaseConfig().MetadataReportConfig); err != nil {
+ logger.Errorf("Provider starts metadata report error, and the error is {%#v}", err)
+ return
+ }
+ },
+ }
+}