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
+			}
+		},
+	}
+}