You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by la...@apache.org on 2021/09/26 10:14:34 UTC

[dubbo-go] 01/01: Fix: merge config-enhance

This is an automated email from the ASF dual-hosted git repository.

laurence pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git

commit 1397e8bba97f14b7656a5afc9bc92530bb693092
Merge: 491f156 26aa12b
Author: LaurenceLiZhixin <38...@qq.com>
AuthorDate: Sun Sep 26 18:13:39 2021 +0800

    Fix: merge config-enhance

 .gitignore                                         |    1 -
 .../cluster_impl/available_cluster_invoker_test.go |    1 +
 cluster/cluster_impl/base_cluster_invoker.go       |    1 +
 .../cluster_impl/broadcast_cluster_invoker_test.go |    1 +
 cluster/cluster_impl/failback_cluster_test.go      |    2 +
 cluster/cluster_impl/failfast_cluster_test.go      |    2 +
 cluster/cluster_impl/failover_cluster_test.go      |    1 +
 cluster/cluster_impl/failsafe_cluster_test.go      |    2 +
 cluster/cluster_impl/forking_cluster_test.go       |    1 +
 .../zone_aware_cluster_invoker_test.go             |    1 +
 cluster/router/chain/chain.go                      |    3 +-
 .../v3router/k8s_api/listener_handler_impl.go      |    2 +
 cluster/router/v3router/k8s_crd/client.go          |    3 +
 .../router/v3router/k8s_crd/listener_handler.go    |    1 +
 cluster/router/v3router/router_chain_test.go       |    1 +
 common/constant/default.go                         |    3 +-
 common/constant/env.go                             |   12 +-
 common/constant/key.go                             |   97 +-
 .../config_setter.go => common/extension/config.go |   14 +-
 common/extension/config_center_factory.go          |    4 +-
 common/extension/proxy_factory.go                  |    4 +-
 common/extension/registry.go                       |    8 +-
 common/extension/service_discovery.go              |    8 +-
 common/logger/log.yml                              |   27 -
 common/logger/logger.go                            |   76 +-
 common/logger/logger_test.go                       |  137 ---
 common/logger/logging.go                           |   10 +
 common/metadata_info.go                            |    2 +-
 common/proxy/proxy.go                              |   31 +-
 common/proxy/proxy_factory/default.go              |    9 +-
 common/proxy/proxy_test.go                         |    1 +
 common/url.go                                      |    5 +-
 common/yaml/yaml.go                                |    1 +
 config/application_config.go                       |   95 +-
 ...c_config_test.go => application_config_test.go} |   10 +-
 config/base_config.go                              |  312 ------
 config/base_config_test.go                         |  303 ------
 config/config_api.go                               |  545 ----------
 config/config_api_test.go                          |  283 +++--
 config/config_center_config.go                     |  325 ++++--
 config/config_center_config_test.go                |   75 --
 config/config_loader.go                            |  437 ++------
 config/config_loader_options.go                    |  166 +--
 config/config_loader_options_test.go               |   63 ++
 config/config_loader_test.go                       | 1115 ++++++++++----------
 config/config_setter.go                            |    4 -
 config/config_utils.go                             |   47 +
 config/consumer_config.go                          |  291 +++--
 config/dubbo_bootstrap.go                          |  110 ++
 config/{ => generic}/generic_service.go            |    8 +-
 config/graceful_shutdown.go                        |  103 +-
 config/graceful_shutdown_config.go                 |    6 +-
 config/graceful_shutdown_test.go                   |  184 ++--
 config/instance/metadata_report_test.go            |   14 +-
 config/{config_setter.go => interfaces/config.go}  |   14 +-
 config/logger_config.go                            |  155 +++
 config/logger_config_test.go                       |   72 ++
 config/metadata_report_config.go                   |  115 +-
 config/method_config.go                            |   44 +-
 config/metric_config.go                            |    4 +
 config/metric_config_test.go                       |    8 +-
 config/protocol_config.go                          |   90 +-
 ...port_config_test.go => protocol_config_test.go} |   45 +-
 config/provider_config.go                          |  145 ++-
 config/provider_config_test.go                     |   48 +-
 config/reference_config.go                         |  284 +++--
 config/reference_config_test.go                    |  777 +++++++-------
 config/registry_config.go                          |  281 +++--
 config/registry_config_test.go                     |   38 +-
 config/root_config.go                              |  280 +++++
 config/router_config.go                            |   77 +-
 config/router_config_test.go                       |   10 +-
 config/service.go                                  |   40 +-
 config/service_config.go                           |  432 ++++++--
 config/service_config_test.go                      |  215 ----
 config/service_discovery_config.go                 |    6 +-
 config/testdata/application.yaml                   |   35 +
 config/testdata/config/app/application.yaml        |   21 +
 .../testdata/config/application/application.yaml   |    4 +
 .../testdata/config/center/conf-application.yaml   |   13 +
 config/testdata/config/logger/empty_log.yaml       |   11 +
 config/testdata/config/logger/file_log.yaml        |   44 +
 config/testdata/config/logger/log.yaml             |   36 +
 config/testdata/config/protocol/application.yaml   |    7 +
 .../config/protocol/empty_application.yaml         |    7 +
 config/testdata/config/provider/application.yaml   |   17 +
 .../provider/empty_registry_application.yaml       |    8 +
 .../config/provider/registry_application.yaml      |   13 +
 config/testdata/config/registry/application.yaml   |   10 +
 .../config/registry/empty_application.yaml         |    2 +
 config/uniform_router_config.go                    |    1 +
 config_center/apollo/impl.go                       |   19 +-
 config_center/apollo/impl_test.go                  |  109 +-
 config_center/apollo/listener.go                   |    1 +
 config_center/dynamic_configuration.go             |    2 +
 config_center/file/impl.go                         |    1 +
 config_center/mock_dynamic_config.go               |    1 +
 .../cache/config/dubbo.properties@@dubbo-go@@      |    1 +
 config_center/nacos/client.go                      |    1 +
 config_center/nacos/impl.go                        |    2 +
 config_center/nacos/log/nacos-sdk.log-202109260800 |   12 +
 config_center/parser/configuration_parser.go       |    2 +
 config_center/zookeeper/impl.go                    |   13 +-
 filter/accesslog/filter_test.go                    |    1 +
 filter/active/filter_test.go                       |    1 +
 filter/auth/consumer_sign_filter_test.go           |    1 +
 filter/auth/provider_auth_filter_test.go           |    1 +
 filter/echo/filter.go                              |    1 -
 filter/generic/filter_test.go                      |    2 +
 filter/generic/generalizer/example.pb.go           |    1 +
 filter/generic/generalizer/gson.go                 |    1 +
 filter/generic/generalizer/map.go                  |    2 +
 filter/generic/generalizer/protobuf_json.go        |    2 +
 filter/generic/service_filter.go                   |    1 +
 filter/generic/service_filter_test.go              |    3 +
 filter/gshutdown/filter.go                         |    4 +-
 filter/gshutdown/filter_test.go                    |   10 +-
 filter/hystrix/filter.go                           |    8 +-
 filter/hystrix/filter_test.go                      |    2 +
 filter/metrics/filter.go                           |    8 +-
 filter/metrics/filter_test.go                      |    1 +
 filter/seata/filter.go                             |    3 +-
 filter/sentinel/filter_test.go                     |    3 +
 filter/tps/filter_test.go                          |    1 +
 filter/tps/limiter/method_service_test.go          |    1 +
 go.mod                                             |   14 +-
 go.sum                                             |  215 +++-
 imports/imports.go                                 |   45 +
 integrate_test.sh                                  |    2 +-
 .../mapping/dynamic/service_name_mapping_test.go   |   61 --
 metadata/mapping/memory/service_name_mapping.go    |    5 +-
 .../{dynamic => metadata}/service_name_mapping.go  |   42 +-
 metadata/mapping/mock_service_name_mapping.go      |    8 +-
 metadata/mapping/service_name_mapping.go           |    8 +-
 metadata/report/delegate/delegate_report.go        |    2 +
 metadata/report/delegate/delegate_report_test.go   |    1 +
 metadata/report/etcd/report.go                     |   34 +
 metadata/report/etcd/report_test.go                |   31 +
 ...est_group:service:nacos:revisiona@@test_group@@ |    1 +
 metadata/report/nacos/report.go                    |   47 +
 metadata/report/report.go                          |   10 +
 metadata/report/zookeeper/report.go                |   35 +
 metadata/service/exporter/configurable/exporter.go |   54 +-
 .../service/exporter/configurable/exporter_test.go |   93 +-
 metadata/service/remote/service_test.go            |   14 +-
 metrics/prometheus/reporter.go                     |  235 ++++-
 protocol/dubbo/dubbo_codec.go                      |    1 +
 protocol/dubbo/dubbo_invoker.go                    |    9 +-
 protocol/dubbo/dubbo_invoker_test.go               |  420 ++++----
 protocol/dubbo/dubbo_protocol.go                   |   14 +-
 protocol/dubbo/dubbo_protocol_test.go              |  265 ++---
 protocol/dubbo/hessian2/hessian_dubbo.go           |    1 +
 protocol/dubbo/hessian2/hessian_dubbo_test.go      |    1 +
 protocol/dubbo/hessian2/hessian_request.go         |    1 +
 protocol/dubbo/hessian2/hessian_request_test.go    |    1 +
 protocol/dubbo/hessian2/hessian_response.go        |    1 +
 protocol/dubbo/hessian2/hessian_response_test.go   |    1 +
 protocol/dubbo/hessian2/java_class.go              |    1 +
 protocol/dubbo/impl/codec.go                       |    1 +
 protocol/dubbo/impl/hessian.go                     |    1 +
 protocol/dubbo3/dubbo3_invoker.go                  |   25 +-
 protocol/dubbo3/dubbo3_invoker_test.go             |    2 +-
 protocol/dubbo3/dubbo3_protocol.go                 |   35 +-
 protocol/dubbo3/dubbo3_protocol_test.go            |    3 +-
 protocol/dubbo3/internal/client.go                 |   28 +-
 protocol/dubbo3/internal/helloworld.pb.go          |  127 +--
 protocol/dubbo3/internal/server.go                 |   43 +-
 protocol/grpc/client.go                            |  101 +-
 protocol/grpc/codec.go                             |    1 +
 protocol/grpc/grpc_invoker.go                      |    2 +
 protocol/grpc/grpc_invoker_test.go                 |    2 +-
 protocol/grpc/grpc_protocol_test.go                |   50 +-
 protocol/grpc/internal/helloworld/client.go        |    1 +
 protocol/grpc/internal/helloworld/helloworld.pb.go |    1 +
 protocol/grpc/internal/multiprotos/first.pb.go     |    1 +
 protocol/grpc/internal/multiprotos/second.pb.go    |    1 +
 protocol/grpc/internal/routeguide/client.go        |    1 +
 protocol/grpc/internal/routeguide/routeguide.pb.go |    1 +
 protocol/grpc/internal/routeguide/server.go        |    1 +
 protocol/grpc/server.go                            |    4 +-
 protocol/invoker.go                                |    1 +
 protocol/jsonrpc/http.go                           |    1 +
 protocol/jsonrpc/http_test.go                      |  272 ++---
 protocol/jsonrpc/jsonrpc_invoker_test.go           |  103 +-
 protocol/jsonrpc/jsonrpc_protocol.go               |   10 +-
 protocol/jsonrpc/jsonrpc_protocol_test.go          |    5 +-
 protocol/jsonrpc/server.go                         |    1 +
 protocol/rest/client/client_impl/resty_client.go   |    1 +
 protocol/rest/config/reader/rest_config_reader.go  |   11 +-
 protocol/rest/rest_invoker_test.go                 |  394 +++----
 protocol/rest/rest_protocol.go                     |   10 +-
 protocol/rest/rest_protocol_test.go                |  313 +++---
 .../rest/server/server_impl/go_restful_server.go   |    1 +
 registry/base_registry.go                          |    7 +-
 registry/directory/directory.go                    |    3 +-
 registry/directory/directory_test.go               |    6 +-
 registry/etcdv3/registry_test.go                   |   91 +-
 registry/etcdv3/service_discovery.go               |   32 +-
 registry/etcdv3/service_discovery_test.go          |  109 +-
 .../metadata_service_url_params_customizer_test.go |    1 +
 registry/file/service_discovery.go                 |    6 +-
 registry/file/service_discovery_test.go            |  146 ++-
 registry/kubernetes/registry_test.go               |   66 +-
 ...com.dubbo.user.UserProvider:1.0.0:guangzhou-idc |    1 +
 ....ikurento.user.UserProvider:1.0.0:guangzhou-idc |    1 +
 ....ikurento.user.UserProvider:2.0.0:guangzhou-idc |    1 +
 registry/nacos/listener.go                         |    2 +
 registry/nacos/log/nacos-sdk.log-202109260800      |  153 +++
 registry/nacos/registry.go                         |    6 +-
 registry/nacos/registry_test.go                    |    1 +
 registry/nacos/service_discovery.go                |   51 +-
 registry/nacos/service_discovery_test.go           |  326 +++---
 registry/protocol/protocol.go                      |   49 +-
 registry/protocol/protocol_test.go                 |   14 +-
 .../servicediscovery/service_discovery_registry.go |   35 +-
 .../service_discovery_registry_test.go             |  392 +++----
 registry/zookeeper/listener.go                     |    1 +
 registry/zookeeper/registry.go                     |    2 +
 registry/zookeeper/service_discovery.go            |   47 +-
 registry/zookeeper/service_discovery_test.go       |  281 +++++
 remoting/etcdv3/client.go                          |    1 +
 remoting/etcdv3/listener.go                        |    3 +
 remoting/etcdv3/listener_test.go                   |    2 +
 remoting/getty/config.go                           |   82 +-
 remoting/getty/getty_client.go                     |   52 +-
 remoting/getty/getty_client_test.go                |   22 +-
 remoting/getty/getty_server.go                     |   35 +-
 .../getty/getty_server_test.go                     |   24 +-
 remoting/getty/pool.go                             |    4 +-
 remoting/kubernetes/client.go                      |   20 +-
 remoting/kubernetes/registry_controller.go         |   54 +-
 remoting/nacos/builder.go                          |   19 +-
 remoting/nacos/log/nacos-sdk.log-202109260800      |    9 +
 remoting/zookeeper/client.go                       |    1 +
 .../curator_discovery/service_discovery.go         |    2 +
 remoting/zookeeper/listener.go                     |    3 +
 samples                                            |    1 -
 test/integrate/dubbo/go-client/go.sum              |  246 +----
 test/integrate/dubbo/go-server/go.sum              |  251 +----
 239 files changed, 7592 insertions(+), 6896 deletions(-)

diff --cc config/config_loader.go
index cd4f171,2886269..6a3f411
--- a/config/config_loader.go
+++ b/config/config_loader.go
@@@ -27,9 -25,12 +25,12 @@@ import 
  )
  
  import (
- 	hessian "github.com/apache/dubbo-go-hessian2"
+ 	"github.com/knadh/koanf"
+ 	"github.com/knadh/koanf/parsers/json"
+ 	"github.com/knadh/koanf/parsers/toml"
 -	"github.com/knadh/koanf/parsers/yaml"
++	yaml "github.com/knadh/koanf/parsers/yaml"
+ 	"github.com/knadh/koanf/providers/file"
+ 
  	perrors "github.com/pkg/errors"
  )
  
@@@ -37,243 -38,307 +38,60 @@@ import 
  	"dubbo.apache.org/dubbo-go/v3/common"
  	"dubbo.apache.org/dubbo-go/v3/common/constant"
  	"dubbo.apache.org/dubbo-go/v3/common/extension"
- 	"dubbo.apache.org/dubbo-go/v3/common/logger"
- 	"dubbo.apache.org/dubbo-go/v3/common/yaml"
 -	_ "dubbo.apache.org/dubbo-go/v3/common/observer/dispatcher"
  	"dubbo.apache.org/dubbo-go/v3/registry"
  )
  
  var (
- 	consumerConfig *ConsumerConfig
- 	providerConfig *ProviderConfig
- 	// baseConfig = providerConfig.BaseConfig or consumerConfig
- 	baseConfig *BaseConfig
- 	sslEnabled = false
- 
- 	// configAccessMutex is used to make sure that xxxxConfig will only be created once if needed.
- 	// it should be used combine with double-check to avoid the race condition
- 	configAccessMutex sync.Mutex
- 
- 	maxWait                         = 3
- 	confRouterFile                  string
- 	confBaseFile                    string
- 	uniformVirtualServiceConfigPath string
- 	uniformDestRuleConfigPath       string
+ 	rootConfig = GetInstance()
+ 	maxWait    = 3
  )
  
- // loaded consumer & provider config from xxx.yml, and log config from xxx.xml
- // Namely: dubbo.consumer.xml & dubbo.provider.xml in java dubbo
- func DefaultInit() []LoaderInitOption {
- 	var (
- 		confConFile string
- 		confProFile string
- 	)
- 
- 	fs := flag.NewFlagSet("config", flag.ContinueOnError)
- 	fs.StringVar(&confConFile, "conConf", os.Getenv(constant.CONF_CONSUMER_FILE_PATH), "default client config path")
- 	fs.StringVar(&confProFile, "proConf", os.Getenv(constant.CONF_PROVIDER_FILE_PATH), "default server config path")
- 	fs.StringVar(&confRouterFile, "rouConf", os.Getenv(constant.CONF_ROUTER_FILE_PATH), "default router config path")
- 	fs.StringVar(&uniformVirtualServiceConfigPath, "vsConf", os.Getenv(constant.CONF_VIRTUAL_SERVICE_FILE_PATH), "default virtual service of uniform router config path")
- 	fs.StringVar(&uniformDestRuleConfigPath, "drConf", os.Getenv(constant.CONF_DEST_RULE_FILE_PATH), "default destination rule of uniform router config path")
- 	fs.Parse(os.Args[1:])
- 	for len(fs.Args()) != 0 {
- 		fs.Parse(fs.Args()[1:])
- 	}
- 	// If user did not set the environment variables or flags,
- 	// we provide default value
- 	if confConFile == "" {
- 		confConFile = constant.DEFAULT_CONSUMER_CONF_FILE_PATH
- 	}
- 	if confProFile == "" {
- 		confProFile = constant.DEFAULT_PROVIDER_CONF_FILE_PATH
- 	}
- 	if confRouterFile == "" {
- 		confRouterFile = constant.DEFAULT_ROUTER_CONF_FILE_PATH
- 	}
- 	return []LoaderInitOption{RouterInitOption(confRouterFile), ConsumerInitOption(confConFile), ProviderInitOption(confProFile)}
- }
- 
- // setDefaultValue set default value for providerConfig or consumerConfig if it is null
- func setDefaultValue(target interface{}) {
- 	switch target.(type) {
- 	case *ProviderConfig:
- 		p := target.(*ProviderConfig)
- 		if len(p.Protocols) == 0 {
- 			p.Protocols[constant.DEFAULT_PROTOCOL] = &ProtocolConfig{
- 				Name: constant.DEFAULT_PROTOCOL,
- 				Port: strconv.Itoa(constant.DEFAULT_PORT),
- 			}
- 		}
- 		if p.ApplicationConfig == nil {
- 			p.ApplicationConfig = NewDefaultApplicationConfig()
- 		}
- 	default:
- 		c := target.(*ConsumerConfig)
- 		if c.ApplicationConfig == nil {
- 			c.ApplicationConfig = NewDefaultApplicationConfig()
- 		}
+ func Load(opts ...LoaderConfOption) error {
+ 	// conf
+ 	conf := NewLoaderConf(opts...)
+ 	koan := getKoanf(conf)
+ 	if err := koan.UnmarshalWithConf(rootConfig.Prefix(),
+ 		rootConfig, koanf.UnmarshalConf{Tag: "yaml"}); err != nil {
+ 		return err
  	}
- }
- 
- func checkRegistries(registries map[string]*RegistryConfig, singleRegistry *RegistryConfig) {
- 	if len(registries) == 0 && singleRegistry != nil {
- 		registries[constant.DEFAULT_KEY] = singleRegistry
+ 	if err := rootConfig.Init(); err != nil {
+ 		return err
  	}
+ 	rootConfig.Start()
+ 	return nil
  }
  
- func checkApplicationName(config *ApplicationConfig) {
- 	if config == nil || len(config.Name) == 0 {
- 		errMsg := "application config must not be nil, pls check your configuration"
- 		logger.Errorf(errMsg)
- 		panic(errMsg)
+ func check() error {
+ 	if rootConfig == nil {
+ 		return errors.New("execute the config.Load() method first")
  	}
+ 	return nil
  }
  
- func loadConsumerConfig() {
- 	if consumerConfig == nil {
- 		logger.Debugf("Consumer will not be launched, because consumerConfig is not specified.")
- 		return
- 	}
- 	// init other consumer config
- 	conConfigType := consumerConfig.ConfigType
- 	for key, value := range extension.GetDefaultConfigReader() {
- 		if conConfigType != nil {
- 			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)
- 		}
- 	}
- 
- 	checkApplicationName(consumerConfig.ApplicationConfig)
- 	if err := configCenterRefreshConsumer(); err != nil {
- 		logger.Errorf("[consumer config center refresh] %#v", err)
- 	}
- 
- 	// 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
- 	}
- 
- 	checkRegistries(consumerConfig.Registries, consumerConfig.Registry)
- 	for key, ref := range consumerConfig.References {
- 		if ref.Generic != "" {
- 			genericService := NewGenericService(key)
- 			SetConsumerService(genericService)
- 		}
- 		rpcService := GetConsumerService(key)
- 		if rpcService == nil {
- 			logger.Warnf("%s does not exist!", key)
- 			continue
- 		}
- 		ref.id = key
- 		ref.Refer(rpcService)
- 		ref.Implement(rpcService)
- 	}
- 
- 	// Write current configuration to cache file.
- 	if consumerConfig.CacheFile != "" {
- 		if data, err := yaml.MarshalYML(consumerConfig); err != nil {
- 			logger.Errorf("Marshal consumer config err: %s", err.Error())
- 		} else {
- 			if err := ioutil.WriteFile(consumerConfig.CacheFile, data, 0666); err != nil {
- 				logger.Errorf("Write consumer config cache file err: %s", err.Error())
- 			}
- 		}
- 	}
- 
- 	// wait for invoker is available, if wait over default 3s, then panic
- 	var count int
- 	for {
- 		checkok := true
- 		for _, refconfig := range consumerConfig.References {
- 			if (refconfig.Check != nil && *refconfig.Check) ||
- 				(refconfig.Check == nil && consumerConfig.Check != nil && *consumerConfig.Check) ||
- 				(refconfig.Check == nil && consumerConfig.Check == nil) { // default to true
- 
- 				if refconfig.invoker != nil && !refconfig.invoker.IsAvailable() {
- 					checkok = false
- 					count++
- 					if count > maxWait {
- 						errMsg := fmt.Sprintf("Failed to check the status of the service %v. No provider available for the service to the consumer use dubbo version %v", refconfig.InterfaceName, constant.Version)
- 						logger.Error(errMsg)
- 						panic(errMsg)
- 					}
- 					time.Sleep(time.Second * 1)
- 					break
- 				}
- 				if refconfig.invoker == nil {
- 					logger.Warnf("The interface %s invoker not exist, may you should check your interface config.", refconfig.InterfaceName)
- 				}
- 			}
- 		}
- 		if checkok {
- 			break
- 		}
- 	}
- }
- 
- func loadProviderConfig() {
- 	if providerConfig == nil {
- 		logger.Debugf("Provider will not be launched, because providerConfig is not specified.")
- 		return
- 	}
- 
- 	// init other provider config
- 	proConfigType := providerConfig.ConfigType
- 	for key, value := range extension.GetDefaultConfigReader() {
- 		if proConfigType != nil {
- 			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)
- 		}
- 	}
- 
- 	checkApplicationName(providerConfig.ApplicationConfig)
- 	if err := configCenterRefreshProvider(); err != nil {
- 		logger.Errorf("[provider config center refresh] %#v", err)
- 	}
- 
- 	// 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
- 	}
- 
- 	checkRegistries(providerConfig.Registries, providerConfig.Registry)
- 
- 	// Write the current configuration to cache file.
- 	if providerConfig.CacheFile != "" {
- 		if data, err := yaml.MarshalYML(providerConfig); err != nil {
- 			logger.Errorf("Marshal provider config err: %s", err.Error())
- 		} else {
- 			if err := ioutil.WriteFile(providerConfig.CacheFile, data, 0666); err != nil {
- 				logger.Errorf("Write provider config cache file err: %s", err.Error())
- 			}
- 		}
+ func getKoanf(conf *loaderConf) *koanf.Koanf {
+ 	var (
+ 		k   *koanf.Koanf
+ 		err error
+ 	)
+ 	k = koanf.New(conf.delim)
+ 
+ 	switch conf.genre {
+ 	case "yaml", "yml":
+ 		err = k.Load(file.Provider(conf.path), yaml.Parser())
+ 	case "json":
+ 		err = k.Load(file.Provider(conf.path), json.Parser())
+ 	case "toml":
+ 		err = k.Load(file.Provider(conf.path), toml.Parser())
+ 	default:
+ 		err = errors.New(fmt.Sprintf("Unsupported %s file type", conf.genre))
  	}
  
- 	for key, svs := range providerConfig.Services {
- 		rpcService := GetProviderService(key)
- 		if rpcService == nil {
- 			logger.Warnf("%s does not exist!", key)
- 			continue
- 		}
- 		svs.id = key
- 		svs.Implement(rpcService)
- 		svs.Protocols = providerConfig.Protocols
- 		if err := svs.Export(); err != nil {
- 			panic(fmt.Sprintf("service %s export failed! err: %#v", key, err))
- 		}
+ 	if err != nil {
+ 		panic(err)
  	}
- 	registerServiceInstance()
+ 	return k
  }
  
 -//
 -//func GetConfigCenterConfig() (*center.ConfigCenterConfig, error) {
 -//	if err := check(); err != nil {
 -//		return nil, err
 -//	}
 -//	if configCenterConfig != nil {
 -//		return configCenterConfig, nil
 -//	}
 -//	conf := center.GetConfigCenterConfig(rootConfig.ConfigCenter, rootConfig.Koanf)
 -//
 -//	if err := conf.SetDefault(); err != nil {
 -//		return nil, err
 -//	}
 -//	conf.TranslateConfigAddress()
 -//	if err := conf.Validate(rootConfig.Validate); err != nil {
 -//		return nil, err
 -//	}
 -//	configCenterConfig = conf
 -//	return conf, nil
 -//}
 -//
 -//// loaded consumer & provider config from xxx.yml, and log config from xxx.xml
 -//// Namely: dubbo.consumer.xml & dubbo.provider.xml in java dubbo
 -//func DefaultInit() []LoaderInitOption {
 -//	var (
 -//		confConFile string
 -//		confProFile string
 -//	)
 -//
 -//	fs := flag.NewFlagSet("config", flag.ContinueOnError)
 -//	fs.StringVar(&confConFile, "conConf", os.Getenv(constant.CONF_CONSUMER_FILE_PATH), "default client config path")
 -//	fs.StringVar(&confProFile, "proConf", os.Getenv(constant.CONF_PROVIDER_FILE_PATH), "default server config path")
 -//	fs.StringVar(&confRouterFile, "rouConf", os.Getenv(constant.CONF_ROUTER_FILE_PATH), "default router config path")
 -//	fs.StringVar(&uniformVirtualServiceConfigPath, "vsConf", os.Getenv(constant.CONF_VIRTUAL_SERVICE_FILE_PATH), "default virtual service of uniform router config path")
 -//	fs.StringVar(&uniformDestRuleConfigPath, "drConf", os.Getenv(constant.CONF_DEST_RULE_FILE_PATH), "default destination rule of uniform router config path")
 -//	fs.Parse(os.Args[1:])
 -//	for len(fs.Args()) != 0 {
 -//		fs.Parse(fs.Args()[1:])
 -//	}
 -//	// If user did not set the environment variables or flags,
 -//	// we provide default value
 -//	if confConFile == "" {
 -//		confConFile = constant.DEFAULT_CONSUMER_CONF_FILE_PATH
 -//	}
 -//	if confProFile == "" {
 -//		confProFile = constant.DEFAULT_PROVIDER_CONF_FILE_PATH
 -//	}
 -//	if confRouterFile == "" {
 -//		confRouterFile = constant.DEFAULT_ROUTER_CONF_FILE_PATH
 -//	}
 -//	return []LoaderInitOption{RouterInitOption(confRouterFile), BaseInitOption(""), ConsumerInitOption(confConFile), ProviderInitOption(confProFile)}
 -//}
 -//
 -//// setDefaultValue set default value for providerConfig or consumerConfig if it is null
 -//func setDefaultValue(target interface{}) {
 -//	registryConfig := &registry2.RegistryConfig{
 -//		Protocol:   constant.DEFAULT_REGISTRY_ZK_PROTOCOL,
 -//		TimeoutStr: constant.DEFAULT_REGISTRY_ZK_TIMEOUT,
 -//		Address:    constant.DEFAULT_REGISTRY_ZK_ADDRESS,
 -//	}
 -//	switch target.(type) {
 -//	case *provider.ProviderConfig:
 -//		p := target.(*provider.ProviderConfig)
 -//		if len(p.Registries) == 0 && p.Registry == nil {
 -//			p.Registries[constant.DEFAULT_REGISTRY_ZK_ID] = registryConfig
 -//		}
 -//		if len(p.Protocols) == 0 {
 -//			p.Protocols[constant.DEFAULT_PROTOCOL] = &protocol.ProtocolConfig{
 -//				Name: constant.DEFAULT_PROTOCOL,
 -//				Port: strconv.Itoa(constant.DEFAULT_PORT),
 -//			}
 -//		}
 -//		if p.ApplicationConfig == nil {
 -//			p.ApplicationConfig = NewDefaultApplicationConfig()
 -//		}
 -//	default:
 -//		c := target.(*consumer.ShutdownConfig)
 -//		if len(c.Registries) == 0 && c.Registry == nil {
 -//			c.Registries[constant.DEFAULT_REGISTRY_ZK_ID] = registryConfig
 -//		}
 -//		if c.ApplicationConfig == nil {
 -//			c.ApplicationConfig = NewDefaultApplicationConfig()
 -//		}
 -//	}
 -//}
 -//
 -//func checkRegistries(registriesConfig map[string]*registry2.RegistryConfig, singleRegistry *registry2.RegistryConfig) {
 -//	if len(registriesConfig) == 0 && singleRegistry != nil {
 -//		registriesConfig[constant.DEFAULT_KEY] = singleRegistry
 -//	}
 -//}
 -//
 -//func checkApplicationName(config *applicationConfig.ShutdownConfig) {
 -//	if config == nil || len(config.Name) == 0 {
 -//		errMsg := "applicationConfig config must not be nil, pls check your configuration"
 -//		logger.Errorf(errMsg)
 -//		panic(errMsg)
 -//	}
 -//}
 -//
 -//func loadConsumerConfig() {
 -//	if consumerConfig == nil {
 -//		logger.Warnf("consumerConfig is nil!")
 -//		return
 -//	}
 -//	// init other consumer config
 -//	conConfigType := consumerConfig.ConfigType
 -//	for key, value := range extension.GetDefaultConfigReader() {
 -//		if conConfigType != nil {
 -//			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)
 -//		}
 -//	}
 -//
 -//	checkApplicationName(consumerConfig.ApplicationConfig)
 -//	if err := consumer.configCenterRefreshConsumer(); err != nil {
 -//		logger.Errorf("[consumer config center refresh] %#v", err)
 -//	}
 -//
 -//	// start the metadata report if config set
 -//	if err := report.startMetadataReport(GetApplicationConfig().MetadataType, GetBaseConfig().MetadataReportConfig); err != nil {
 -//		logger.Errorf("Provider starts metadata report error, and the error is {%#v}", err)
 -//		return
 -//	}
 -//
 -//	checkRegistries(consumerConfig.Registries, consumerConfig.Registry)
 -//	for key, ref := range consumerConfig.References {
 -//		if ref.Generic {
 -//			genericService := generic.NewGenericService(key)
 -//			instance.SetConsumerService(genericService)
 -//		}
 -//		rpcService := instance.GetConsumerService(key)
 -//		if rpcService == nil {
 -//			logger.Warnf("%s does not exist!", key)
 -//			continue
 -//		}
 -//		ref.id = key
 -//		ref.Refer(rpcService)
 -//		ref.Implement(rpcService)
 -//	}
 -//
 -//	// Write current configuration to cache file.
 -//	if consumerConfig.CacheFile != "" {
 -//		if data, err := yaml.MarshalYML(consumerConfig); err != nil {
 -//			logger.Errorf("Marshal consumer config err: %s", err.Error())
 -//		} else {
 -//			if err := ioutil.WriteFile(consumerConfig.CacheFile, data, 0666); err != nil {
 -//				logger.Errorf("Write consumer config cache file err: %s", err.Error())
 -//			}
 -//		}
 -//	}
 -//
 -//	// wait for invoker is available, if wait over default 3s, then panic
 -//	var count int
 -//	for {
 -//		checkok := true
 -//		for _, refconfig := range consumerConfig.References {
 -//			if (refconfig.Check != nil && *refconfig.Check) ||
 -//				(refconfig.Check == nil && consumerConfig.Check != nil && *consumerConfig.Check) ||
 -//				(refconfig.Check == nil && consumerConfig.Check == nil) { // default to true
 -//
 -//				if refconfig.invoker != nil && !refconfig.invoker.IsAvailable() {
 -//					checkok = false
 -//					count++
 -//					if count > maxWait {
 -//						errMsg := fmt.Sprintf("Failed to check the status of the service %v. No provider available for the service to the consumer use dubbo version %v", refconfig.InterfaceName, constant.Version)
 -//						logger.Error(errMsg)
 -//						panic(errMsg)
 -//					}
 -//					time.Sleep(time.Second * 1)
 -//					break
 -//				}
 -//				if refconfig.invoker == nil {
 -//					logger.Warnf("The interface %s invoker not exist, may you should check your interface config.", refconfig.InterfaceName)
 -//				}
 -//			}
 -//		}
 -//		if checkok {
 -//			break
 -//		}
 -//	}
 -//}
 -//
 -//func loadProviderConfig() {
 -//	if providerConfig == nil {
 -//		logger.Warnf("providerConfig is nil!")
 -//		return
 -//	}
 -//
 -//	// init other provider config
 -//	proConfigType := providerConfig.ConfigType
 -//	for key, value := range extension.GetDefaultConfigReader() {
 -//		if proConfigType != nil {
 -//			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)
 -//		}
 -//	}
 -//
 -//	checkApplicationName(providerConfig.ApplicationConfig)
 -//	if err := provider.configCenterRefreshProvider(); err != nil {
 -//		logger.Errorf("[provider config center refresh] %#v", err)
 -//	}
 -//
 -//	// start the metadata report if config set
 -//	if err := report.startMetadataReport(GetApplicationConfig().MetadataType, GetBaseConfig().MetadataReportConfig); err != nil {
 -//		logger.Errorf("Provider starts metadata report error, and the error is {%#v}", err)
 -//		return
 -//	}
 -//
 -//	checkRegistries(providerConfig.Registries, providerConfig.Registry)
 -//
 -//	// Write the current configuration to cache file.
 -//	if providerConfig.CacheFile != "" {
 -//		if data, err := yaml.MarshalYML(providerConfig); err != nil {
 -//			logger.Errorf("Marshal provider config err: %s", err.Error())
 -//		} else {
 -//			if err := ioutil.WriteFile(providerConfig.CacheFile, data, 0666); err != nil {
 -//				logger.Errorf("Write provider config cache file err: %s", err.Error())
 -//			}
 -//		}
 -//	}
 -//
 -//	for key, svs := range providerConfig.Services {
 -//		rpcService := instance.GetProviderService(key)
 -//		if rpcService == nil {
 -//			logger.Warnf("%s does not exist!", key)
 -//			continue
 -//		}
 -//		svs.id = key
 -//		svs.Implement(rpcService)
 -//		svs.Protocols = providerConfig.Protocols
 -//		if err := svs.Export(); err != nil {
 -//			panic(fmt.Sprintf("service %s export failed! err: %#v", key, err))
 -//		}
 -//	}
 -//	registerServiceInstance()
 -//}
 -//
  // registerServiceInstance register service instance
  func registerServiceInstance() {
  	url := selectMetadataServiceExportedURL()
@@@ -332,76 -408,45 +161,18 @@@ func createInstance(url *common.URL) (r
  		Enable:      true,
  		Healthy:     true,
  		Metadata:    metadata,
 -	}, nil
 -}
 +	}
  
 -//func initRouter() {
 -//	if uniformDestRuleConfigPath != "" && uniformVirtualServiceConfigPath != "" {
 -//		if err := router.RouterInit(uniformVirtualServiceConfigPath, uniformDestRuleConfigPath); err != nil {
 -//			logger.Warnf("[routerConfig init] %#v", err)
 -//		}
 -//	}
 -//}
 -//
 -//// Load Dubbo Init
 -//func Load() {
 -//	options := DefaultInit()
 -//	LoadWithOptions(options...)
 -//}
 -//
 -//func LoadWithOptions(options ...LoaderInitOption) {
 -//	// register metadata info and service info
 -//	hessian.RegisterPOJO(&common.MetadataInfo{})
 -//	hessian.RegisterPOJO(&common.ServiceInfo{})
 -//	hessian.RegisterPOJO(&common.URL{})
 -//
 -//	for _, option := range options {
 -//		option.init()
 -//	}
 -//	for _, option := range options {
 -//		option.apply()
 -//	}
 -//	// init router
 -//	initRouter()
 -//
 -//	// init the shutdown callback
 -//	shutdown.GracefulShutdownInit()
 -//}
 +	for _, cus := range extension.GetCustomizers() {
 +		cus.Customize(instance)
 +	}
 +
 +	return instance, nil
 +}
  
- // selectMetadataServiceExportedURL get already be exported url
- func selectMetadataServiceExportedURL() *common.URL {
- 	var selectedUrl *common.URL
- 	metaDataService, err := extension.GetLocalMetadataService("")
- 	if err != nil {
- 		logger.Warn(err)
- 		return nil
- 	}
- 	urlList, err := metaDataService.GetExportedURLs(constant.ANY_VALUE, constant.ANY_VALUE, constant.ANY_VALUE, constant.ANY_VALUE)
- 	if err != nil {
- 		panic(err)
- 	}
- 	if len(urlList) == 0 {
- 		return nil
- 	}
- 	for _, url := range urlList {
- 		selectedUrl = url
- 		// rest first
- 		if url.Protocol == "rest" {
- 			break
- 		}
- 	}
- 	return selectedUrl
- }
- 
- func initRouter() {
- 	if uniformDestRuleConfigPath != "" && uniformVirtualServiceConfigPath != "" {
- 		if err := RouterInit(uniformVirtualServiceConfigPath, uniformDestRuleConfigPath); err != nil {
- 			logger.Warnf("[routerConfig init] %#v", err)
- 		}
- 	}
- }
- 
- // Load Dubbo Init
- func Load() {
- 	options := DefaultInit()
- 	LoadWithOptions(options...)
- }
- 
- func LoadWithOptions(options ...LoaderInitOption) {
- 	// register metadata info and service info
- 	hessian.RegisterPOJO(&common.MetadataInfo{})
- 	hessian.RegisterPOJO(&common.ServiceInfo{})
- 	hessian.RegisterPOJO(&common.URL{})
- 
- 	for _, option := range options {
- 		option.init()
- 	}
- 	for _, option := range options {
- 		option.apply()
- 	}
- 	// init router
- 	initRouter()
- 
- 	// init the shutdown callback
- 	GracefulShutdownInit()
- }
- 
  // GetRPCService get rpc service for consumer
  func GetRPCService(name string) common.RPCService {
- 	return consumerConfig.References[name].GetRPCService()
+ 	return rootConfig.Consumer.References[name].GetRPCService()
  }
  
  // RPCService create rpc service for consumer
@@@ -416,83 -461,75 +187,23 @@@ func RPCService(service common.RPCServi
  // In general, it will be locked 0 or 1 time.
  // So you don't need to worry about the race condition
  func GetMetricConfig() *MetricConfig {
- 	if GetBaseConfig().MetricConfig == nil {
- 		configAccessMutex.Lock()
- 		defer configAccessMutex.Unlock()
- 		if GetBaseConfig().MetricConfig == nil {
- 			GetBaseConfig().MetricConfig = &MetricConfig{}
- 		}
- 	}
- 	return GetBaseConfig().MetricConfig
- }
- 
- // GetApplicationConfig find the application config
- // if not, we will create one
- // Usually applicationConfig will be initialized when system start
- // we use double-check to reduce race condition
- // In general, it will be locked 0 or 1 time.
- // So you don't need to worry about the race condition
- func GetApplicationConfig() *ApplicationConfig {
- 	if GetBaseConfig().ApplicationConfig == nil {
- 		configAccessMutex.Lock()
- 		defer configAccessMutex.Unlock()
- 		if GetBaseConfig().ApplicationConfig == nil {
- 			GetBaseConfig().ApplicationConfig = &ApplicationConfig{}
- 		}
- 	}
- 	return GetBaseConfig().ApplicationConfig
- }
- 
- // GetProviderConfig find the provider config
- // if not found, create new one
- func GetProviderConfig() ProviderConfig {
- 	if providerConfig == nil {
- 		if providerConfig == nil {
- 			return ProviderConfig{}
- 		}
- 	}
- 	return *providerConfig
- }
- 
- // GetConsumerConfig find the consumer config
- // if not found, create new one
- // we use double-check to reduce race condition
- // In general, it will be locked 0 or 1 time.
- // So you don't need to worry about the race condition
- func GetConsumerConfig() ConsumerConfig {
- 	if consumerConfig == nil {
- 		if consumerConfig == nil {
- 			return ConsumerConfig{}
- 		}
- 	}
- 	return *consumerConfig
- }
- 
- func GetBaseConfig() *BaseConfig {
- 	if baseConfig == nil {
- 		configAccessMutex.Lock()
- 		defer configAccessMutex.Unlock()
- 		if baseConfig == nil {
- 			baseConfig = &BaseConfig{
- 				MetricConfig:       &MetricConfig{},
- 				ConfigCenterConfig: &ConfigCenterConfig{},
- 				Remotes:            make(map[string]*RemoteConfig),
- 				ApplicationConfig:  &ApplicationConfig{},
- 				ServiceDiscoveries: make(map[string]*ServiceDiscoveryConfig),
- 			}
- 		}
- 	}
- 	return baseConfig
- }
- 
- func GetSslEnabled() bool {
- 	return sslEnabled
+ 	// todo
+ 	//if GetBaseConfig().MetricConfig == nil {
+ 	//	configAccessMutex.Lock()
+ 	//	defer configAccessMutex.Unlock()
+ 	//	if GetBaseConfig().MetricConfig == nil {
+ 	//		GetBaseConfig().MetricConfig = &metric.MetricConfig{}
+ 	//	}
+ 	//}
+ 	//return GetBaseConfig().MetricConfig
+ 	return rootConfig.MetricConfig
  }
  
- func SetSslEnabled(enabled bool) {
- 	sslEnabled = enabled
+ func GetMetadataReportConfg() *MetadataReportConfig {
+ 	return rootConfig.MetadataReportConfig
  }
  
 -// GetApplicationConfig find the applicationConfig config
 -// if not, we will create one
 -// Usually applicationConfig will be initialized when system start
 -// we use double-check to reduce race condition
 -// In general, it will be locked 0 or 1 time.
 -// So you don't need to worry about the race condition
 -//func GetApplicationConfig() *ShutdownConfig {
 -//	// todo
 -//	//if GetBaseConfig().ApplicationConfig == nil {
 -//	//	configAccessMutex.Lock()
 -//	//	defer configAccessMutex.Unlock()
 -//	//	if GetBaseConfig().ApplicationConfig == nil {
 -//	//		GetBaseConfig().ApplicationConfig = &applicationConfig.ShutdownConfig{}
 -//	//	}
 -//	//}
 -//	//return GetBaseConfig().ApplicationConfig
 -//	return rootConfig.
 -//}
 -
 -// GetProviderConfig find the provider config
 -// if not found, create new one
 -//func GetProviderConfig() provider.ProviderConfig {
 -//	if providerConfig == nil {
 -//		if providerConfig == nil {
 -//			return provider.ProviderConfig{}
 -//		}
 -//	}
 -//	return *providerConfig
 -//}
 -
 -// GetConsumerConfig find the consumer config
 -// if not found, create new one
 -// we use double-check to reduce race condition
 -// In general, it will be locked 0 or 1 time.
 -// So you don't need to worry about the race condition
 -//func GetConsumerConfig() consumer.ShutdownConfig {
 -//	if consumerConfig == nil {
 -//		if consumerConfig == nil {
 -//			return consumer.ShutdownConfig{}
 -//		}
 -//	}
 -//	return *consumerConfig
 -//}
 -
 -//func GetSslEnabled() bool {
 -//	return sslEnabled
 -//}
 -//
 -//func SetSslEnabled(enabled bool) {
 -//	sslEnabled = enabled
 -//}
 -
  func IsProvider() bool {
- 	return providerConfig != nil
+ 	// FixME
+ 	return rootConfig.Provider != nil
  }
diff --cc config/config_loader_options.go
index f519bec,6578394..8179905
--- a/config/config_loader_options.go
+++ b/config/config_loader_options.go
@@@ -17,99 -17,245 +17,121 @@@
  package config
  
  import (
- 	"log"
+ 	"fmt"
+ 	"os"
+ 	"path/filepath"
+ 	"runtime"
+ 	"sort"
+ 	"strings"
  )
  
- type LoaderInitOption interface {
- 	init()
- 	apply()
- }
+ import (
+ 	"github.com/pkg/errors"
+ )
  
- type optionFunc struct {
- 	initFunc  func()
- 	applyFunc func()
+ import (
+ 	"dubbo.apache.org/dubbo-go/v3/common/constant"
+ )
+ 
+ type loaderConf struct {
+ 	// loaderConf file type default yaml
+ 	genre string
+ 	// loaderConf file path default ./conf
+ 	path string
+ 	// loaderConf file delim default .
+ 	delim string
  }
  
- func (f *optionFunc) init() {
- 	f.initFunc()
+ func NewLoaderConf(opts ...LoaderConfOption) *loaderConf {
+ 	configFilePath := "../conf/dubbogo.yaml"
+ 	if configFilePathFromEnv := os.Getenv(constant.CONFIG_FILE_ENV_KEY); configFilePathFromEnv != "" {
+ 		configFilePath = configFilePathFromEnv
+ 	}
+ 
+ 	conf := &loaderConf{
+ 		genre: "yaml",
+ 		path:  configFilePath,
+ 		delim: ".",
+ 	}
+ 
+ 	for _, opt := range opts {
+ 		opt.apply(conf)
+ 	}
+ 	return conf
  }
  
- func (f *optionFunc) apply() {
- 	f.applyFunc()
+ type LoaderConfOption interface {
+ 	apply(vc *loaderConf)
  }
  
- func ConsumerInitOption(confConFile string) LoaderInitOption {
- 	return consumerInitOption(confConFile, false)
+ type loaderConfigFunc func(*loaderConf)
+ 
+ func (fn loaderConfigFunc) apply(vc *loaderConf) {
+ 	fn(vc)
  }
  
- func ConsumerMustInitOption(confConFile string) LoaderInitOption {
- 	return consumerInitOption(confConFile, true)
+ // WithGenre set loaderConf Genre
+ func WithGenre(genre string) LoaderConfOption {
+ 	return loaderConfigFunc(func(conf *loaderConf) {
+ 		g := strings.ToLower(genre)
+ 		if err := checkGenre(g); err != nil {
+ 			panic(err)
+ 		}
+ 		conf.genre = g
+ 	})
  }
  
- 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()
- 		},
- 	}
+ // WithPath set loaderConf path
+ func WithPath(path string) LoaderConfOption {
+ 	return loaderConfigFunc(func(conf *loaderConf) {
+ 		conf.path = absolutePath(path)
+ 	})
  }
  
- func ProviderInitOption(confProFile string) LoaderInitOption {
- 	return providerInitOption(confProFile, false)
+ func WithDelim(delim string) LoaderConfOption {
+ 	return loaderConfigFunc(func(conf *loaderConf) {
+ 		conf.delim = delim
+ 	})
  }
  
- func ProviderMustInitOption(confProFile string) LoaderInitOption {
- 	return providerInitOption(confProFile, true)
+ // absolutePath get absolut path
+ func absolutePath(inPath string) string {
+ 
+ 	if inPath == "$HOME" || strings.HasPrefix(inPath, "$HOME"+string(os.PathSeparator)) {
+ 		inPath = userHomeDir() + inPath[5:]
+ 	}
+ 
+ 	if filepath.IsAbs(inPath) {
+ 		return filepath.Clean(inPath)
+ 	}
+ 
+ 	p, err := filepath.Abs(inPath)
+ 	if err == nil {
+ 		return filepath.Clean(p)
+ 	}
+ 
+ 	return ""
  }
  
- 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()
- 		},
+ //userHomeDir get gopath
+ func userHomeDir() string {
+ 	if runtime.GOOS == "windows" {
+ 		home := os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH")
+ 		if home == "" {
+ 			home = os.Getenv("USERPROFILE")
+ 		}
+ 		return home
  	}
+ 	return os.Getenv("HOME")
  }
  
- func RouterInitOption(crf string) LoaderInitOption {
- 	return &optionFunc{
- 		func() {
- 			confRouterFile = crf
- 		},
- 		func() {
- 			initRouter()
- 		},
+ // checkGenre check Genre
+ func checkGenre(genre string) error {
+ 	genres := []string{"json", "toml", "yaml", "yml"}
+ 	sort.Strings(genres)
+ 	idx := sort.SearchStrings(genres, genre)
+ 	if genres[idx] != genre {
+ 		return errors.New(fmt.Sprintf("no support %s", genre))
  	}
+ 	return nil
  }
 -
 -//
 -//import (
 -//	"dubbo.apache.org/dubbo-go/v3/loaderConf/base"
 -//	"dubbo.apache.org/dubbo-go/v3/loaderConf/consumer"
 -//	"dubbo.apache.org/dubbo-go/v3/loaderConf/provider"
 -//	"log"
 -//)
 -//
 -//import (
 -//	"dubbo.apache.org/dubbo-go/v3/common/extension"
 -//)
 -//
 -//type LoaderInitOption interface {
 -//	init()
 -//	apply()
 -//}
 -//
 -//type loaderConfigFunc struct {
 -//	initFunc  func()
 -//	applyFunc func()
 -//}
 -//
 -//func (f *loaderConfigFunc) init() {
 -//	f.initFunc()
 -//}
 -//
 -//func (f *loaderConfigFunc) 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 &loaderConfigFunc{
 -//		func() {
 -//			if consumerConfig != nil && !must {
 -//				return
 -//			}
 -//			if errCon := consumer.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 loaderConf file is correct loaderConf
 -//				baseConfig = &consumerConfig.BaseConfig
 -//			}
 -//		},
 -//		func() {
 -//			loadConsumerConfig()
 -//		},
 -//	}
 -//}
 -//
 -//func ProviderInitOption(confProFile string) LoaderInitOption {
 -//	return providerInitOption(confProFile, false)
 -//}
 -//
 -//func ProviderMustInitOption(confProFile string) LoaderInitOption {
 -//	return providerInitOption(confProFile, true)
 -//}
 -//
 -//func providerInitOption(confProFile string, must bool) LoaderInitOption {
 -//	return &loaderConfigFunc{
 -//		func() {
 -//			if providerConfig != nil && !must {
 -//				return
 -//			}
 -//			if errPro := provider.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 loaderConf file is correct loaderConf
 -//				baseConfig = &providerConfig.BaseConfig
 -//			}
 -//		},
 -//		func() {
 -//			loadProviderConfig()
 -//		},
 -//	}
 -//}
 -//
 -//func RouterInitOption(crf string) LoaderInitOption {
 -//	return &loaderConfigFunc{
 -//		func() {
 -//			confRouterFile = crf
 -//		},
 -//		func() {
 -//			initRouter()
 -//		},
 -//	}
 -//}
 -//
 -//func BaseInitOption(cbf string) LoaderInitOption {
 -//	return &loaderConfigFunc{
 -//		func() {
 -//			if cbf == "" {
 -//				return
 -//			}
 -//			confBaseFile = cbf
 -//			if err := base.BaseInit(cbf); err != nil {
 -//				log.Printf("[BaseInit] %#v", err)
 -//				baseConfig = nil
 -//			}
 -//		},
 -//		func() {
 -//			// init the global event dispatcher
 -//			extension.SetAndInitGlobalDispatcher(GetBaseConfig().EventDispatcherType)
 -//		},
 -//	}
 -//}
diff --cc config/dubbo_bootstrap.go
index 0000000,c509287..6793e26
mode 000000,100644..100644
--- a/config/dubbo_bootstrap.go
+++ b/config/dubbo_bootstrap.go
@@@ -1,0 -1,112 +1,110 @@@
+ /*
+  * 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 (
+ 	"sync"
+ )
+ 
+ import (
+ 	hessian "github.com/apache/dubbo-go-hessian2"
+ )
+ 
+ import (
+ 	"dubbo.apache.org/dubbo-go/v3/common"
 -	"dubbo.apache.org/dubbo-go/v3/common/extension"
+ 	"dubbo.apache.org/dubbo-go/v3/common/logger"
+ )
+ 
+ var (
+ 	startOnce sync.Once
+ )
+ 
+ func GetInstance(opts ...RootConfigOpt) *RootConfig {
+ 	registerPOJO()
+ 	rc := &RootConfig{
+ 		ConfigCenter:         GetConfigCenterInstance(),
+ 		ServiceDiscoveries:   make(map[string]*ServiceDiscoveryConfig),
+ 		MetadataReportConfig: &MetadataReportConfig{},
+ 		Application:          GetApplicationInstance(),
+ 		Registries:           make(map[string]*RegistryConfig),
+ 		Protocols:            GetProtocolsInstance(),
+ 		Provider:             GetProviderInstance(),
+ 		Consumer:             GetConsumerInstance(),
+ 		MetricConfig:         &MetricConfig{},
+ 		Logger:               GetLoggerConfigInstance(),
+ 	}
+ 	for _, opt := range opts {
+ 		opt(rc)
+ 	}
+ 	return rc
+ }
+ 
+ func registerPOJO() {
+ 	hessian.RegisterPOJO(&common.MetadataInfo{})
+ 	hessian.RegisterPOJO(&common.ServiceInfo{})
+ 	hessian.RegisterPOJO(&common.URL{})
+ }
+ 
+ func (rc *RootConfig) Init() error {
+ 
+ 	if err := rc.Logger.Init(); err != nil {
+ 		return err
+ 	}
+ 	if err := rc.ConfigCenter.Init(rc); err != nil {
+ 		logger.Warnf("config center doesn't start. error is %s", err)
+ 	}
+ 	if err := rc.Application.Init(); err != nil {
+ 		return err
+ 	}
+ 	if err := initProtocolsConfig(rc); err != nil {
+ 		return err
+ 	}
+ 	if err := initRegistryConfig(rc); err != nil {
+ 		return err
+ 	}
+ 	if err := initServiceDiscoveryConfig(rc); err != nil {
+ 		return err
+ 	}
+ 	if err := rc.MetadataReportConfig.Init(rc); err != nil {
+ 		return err
+ 	}
+ 	if err := initMetricConfig(rc); err != nil {
+ 		return err
+ 	}
+ 	if err := initRouterConfig(rc); err != nil {
+ 		return err
+ 	}
+ 	// provider、consumer must last init
+ 	if err := rc.Provider.Init(rc); err != nil {
+ 		return err
+ 	}
+ 	if err := rc.Consumer.Init(rc); err != nil {
+ 		return err
+ 	}
+ 
+ 	rc.Start()
+ 	return nil
+ }
+ 
+ func (rc *RootConfig) Start() {
+ 	startOnce.Do(func() {
+ 		rc.Provider.Load()
+ 		rc.Consumer.Load()
 -		extension.SetAndInitGlobalDispatcher(rootConfig.EventDispatcherType)
+ 		registerServiceInstance()
+ 	})
+ }
diff --cc config/instance/metadata_report_test.go
index d665f61,e57f75c..4a56883
--- a/config/instance/metadata_report_test.go
+++ b/config/instance/metadata_report_test.go
@@@ -22,6 -22,7 +22,8 @@@ import 
  )
  
  import (
+ 	gxset "github.com/dubbogo/gost/container/set"
++
  	"github.com/stretchr/testify/assert"
  )
  
diff --cc config/logger_config_test.go
index 0000000,8be1854..888d981
mode 000000,100644..100644
--- a/config/logger_config_test.go
+++ b/config/logger_config_test.go
@@@ -1,0 -1,87 +1,72 @@@
+ /*
+  * 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 (
 -	"os"
+ 	"testing"
+ )
+ 
+ import (
 -	"bou.ke/monkey"
+ 	"github.com/stretchr/testify/assert"
+ )
+ 
+ import (
+ 	"dubbo.apache.org/dubbo-go/v3/common/logger"
+ )
+ 
 -func fakeExit(int) {
 -	panic("os.Exit called")
 -}
 -
+ func TestLoggerInit(t *testing.T) {
+ 	t.Run("empty use default", func(t *testing.T) {
+ 		err := Load(WithPath("./testdata/config/logger/empty_log.yaml"))
+ 		assert.Nil(t, err)
+ 		assert.NotNil(t, rootConfig)
+ 		loggerConfig := rootConfig.Logger
+ 		assert.NotNil(t, loggerConfig)
+ 		assert.Equal(t, []string{"stderr"}, loggerConfig.ZapConfig.OutputPaths)
 -		logger.Info("hello")
 -		patch := monkey.Patch(os.Exit, fakeExit)
 -		defer patch.Unpatch()
 -		assert.PanicsWithValue(t, "os.Exit called", func() {
 -			logger.Fatalf("%s", "error")
 -		}, "os.Exit was not called")
 -		assert.PanicsWithValue(t, "os.Exit called", func() {
 -			logger.Fatal("error")
 -		}, "os.Exit was not called")
+ 	})
+ 
+ 	t.Run("use config", func(t *testing.T) {
+ 		err := Load(WithPath("./testdata/config/logger/log.yaml"))
+ 		assert.Nil(t, err)
+ 		loggerConfig := rootConfig.Logger
+ 		assert.NotNil(t, loggerConfig)
+ 		// default
+ 		assert.Equal(t, "debug", loggerConfig.ZapConfig.Level)
+ 		assert.Equal(t, "message", loggerConfig.ZapConfig.EncoderConfig.MessageKey)
+ 		assert.Equal(t, "stacktrace", loggerConfig.ZapConfig.EncoderConfig.StacktraceKey)
+ 		logger.Info("hello")
+ 	})
+ 
+ 	t.Run("use config with file", func(t *testing.T) {
+ 		err := Load(WithPath("./testdata/config/logger/file_log.yaml"))
+ 		assert.Nil(t, err)
+ 		loggerConfig := rootConfig.Logger
+ 		assert.NotNil(t, loggerConfig)
+ 		// default
+ 		assert.Equal(t, "debug", loggerConfig.ZapConfig.Level)
+ 		assert.Equal(t, "message", loggerConfig.ZapConfig.EncoderConfig.MessageKey)
+ 		assert.Equal(t, "stacktrace", loggerConfig.ZapConfig.EncoderConfig.StacktraceKey)
+ 		logger.Debug("debug")
+ 		logger.Info("info")
+ 		logger.Warn("warn")
+ 		logger.Error("error")
+ 		logger.Debugf("%s", "debug")
+ 		logger.Infof("%s", "info")
+ 		logger.Warnf("%s", "warn")
+ 		logger.Errorf("%s", "error")
+ 	})
+ }
diff --cc config_center/nacos/cache/config/dubbo.properties@@dubbo-go@@
index 0000000,0000000..f6add24
new file mode 100644
--- /dev/null
+++ b/config_center/nacos/cache/config/dubbo.properties@@dubbo-go@@
@@@ -1,0 -1,0 +1,1 @@@
++dubbo.protocol.name=dubbo
diff --cc config_center/nacos/log/nacos-sdk.log-202109260800
index 0000000,0000000..e1ce45e
new file mode 100644
--- /dev/null
+++ b/config_center/nacos/log/nacos-sdk.log-202109260800
@@@ -1,0 -1,0 +1,12 @@@
++2021-09-26T17:53:25.229+0800	INFO	logDir:</Users/laurence/Desktop/workplace/dubbogo/dubbo-go/config_center/nacos/log>   cacheDir:</Users/laurence/Desktop/workplace/dubbogo/dubbo-go/config_center/nacos/cache>
++2021-09-26T17:53:25.231+0800	INFO	logDir:</Users/laurence/Desktop/workplace/dubbogo/dubbo-go/config_center/nacos/log>   cacheDir:</Users/laurence/Desktop/workplace/dubbogo/dubbo-go/config_center/nacos/cache>
++2021-09-26T17:53:30.232+0800	INFO	logDir:</Users/laurence/Desktop/workplace/dubbogo/dubbo-go/config_center/nacos/log>   cacheDir:</Users/laurence/Desktop/workplace/dubbogo/dubbo-go/config_center/nacos/cache>
++2021-09-26T17:53:32.773+0800	ERROR	[cache.ReadConfigFromFile] error: failed to read config cache file:/Users/laurence/Desktop/workplace/dubbogo/dubbo-go/config_center/nacos/cache/config/dubbo.properties@@dubbo@@,err:open /Users/laurence/Desktop/workplace/dubbogo/dubbo-go/config_center/nacos/cache/config/dubbo.properties@@dubbo@@: no such file or directory 
++2021-09-26T18:04:54.585+0800	INFO	logDir:</Users/laurence/Desktop/workplace/dubbogo/dubbo-go/config_center/nacos/log>   cacheDir:</Users/laurence/Desktop/workplace/dubbogo/dubbo-go/config_center/nacos/cache>
++2021-09-26T18:04:54.586+0800	INFO	logDir:</Users/laurence/Desktop/workplace/dubbogo/dubbo-go/config_center/nacos/log>   cacheDir:</Users/laurence/Desktop/workplace/dubbogo/dubbo-go/config_center/nacos/cache>
++2021-09-26T18:04:59.591+0800	INFO	logDir:</Users/laurence/Desktop/workplace/dubbogo/dubbo-go/config_center/nacos/log>   cacheDir:</Users/laurence/Desktop/workplace/dubbogo/dubbo-go/config_center/nacos/cache>
++2021-09-26T18:05:01.945+0800	ERROR	[cache.ReadConfigFromFile] error: failed to read config cache file:/Users/laurence/Desktop/workplace/dubbogo/dubbo-go/config_center/nacos/cache/config/dubbo.properties@@dubbo@@,err:open /Users/laurence/Desktop/workplace/dubbogo/dubbo-go/config_center/nacos/cache/config/dubbo.properties@@dubbo@@: no such file or directory 
++2021-09-26T18:10:10.507+0800	INFO	logDir:</Users/laurence/Desktop/workplace/dubbogo/dubbo-go/config_center/nacos/log>   cacheDir:</Users/laurence/Desktop/workplace/dubbogo/dubbo-go/config_center/nacos/cache>
++2021-09-26T18:10:10.509+0800	INFO	logDir:</Users/laurence/Desktop/workplace/dubbogo/dubbo-go/config_center/nacos/log>   cacheDir:</Users/laurence/Desktop/workplace/dubbogo/dubbo-go/config_center/nacos/cache>
++2021-09-26T18:10:15.511+0800	INFO	logDir:</Users/laurence/Desktop/workplace/dubbogo/dubbo-go/config_center/nacos/log>   cacheDir:</Users/laurence/Desktop/workplace/dubbogo/dubbo-go/config_center/nacos/cache>
++2021-09-26T18:10:17.814+0800	ERROR	[cache.ReadConfigFromFile] error: failed to read config cache file:/Users/laurence/Desktop/workplace/dubbogo/dubbo-go/config_center/nacos/cache/config/dubbo.properties@@dubbo@@,err:open /Users/laurence/Desktop/workplace/dubbogo/dubbo-go/config_center/nacos/cache/config/dubbo.properties@@dubbo@@: no such file or directory 
diff --cc go.mod
index 3ac097a,d41d5c5..4d2a899
--- a/go.mod
+++ b/go.mod
@@@ -8,12 -9,12 +8,12 @@@ require 
  	github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5
  	github.com/alibaba/sentinel-golang v1.0.2
  	github.com/apache/dubbo-getty v1.4.5
- 	github.com/apache/dubbo-go-hessian2 v1.9.3
- 	github.com/creasty/defaults v1.5.2
+ 	github.com/apache/dubbo-go-hessian2 v1.9.2
+ 	github.com/creasty/defaults v1.5.1
  	github.com/dubbogo/go-zookeeper v1.0.3
- 	github.com/dubbogo/gost v1.11.17
- 	github.com/dubbogo/triple v1.0.5
- 	github.com/emicklei/go-restful/v3 v3.6.0
+ 	github.com/dubbogo/gost v1.11.16
 -	github.com/dubbogo/triple v1.0.6-0.20210904050749-5721796f3fd6
++	github.com/dubbogo/triple v1.0.6-0.20210909153707-3620c8d2d97c
+ 	github.com/emicklei/go-restful/v3 v3.5.2
  	github.com/fsnotify/fsnotify v1.5.1
  	github.com/ghodss/yaml v1.0.0
  	github.com/go-co-op/gocron v0.1.1
@@@ -23,10 -26,11 +25,11 @@@
  	github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645
  	github.com/hashicorp/vault/sdk v0.2.1
  	github.com/jinzhu/copier v0.3.2
+ 	github.com/knadh/koanf v1.1.1
  	github.com/magiconair/properties v1.8.5
 -	github.com/mitchellh/mapstructure v1.4.1
 +	github.com/mitchellh/mapstructure v1.4.2
  	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd
 -	github.com/nacos-group/nacos-sdk-go v1.0.8
 +	github.com/nacos-group/nacos-sdk-go v1.0.9
  	github.com/natefinch/lumberjack v2.0.0+incompatible
  	github.com/opentracing/opentracing-go v1.2.0
  	github.com/pkg/errors v0.9.1
diff --cc go.sum
index 6f6ef9f,e479db5..3f0db58
--- a/go.sum
+++ b/go.sum
@@@ -152,14 -176,13 +176,15 @@@ github.com/dubbogo/go-zookeeper v1.0.3 
  github.com/dubbogo/go-zookeeper v1.0.3/go.mod h1:fn6n2CAEer3novYgk9ULLwAjuV8/g4DdC2ENwRb6E+c=
  github.com/dubbogo/gost v1.9.0/go.mod h1:pPTjVyoJan3aPxBPNUX0ADkXjPibLo+/Ib0/fADXSG8=
  github.com/dubbogo/gost v1.11.12/go.mod h1:vIcP9rqz2KsXHPjsAwIUtfJIJjppQLQDcYaZTy/61jI=
+ github.com/dubbogo/gost v1.11.16 h1:fvOw8aKQ0BuUYuD+MaXAYFvT7tg2l7WAS5SL5gZJpFs=
  github.com/dubbogo/gost v1.11.16/go.mod h1:vIcP9rqz2KsXHPjsAwIUtfJIJjppQLQDcYaZTy/61jI=
- github.com/dubbogo/gost v1.11.17 h1:Dwaoqv/G21nYsGkeQoLbCAOryRPl6B7pEsZSJcr55nE=
- github.com/dubbogo/gost v1.11.17/go.mod h1:vIcP9rqz2KsXHPjsAwIUtfJIJjppQLQDcYaZTy/61jI=
  github.com/dubbogo/jsonparser v1.0.1/go.mod h1:tYAtpctvSP/tWw4MeelsowSPgXQRVHHWbqL6ynps8jU=
- github.com/dubbogo/net v0.0.3 h1:2k53mh+1U8h1gFjJ8ykzyP4wNdAdgjc5moD+xVHI/AE=
- github.com/dubbogo/net v0.0.3/go.mod h1:B6/ka3g8VzcyrmdCH4VkHP1K0aHeI37FmclS+TCwIBU=
- github.com/dubbogo/triple v1.0.5 h1:bDASS3u0ILC+KaUmWaDDuZ7/pVZcljyO/1TkwXMvcsM=
- github.com/dubbogo/triple v1.0.5/go.mod h1:tCl0mV54+V8Br9z71sFbS1IQUG41QKZUrW6FGaLheM0=
+ github.com/dubbogo/net v0.0.4 h1:Rn9aMPZwOiRE22YhtxmDEE3H0Q3cfVRNhuEjNMelJ/8=
+ github.com/dubbogo/net v0.0.4/go.mod h1:1CGOnM7X3he+qgGNqjeADuE5vKZQx/eMSeUkpU3ujIc=
+ github.com/dubbogo/triple v1.0.6-0.20210904050749-5721796f3fd6 h1:ZrCFQ/a0rgK5EBF9FiiSYvCmtC2sLzOoFAbqBVmsA94=
+ github.com/dubbogo/triple v1.0.6-0.20210904050749-5721796f3fd6/go.mod h1:KbfU/uZDv+fJEqXYK3qI8m1iuBQ309QxiC0tvTf2pog=
++github.com/dubbogo/triple v1.0.6-0.20210909153707-3620c8d2d97c h1:/Qrdqo2JVrywDANk04DHrvdfREdIApAWZ6stbYZfNaM=
++github.com/dubbogo/triple v1.0.6-0.20210909153707-3620c8d2d97c/go.mod h1:KbfU/uZDv+fJEqXYK3qI8m1iuBQ309QxiC0tvTf2pog=
  github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
  github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
  github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
@@@ -466,9 -529,11 +531,12 @@@ github.com/mitchellh/iochan v1.0.0/go.m
  github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
  github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
  github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
 -github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=
+ github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
 +github.com/mitchellh/mapstructure v1.4.2 h1:6h7AQ0yhTcIsmFmnAwQls75jp2Gzs4iB8W7pjMO+rqo=
 +github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
  github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
+ github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
+ github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
  github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
  github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
  github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@@ -768,8 -841,9 +848,10 @@@ golang.org/x/lint v0.0.0-20190313153728
  golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
  golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
  golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
+ golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
  golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
 +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug=
  golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
  golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
  golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
diff --cc metadata/mapping/metadata/service_name_mapping.go
index b81423d,572dda8..f155aa9
--- a/metadata/mapping/metadata/service_name_mapping.go
+++ b/metadata/mapping/metadata/service_name_mapping.go
@@@ -23,8 -22,7 +22,8 @@@ import 
  )
  
  import (
- 	"github.com/dubbogo/gost/container/set"
+ 	gxset "github.com/dubbogo/gost/container/set"
++
  	perrors "github.com/pkg/errors"
  )
  
diff --cc metadata/report/etcd/report.go
index 2d83fa3,7741e4b..a677b76
--- a/metadata/report/etcd/report.go
+++ b/metadata/report/etcd/report.go
@@@ -23,7 -23,9 +23,10 @@@ import 
  )
  
  import (
+ 	gxset "github.com/dubbogo/gost/container/set"
  	gxetcd "github.com/dubbogo/gost/database/kv/etcd/v3"
++
+ 	perrors "github.com/pkg/errors"
  )
  
  import (
diff --cc metadata/report/nacos/cache/config/com.test.MyTest:1.0.0:test_group:service:nacos:revisiona@@test_group@@
index 0000000,0000000..5a98cb7
new file mode 100644
--- /dev/null
+++ b/metadata/report/nacos/cache/config/com.test.MyTest:1.0.0:test_group:service:nacos:revisiona@@test_group@@
@@@ -1,0 -1,0 +1,1 @@@
++registry://console.nacos.io:80?registry.role=3
diff --cc metadata/report/zookeeper/report.go
index 8d4da70,0e08a19..4402d61
--- a/metadata/report/zookeeper/report.go
+++ b/metadata/report/zookeeper/report.go
@@@ -25,6 -25,7 +25,8 @@@ import 
  
  import (
  	"github.com/dubbogo/go-zookeeper/zk"
++
+ 	gxset "github.com/dubbogo/gost/container/set"
  	gxzookeeper "github.com/dubbogo/gost/database/kv/zk"
  )
  
diff --cc metadata/service/remote/service_test.go
index 938a860,fc46367..0ea7121
--- a/metadata/service/remote/service_test.go
+++ b/metadata/service/remote/service_test.go
@@@ -23,6 -23,7 +23,8 @@@ import 
  )
  
  import (
+ 	gxset "github.com/dubbogo/gost/container/set"
++
  	"github.com/stretchr/testify/assert"
  )
  
diff --cc registry/etcdv3/service_discovery.go
index a081917,214ea42..a99ea94
--- a/registry/etcdv3/service_discovery.go
+++ b/registry/etcdv3/service_discovery.go
@@@ -331,17 -306,11 +319,17 @@@ func newEtcdV3ServiceDiscovery() (regis
  
  	client := etcdv3.NewServiceDiscoveryClient(
  		gxetcd.WithName(gxetcd.RegistryETCDV3Client),
- 		gxetcd.WithTimeout(timeout),
- 		gxetcd.WithEndpoints(strings.Split(remoteConfig.Address, ",")...),
+ 		gxetcd.WithTimeout(to),
+ 		gxetcd.WithEndpoints(strings.Split(metadataReportConfig.Address, ",")...),
  	)
  
- 	descriptor := fmt.Sprintf("etcd-service-discovery[%s]", remoteConfig.Address)
+ 	descriptor := fmt.Sprintf("etcd-service-discovery[%s]", metadataReportConfig.Address)
  
 -	return &etcdV3ServiceDiscovery{descriptor, client, nil, gxset.NewSet(), make(map[string]*etcdv3.EventListener)}, nil
 +	return &etcdV3ServiceDiscovery{
 +		descriptor,
 +		client,
 +		nil,
 +		gxset.NewSet(),
 +		make(map[string]*etcdv3.EventListener),
 +		make(map[string]*gxset.HashSet)}, nil
  }
diff --cc registry/nacos/cache/naming/DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc
index 0000000,0000000..699468d
new file mode 100644
--- /dev/null
+++ b/registry/nacos/cache/naming/DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc
@@@ -1,0 -1,0 +1,1 @@@
++{"dom":"","cacheMillis":10000,"useSpecifiedUrl":false,"hosts":[{"valid":false,"marked":false,"instanceId":"127.0.0.1#20000#DEFAULT#DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc","port":20000,"ip":"127.0.0.1","weight":1,"metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"clusterName":"DEFAULT","servic [...]
diff --cc registry/nacos/cache/naming/DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc
index 0000000,0000000..1248b9e
new file mode 100644
--- /dev/null
+++ b/registry/nacos/cache/naming/DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc
@@@ -1,0 -1,0 +1,1 @@@
++{"dom":"","cacheMillis":10000,"useSpecifiedUrl":false,"hosts":[{"valid":false,"marked":false,"instanceId":"127.0.0.1#20000#DEFAULT#DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","port":20000,"ip":"127.0.0.1","weight":1,"metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"clusterName":"DEFAULT [...]
diff --cc registry/nacos/cache/naming/DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc
index 0000000,0000000..be346be
new file mode 100644
--- /dev/null
+++ b/registry/nacos/cache/naming/DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc
@@@ -1,0 -1,0 +1,1 @@@
++{"dom":"","cacheMillis":10000,"useSpecifiedUrl":false,"hosts":[{"valid":false,"marked":false,"instanceId":"127.0.0.1#20000#DEFAULT#DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","port":20000,"ip":"127.0.0.1","weight":1,"metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"clusterName":"DEFAULT [...]
diff --cc registry/nacos/log/nacos-sdk.log-202109260800
index 0000000,0000000..eb79199
new file mode 100644
--- /dev/null
+++ b/registry/nacos/log/nacos-sdk.log-202109260800
@@@ -1,0 -1,0 +1,153 @@@
++2021-09-26T17:53:58.274+0800	INFO	udp server start, port: 55716
++2021-09-26T17:53:58.278+0800	INFO	register instance namespaceId:<>,serviceName:<DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc> with instance:<{"valid":false,"marked":false,"instanceId":"","port":20000,"ip":"127.0.0.1","weight":1,"metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"cl [...]
++2021-09-26T17:53:58.654+0800	INFO	adding beat: <{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}> to beat map
++2021-09-26T17:53:58.655+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T17:54:03.656+0800	INFO	Local IP:30.225.19.232
++2021-09-26T17:54:03.725+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T17:54:03.740+0800	INFO	service not found in cache DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc
++2021-09-26T17:54:03.867+0800	INFO	register instance namespaceId:<>,serviceName:<DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc> with instance:<{"valid":false,"marked":false,"instanceId":"","port":20000,"ip":"127.0.0.1","weight":1,"metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"clusterName [...]
++2021-09-26T17:54:03.943+0800	INFO	adding beat: <{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}> to beat map
++2021-09-26T17:54:03.943+0800	INFO	adding DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc with  to listener map
++2021-09-26T17:54:03.943+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T17:54:04.013+0800	INFO	service not found in cache DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc
++2021-09-26T17:54:04.089+0800	INFO	register instance namespaceId:<>,serviceName:<DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc> with instance:<{"valid":false,"marked":false,"instanceId":"","port":20000,"ip":"127.0.0.1","weight":1,"metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"cl [...]
++2021-09-26T17:54:04.327+0800	INFO	adding beat: <{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}> to beat map
++2021-09-26T17:54:04.327+0800	INFO	register instance namespaceId:<>,serviceName:<DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc> with instance:<{"valid":false,"marked":false,"instanceId":"","port":20000,"ip":"127.0.0.2","weight":1,"metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"cl [...]
++2021-09-26T17:54:04.327+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}>
++2021-09-26T17:54:04.417+0800	INFO	adding beat: <{"ip":"127.0.0.2","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}> to beat map
++2021-09-26T17:54:04.418+0800	INFO	adding DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc with  to listener map
++2021-09-26T17:54:04.418+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.2","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}>
++2021-09-26T17:54:04.493+0800	INFO	service not found in cache DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc
++2021-09-26T17:54:04.493+0800	INFO	remove beat: DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc@127.0.0.2:20000 from beat map
++2021-09-26T17:54:04.493+0800	INFO	deregister instance namespaceId:<>,serviceName:<DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc> with instance:<127.0.0.2:20000@>
++2021-09-26T17:54:08.815+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T17:54:09.016+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T17:54:09.487+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}>
++2021-09-26T17:54:09.558+0800	INFO	instance[DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc#127.0.0.2#20000] stop heartBeating
++2021-09-26T17:54:13.997+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T17:54:14.090+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T17:54:14.661+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}>
++2021-09-26T17:54:19.069+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T17:54:19.236+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T17:54:19.891+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}>
++2021-09-26T17:54:24.146+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T17:54:24.309+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T17:54:24.967+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}>
++2021-09-26T17:54:26.373+0800	INFO	service key:%s was updated to:%sDEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc{"dom":"","cacheMillis":10000,"useSpecifiedUrl":false,"hosts":[{"valid":false,"marked":false,"instanceId":"127.0.0.1#20000#DEFAULT#DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","port":20000,"ip":"127.0.0.1","weight":1,"metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com [...]
++2021-09-26T17:54:29.222+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T17:54:29.387+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T17:54:30.041+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}>
++2021-09-26T17:54:34.297+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T17:54:34.467+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T17:54:35.208+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}>
++2021-09-26T17:54:39.387+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T17:54:39.541+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T17:54:40.350+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}>
++2021-09-26T17:54:44.465+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T17:54:44.626+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T17:54:45.428+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}>
++2021-09-26T17:54:48.385+0800	INFO	service key:%s was updated to:%sDEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc{"dom":"","cacheMillis":10000,"useSpecifiedUrl":false,"hosts":[{"valid":false,"marked":false,"instanceId":"127.0.0.1#20000#DEFAULT#DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","port":20000,"ip":"127.0.0.1","weight":1,"metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com [...]
++2021-09-26T17:54:48.386+0800	INFO	removing @@providers:com.ikurento.user.UserProvider2:1.0.0:guangzhou-idc with  to listener map
++2021-09-26T17:54:48.386+0800	INFO	adding DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider2:1.0.0:guangzhou-idc with  to listener map
++2021-09-26T18:05:22.129+0800	INFO	udp server start, port: 55177
++2021-09-26T18:05:22.130+0800	INFO	register instance namespaceId:<>,serviceName:<DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc> with instance:<{"valid":false,"marked":false,"instanceId":"","port":20000,"ip":"127.0.0.1","weight":1,"metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"cl [...]
++2021-09-26T18:05:22.285+0800	INFO	adding beat: <{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}> to beat map
++2021-09-26T18:05:22.285+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:05:27.286+0800	INFO	Local IP:30.225.19.232
++2021-09-26T18:05:27.365+0800	INFO	service not found in cache DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc
++2021-09-26T18:05:27.366+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:05:27.445+0800	INFO	register instance namespaceId:<>,serviceName:<DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc> with instance:<{"valid":false,"marked":false,"instanceId":"","port":20000,"ip":"127.0.0.1","weight":1,"metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"clusterName [...]
++2021-09-26T18:05:27.586+0800	INFO	adding beat: <{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}> to beat map
++2021-09-26T18:05:27.586+0800	INFO	adding DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc with  to listener map
++2021-09-26T18:05:27.586+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:05:27.661+0800	INFO	service not found in cache DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc
++2021-09-26T18:05:27.737+0800	INFO	register instance namespaceId:<>,serviceName:<DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc> with instance:<{"valid":false,"marked":false,"instanceId":"","port":20000,"ip":"127.0.0.1","weight":1,"metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"cl [...]
++2021-09-26T18:05:27.810+0800	INFO	adding beat: <{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}> to beat map
++2021-09-26T18:05:27.810+0800	INFO	register instance namespaceId:<>,serviceName:<DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc> with instance:<{"valid":false,"marked":false,"instanceId":"","port":20000,"ip":"127.0.0.2","weight":1,"metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"cl [...]
++2021-09-26T18:05:27.811+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}>
++2021-09-26T18:05:27.883+0800	INFO	adding beat: <{"ip":"127.0.0.2","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}> to beat map
++2021-09-26T18:05:27.883+0800	INFO	adding DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc with  to listener map
++2021-09-26T18:05:27.883+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.2","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}>
++2021-09-26T18:05:27.960+0800	INFO	service not found in cache DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc
++2021-09-26T18:05:27.960+0800	INFO	remove beat: DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc@127.0.0.2:20000 from beat map
++2021-09-26T18:05:27.960+0800	INFO	deregister instance namespaceId:<>,serviceName:<DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc> with instance:<127.0.0.2:20000@>
++2021-09-26T18:05:32.512+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:05:32.662+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:05:32.960+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}>
++2021-09-26T18:05:33.032+0800	INFO	instance[DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc#127.0.0.2#20000] stop heartBeating
++2021-09-26T18:05:37.586+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:05:37.738+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:05:38.034+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}>
++2021-09-26T18:05:42.662+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:05:42.814+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:05:43.110+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}>
++2021-09-26T18:05:47.744+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:05:47.898+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:05:48.193+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}>
++2021-09-26T18:05:49.225+0800	INFO	service key:%s was updated to:%sDEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc{"dom":"","cacheMillis":10000,"useSpecifiedUrl":false,"hosts":[{"valid":false,"marked":false,"instanceId":"127.0.0.1#20000#DEFAULT#DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","port":20000,"ip":"127.0.0.1","weight":1,"metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com [...]
++2021-09-26T18:05:52.830+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:05:52.984+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:05:53.278+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}>
++2021-09-26T18:05:57.913+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:05:58.072+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:05:58.372+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}>
++2021-09-26T18:06:02.998+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:06:03.156+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:06:03.454+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}>
++2021-09-26T18:06:08.319+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:06:08.392+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:06:08.532+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}>
++2021-09-26T18:06:11.323+0800	INFO	service key:%s was updated to:%sDEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc{"dom":"","cacheMillis":10000,"useSpecifiedUrl":false,"hosts":[{"valid":false,"marked":false,"instanceId":"127.0.0.1#20000#DEFAULT#DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","port":20000,"ip":"127.0.0.1","weight":1,"metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com [...]
++2021-09-26T18:06:11.326+0800	INFO	removing @@providers:com.ikurento.user.UserProvider2:1.0.0:guangzhou-idc with  to listener map
++2021-09-26T18:06:11.326+0800	INFO	adding DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider2:1.0.0:guangzhou-idc with  to listener map
++2021-09-26T18:10:32.159+0800	INFO	udp server start, port: 55409
++2021-09-26T18:10:32.160+0800	INFO	register instance namespaceId:<>,serviceName:<DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc> with instance:<{"valid":false,"marked":false,"instanceId":"","port":20000,"ip":"127.0.0.1","weight":1,"metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"cl [...]
++2021-09-26T18:10:32.314+0800	INFO	adding beat: <{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}> to beat map
++2021-09-26T18:10:32.314+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:10:37.316+0800	INFO	Local IP:30.225.19.232
++2021-09-26T18:10:37.393+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:10:37.396+0800	INFO	service not found in cache DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc
++2021-09-26T18:10:37.543+0800	INFO	register instance namespaceId:<>,serviceName:<DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc> with instance:<{"valid":false,"marked":false,"instanceId":"","port":20000,"ip":"127.0.0.1","weight":1,"metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"clusterName [...]
++2021-09-26T18:10:37.621+0800	INFO	adding beat: <{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}> to beat map
++2021-09-26T18:10:37.621+0800	INFO	adding DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc with  to listener map
++2021-09-26T18:10:37.621+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:10:37.700+0800	INFO	service not found in cache DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc
++2021-09-26T18:10:37.783+0800	INFO	register instance namespaceId:<>,serviceName:<DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc> with instance:<{"valid":false,"marked":false,"instanceId":"","port":20000,"ip":"127.0.0.1","weight":1,"metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"cl [...]
++2021-09-26T18:10:37.854+0800	INFO	adding beat: <{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}> to beat map
++2021-09-26T18:10:37.855+0800	INFO	register instance namespaceId:<>,serviceName:<DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc> with instance:<{"valid":false,"marked":false,"instanceId":"","port":20000,"ip":"127.0.0.2","weight":1,"metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"cl [...]
++2021-09-26T18:10:37.855+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}>
++2021-09-26T18:10:37.927+0800	INFO	adding beat: <{"ip":"127.0.0.2","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}> to beat map
++2021-09-26T18:10:37.927+0800	INFO	adding DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc with  to listener map
++2021-09-26T18:10:37.927+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.2","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}>
++2021-09-26T18:10:38.006+0800	INFO	service not found in cache DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc
++2021-09-26T18:10:38.008+0800	INFO	remove beat: DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc@127.0.0.2:20000 from beat map
++2021-09-26T18:10:38.008+0800	INFO	deregister instance namespaceId:<>,serviceName:<DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc> with instance:<127.0.0.2:20000@>
++2021-09-26T18:10:42.476+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:10:42.695+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:10:43.000+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}>
++2021-09-26T18:10:43.071+0800	INFO	instance[DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc#127.0.0.2#20000] stop heartBeating
++2021-09-26T18:10:47.549+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:10:47.769+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:10:48.072+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}>
++2021-09-26T18:10:52.622+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:10:52.840+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:10:53.146+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}>
++2021-09-26T18:10:57.696+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:10:57.914+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:10:58.221+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}>
++2021-09-26T18:10:59.258+0800	INFO	service key:%s was updated to:%sDEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc{"dom":"","cacheMillis":10000,"useSpecifiedUrl":false,"hosts":[{"valid":false,"marked":false,"instanceId":"127.0.0.1#20000#DEFAULT#DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","port":20000,"ip":"127.0.0.1","weight":1,"metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com [...]
++2021-09-26T18:11:02.836+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:11:03.055+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:11:03.361+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}>
++2021-09-26T18:11:07.909+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:11:08.129+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:11:08.434+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}>
++2021-09-26T18:11:12.984+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:11:13.205+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:11:13.507+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}>
++2021-09-26T18:11:18.056+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:11:18.276+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.dubbo.user.UserProvider","path":"/com.dubbo.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"1.0.0"},"scheduled":false}>
++2021-09-26T18:11:18.581+0800	INFO	namespaceId:<> sending beat to server:<{"ip":"127.0.0.1","port":20000,"weight":1,"serviceName":"DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","cluster":"","metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com.ikurento.user.UserProvider","path":"/com.ikurento.user.UserProvider","protocol":"dubbo","registry.role":"3","version":"2.0.0"},"scheduled":false}>
++2021-09-26T18:11:20.346+0800	INFO	service key:%s was updated to:%sDEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc{"dom":"","cacheMillis":10000,"useSpecifiedUrl":false,"hosts":[{"valid":false,"marked":false,"instanceId":"127.0.0.1#20000#DEFAULT#DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc","port":20000,"ip":"127.0.0.1","weight":1,"metadata":{"category":"providers","cluster":"mock","group":"guangzhou-idc","interface":"com [...]
++2021-09-26T18:11:20.348+0800	INFO	removing @@providers:com.ikurento.user.UserProvider2:1.0.0:guangzhou-idc with  to listener map
++2021-09-26T18:11:20.348+0800	INFO	adding DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider2:1.0.0:guangzhou-idc with  to listener map
diff --cc registry/nacos/service_discovery.go
index 2328b4b,ee7e276..b820eb8
--- a/registry/nacos/service_discovery.go
+++ b/registry/nacos/service_discovery.go
@@@ -19,7 -19,7 +19,8 @@@ package naco
  
  import (
  	"fmt"
+ 	"net/url"
 +	"sync"
  )
  
  import (
@@@ -350,24 -329,11 +345,12 @@@ func newNacosServiceDiscovery() (regist
  	if len(group) == 0 {
  		group = defaultGroup
  	}
- 	// set protocol if remote not set
- 	if len(rc.Protocol) <= 0 {
- 		rc.Protocol = sdc.Protocol
- 	}
- 	client, err := nacos.NewNacosClient(rc)
- 	if err != nil {
- 		return nil, perrors.WithMessage(err, "create nacos namingClient failed.")
- 	}
- 
- 	descriptor := fmt.Sprintf("nacos-service-discovery[%s]", rc.Address)
- 
  	newInstance := &nacosServiceDiscovery{
 -		group:             group,
 -		namingClient:      client,
 -		descriptor:        descriptor,
 -		registryInstances: []registry.ServiceInstance{},
 +		group:               group,
 +		namingClient:        client,
 +		descriptor:          descriptor,
 +		registryInstances:   []registry.ServiceInstance{},
 +		instanceListenerMap: make(map[string]*gxset.HashSet),
  	}
- 	instanceMap[name] = newInstance
  	return newInstance, nil
  }
diff --cc registry/nacos/service_discovery_test.go
index 1c438c5,eaa31e4..c8754a0
--- a/registry/nacos/service_discovery_test.go
+++ b/registry/nacos/service_discovery_test.go
@@@ -17,166 -17,175 +17,166 @@@
  
  package nacos
  
- import (
- 	"math/rand"
- 	"strconv"
- 	"testing"
- 	"time"
- )
- 
- import (
- 	gxset "github.com/dubbogo/gost/container/set"
- 	"github.com/stretchr/testify/assert"
- )
- 
- import (
- 	"dubbo.apache.org/dubbo-go/v3/common/constant"
- 	"dubbo.apache.org/dubbo-go/v3/common/extension"
- 	"dubbo.apache.org/dubbo-go/v3/config"
- 	"dubbo.apache.org/dubbo-go/v3/metadata/mapping"
- 	"dubbo.apache.org/dubbo-go/v3/registry"
- 	"dubbo.apache.org/dubbo-go/v3/registry/event"
- )
- 
- var testName = "test"
- 
- func Test_newNacosServiceDiscovery(t *testing.T) {
- 	name := "nacos1"
- 	_, err := newNacosServiceDiscovery(name)
- 
- 	// the ServiceDiscoveryConfig not found
- 	assert.NotNil(t, err)
- 
- 	sdc := &config.ServiceDiscoveryConfig{
- 		Protocol:  "nacos",
- 		RemoteRef: "mock",
- 	}
- 	config.GetBaseConfig().ServiceDiscoveries[name] = sdc
- 
- 	_, err = newNacosServiceDiscovery(name)
- 
- 	// RemoteConfig not found
- 	assert.NotNil(t, err)
- 
- 	config.GetBaseConfig().Remotes["mock"] = &config.RemoteConfig{
- 		Address:    "console.nacos.io:80",
- 		TimeoutStr: "10s",
- 	}
- 
- 	res, err := newNacosServiceDiscovery(name)
- 	assert.Nil(t, err)
- 	assert.NotNil(t, res)
- }
- 
- func TestNacosServiceDiscovery_CRUD(t *testing.T) {
- 	if !checkNacosServerAlive() {
- 		return
- 	}
- 	prepareData()
- 
- 	extension.SetGlobalServiceNameMapping(func() mapping.ServiceNameMapping {
- 		return mapping.NewMockServiceNameMapping()
- 	})
- 
- 	rand.Seed(time.Now().Unix())
- 	serviceName := "service-name" + strconv.Itoa(rand.Intn(10000))
- 	id := "id"
- 	host := "host"
- 	port := 123
- 	instance := &registry.DefaultServiceInstance{
- 		ID:          id,
- 		ServiceName: serviceName,
- 		Host:        host,
- 		Port:        port,
- 		Enable:      true,
- 		Healthy:     true,
- 		Metadata:    nil,
- 	}
- 
- 	// clean data
- 	serviceDiscovery, err := extension.GetServiceDiscovery(constant.NACOS_KEY, testName)
- 	assert.Nil(t, err)
- 
- 	// clean data for local test
- 	err = serviceDiscovery.Unregister(&registry.DefaultServiceInstance{
- 		ID:          id,
- 		ServiceName: serviceName,
- 		Host:        host,
- 		Port:        port,
- 	})
- 	assert.Nil(t, err)
- 
- 	err = serviceDiscovery.Register(instance)
- 
- 	assert.Nil(t, err)
- 
- 	// sometimes nacos may be failed to push update of instance,
- 	// so it need 10s to pull, we sleep 10 second to make sure instance has been update
- 	time.Sleep(5 * time.Second)
- 	page := serviceDiscovery.GetHealthyInstancesByPage(serviceName, 0, 10, true)
- 	assert.NotNil(t, page)
- 	assert.Equal(t, 0, page.GetOffset())
- 	assert.Equal(t, 10, page.GetPageSize())
- 	assert.Equal(t, 1, page.GetDataSize())
- 
- 	instance = page.GetData()[0].(*registry.DefaultServiceInstance)
- 	instance.ServiceName = serviceName
- 	assert.NotNil(t, instance)
- 	assert.Equal(t, id, instance.GetID())
- 	assert.Equal(t, host, instance.GetHost())
- 	assert.Equal(t, port, instance.GetPort())
- 	// TODO: console.nacos.io has updated to nacos 2.0 and serviceName has changed in 2.0, so ignore temporarily.
- 	// assert.Equal(t, serviceName, instance.GetServiceName())
- 	assert.Equal(t, 0, len(instance.GetMetadata()))
- 
- 	instance.Metadata["a"] = "b"
- 	err = serviceDiscovery.Update(instance)
- 	assert.Nil(t, err)
- 
- 	time.Sleep(5 * time.Second)
- 	pageMap := serviceDiscovery.GetRequestInstances([]string{serviceName}, 0, 1)
- 	assert.Equal(t, 1, len(pageMap))
- 
- 	page = pageMap[serviceName]
- 	assert.NotNil(t, page)
- 	assert.Equal(t, 1, len(page.GetData()))
- 
- 	instance = page.GetData()[0].(*registry.DefaultServiceInstance)
- 	v, ok := instance.Metadata["a"]
- 	assert.True(t, ok)
- 	assert.Equal(t, "b", v)
- 
- 	// test dispatcher event
- 	hs := gxset.NewSet()
- 	hs.Add(serviceName)
- 	// test AddListener
- 	err = serviceDiscovery.AddListener(event.NewServiceInstancesChangedListener(hs))
- 	assert.Nil(t, err)
- }
- 
- func TestNacosServiceDiscovery_GetDefaultPageSize(t *testing.T) {
- 	prepareData()
- 	serviceDiscovery, _ := extension.GetServiceDiscovery(constant.NACOS_KEY, testName)
- 	assert.Equal(t, registry.DefaultPageSize, serviceDiscovery.GetDefaultPageSize())
- }
- 
- func TestNacosServiceDiscovery_Destroy(t *testing.T) {
- 	prepareData()
- 	serviceDiscovery, err := extension.GetServiceDiscovery(constant.NACOS_KEY, testName)
- 	assert.Nil(t, err)
- 	assert.NotNil(t, serviceDiscovery)
- 	err = serviceDiscovery.Destroy()
- 	assert.Nil(t, err)
- }
- 
- func prepareData() {
- 	config.GetBaseConfig().ServiceDiscoveries[testName] = &config.ServiceDiscoveryConfig{
- 		Protocol:  "nacos",
- 		RemoteRef: testName,
- 	}
- 
- 	config.GetBaseConfig().Remotes[testName] = &config.RemoteConfig{
- 		Address:    "console.nacos.io:80",
- 		TimeoutStr: "10s",
- 	}
- }
 -//
+ //import (
+ //	"math/rand"
+ //	"strconv"
+ //	"testing"
+ //	"time"
+ //)
+ //
+ //import (
+ //	gxset "github.com/dubbogo/gost/container/set"
 -//
+ //	"github.com/stretchr/testify/assert"
+ //)
+ //
+ //import (
+ //	"dubbo.apache.org/dubbo-go/v3/common/constant"
+ //	"dubbo.apache.org/dubbo-go/v3/common/extension"
 -//	"dubbo.apache.org/dubbo-go/v3/common/observer"
 -//	"dubbo.apache.org/dubbo-go/v3/common/observer/dispatcher"
+ //	"dubbo.apache.org/dubbo-go/v3/config"
+ //	"dubbo.apache.org/dubbo-go/v3/metadata/mapping"
+ //	"dubbo.apache.org/dubbo-go/v3/registry"
+ //	"dubbo.apache.org/dubbo-go/v3/registry/event"
+ //)
+ //
+ //var testName = "test"
+ //
+ //func Test_newNacosServiceDiscovery(t *testing.T) {
 -//	_, err := newNacosServiceDiscovery()
++//	name := "nacos1"
++//	_, err := newNacosServiceDiscovery(name)
+ //
 -//	// the ShutdownConfig not found
++//	// the ServiceDiscoveryConfig not found
+ //	assert.NotNil(t, err)
+ //
 -//	//sdc := &config.ServiceDiscoveryConfig{
 -//	//	Protocol:  "nacos",
 -//	//	RemoteRef: "mock",
 -//	//}
 -//	//config.GetRootConfig().ServiceDiscoveries[name] = sdc
++//	sdc := &config.ServiceDiscoveryConfig{
++//		Protocol:  "nacos",
++//		RemoteRef: "mock",
++//	}
++//	config.GetBaseConfig().ServiceDiscoveries[name] = sdc
+ //
 -//	_, err = newNacosServiceDiscovery()
++//	_, err = newNacosServiceDiscovery(name)
+ //
+ //	// RemoteConfig not found
+ //	assert.NotNil(t, err)
+ //
 -//	//config.GetRootConfig().Remotes["mock"] = &config.RemoteConfig{
 -//	//	Address:    "console.nacos.io:80",
 -//	//	TimeoutStr: "10s",
 -//	//}
++//	config.GetBaseConfig().Remotes["mock"] = &config.RemoteConfig{
++//		Address:    "console.nacos.io:80",
++//		TimeoutStr: "10s",
++//	}
+ //
 -//	res, err := newNacosServiceDiscovery()
++//	res, err := newNacosServiceDiscovery(name)
+ //	assert.Nil(t, err)
+ //	assert.NotNil(t, res)
+ //}
+ //
+ //func TestNacosServiceDiscovery_CRUD(t *testing.T) {
+ //	if !checkNacosServerAlive() {
+ //		return
+ //	}
+ //	prepareData()
 -//	extension.SetEventDispatcher("mock", func() observer.EventDispatcher {
 -//		return dispatcher.NewMockEventDispatcher()
 -//	})
+ //
+ //	extension.SetGlobalServiceNameMapping(func() mapping.ServiceNameMapping {
+ //		return mapping.NewMockServiceNameMapping()
+ //	})
+ //
 -//	extension.SetAndInitGlobalDispatcher("mock")
+ //	rand.Seed(time.Now().Unix())
+ //	serviceName := "service-name" + strconv.Itoa(rand.Intn(10000))
+ //	id := "id"
+ //	host := "host"
+ //	port := 123
+ //	instance := &registry.DefaultServiceInstance{
+ //		ID:          id,
+ //		ServiceName: serviceName,
+ //		Host:        host,
+ //		Port:        port,
+ //		Enable:      true,
+ //		Healthy:     true,
+ //		Metadata:    nil,
+ //	}
+ //
+ //	// clean data
 -//	serviceDiscovery, err := extension.GetServiceDiscovery(constant.NACOS_KEY)
++//	serviceDiscovery, err := extension.GetServiceDiscovery(constant.NACOS_KEY, testName)
+ //	assert.Nil(t, err)
+ //
+ //	// clean data for local test
+ //	err = serviceDiscovery.Unregister(&registry.DefaultServiceInstance{
+ //		ID:          id,
+ //		ServiceName: serviceName,
+ //		Host:        host,
+ //		Port:        port,
+ //	})
+ //	assert.Nil(t, err)
+ //
+ //	err = serviceDiscovery.Register(instance)
+ //
+ //	assert.Nil(t, err)
+ //
+ //	// sometimes nacos may be failed to push update of instance,
+ //	// so it need 10s to pull, we sleep 10 second to make sure instance has been update
+ //	time.Sleep(5 * time.Second)
+ //	page := serviceDiscovery.GetHealthyInstancesByPage(serviceName, 0, 10, true)
+ //	assert.NotNil(t, page)
+ //	assert.Equal(t, 0, page.GetOffset())
+ //	assert.Equal(t, 10, page.GetPageSize())
+ //	assert.Equal(t, 1, page.GetDataSize())
+ //
+ //	instance = page.GetData()[0].(*registry.DefaultServiceInstance)
+ //	instance.ServiceName = serviceName
+ //	assert.NotNil(t, instance)
+ //	assert.Equal(t, id, instance.GetID())
+ //	assert.Equal(t, host, instance.GetHost())
+ //	assert.Equal(t, port, instance.GetPort())
+ //	// TODO: console.nacos.io has updated to nacos 2.0 and serviceName has changed in 2.0, so ignore temporarily.
+ //	// assert.Equal(t, serviceName, instance.GetServiceName())
+ //	assert.Equal(t, 0, len(instance.GetMetadata()))
+ //
+ //	instance.Metadata["a"] = "b"
+ //	err = serviceDiscovery.Update(instance)
+ //	assert.Nil(t, err)
+ //
+ //	time.Sleep(5 * time.Second)
+ //	pageMap := serviceDiscovery.GetRequestInstances([]string{serviceName}, 0, 1)
+ //	assert.Equal(t, 1, len(pageMap))
+ //
+ //	page = pageMap[serviceName]
+ //	assert.NotNil(t, page)
+ //	assert.Equal(t, 1, len(page.GetData()))
+ //
+ //	instance = page.GetData()[0].(*registry.DefaultServiceInstance)
+ //	v, ok := instance.Metadata["a"]
+ //	assert.True(t, ok)
+ //	assert.Equal(t, "b", v)
+ //
+ //	// test dispatcher event
 -//	err = serviceDiscovery.DispatchEventByServiceName(serviceName)
 -//	assert.Nil(t, err)
+ //	hs := gxset.NewSet()
+ //	hs.Add(serviceName)
+ //	// test AddListener
+ //	err = serviceDiscovery.AddListener(event.NewServiceInstancesChangedListener(hs))
+ //	assert.Nil(t, err)
+ //}
+ //
+ //func TestNacosServiceDiscovery_GetDefaultPageSize(t *testing.T) {
+ //	prepareData()
 -//	serviceDiscovery, _ := extension.GetServiceDiscovery(constant.NACOS_KEY)
++//	serviceDiscovery, _ := extension.GetServiceDiscovery(constant.NACOS_KEY, testName)
+ //	assert.Equal(t, registry.DefaultPageSize, serviceDiscovery.GetDefaultPageSize())
+ //}
+ //
+ //func TestNacosServiceDiscovery_Destroy(t *testing.T) {
+ //	prepareData()
 -//	serviceDiscovery, err := extension.GetServiceDiscovery(constant.NACOS_KEY)
++//	serviceDiscovery, err := extension.GetServiceDiscovery(constant.NACOS_KEY, testName)
+ //	assert.Nil(t, err)
+ //	assert.NotNil(t, serviceDiscovery)
+ //	err = serviceDiscovery.Destroy()
+ //	assert.Nil(t, err)
+ //}
+ //
+ //func prepareData() {
 -//	config.GetRootConfig().ServiceDiscoveries[testName] = &config.ServiceDiscoveryConfig{
++//	config.GetBaseConfig().ServiceDiscoveries[testName] = &config.ServiceDiscoveryConfig{
+ //		Protocol:  "nacos",
+ //		RemoteRef: testName,
+ //	}
+ //
 -//	config.GetRootConfig().Remotes[testName] = &config.RemoteConfig{
++//	config.GetBaseConfig().Remotes[testName] = &config.RemoteConfig{
+ //		Address:    "console.nacos.io:80",
+ //		TimeoutStr: "10s",
+ //	}
+ //}
diff --cc registry/servicediscovery/service_discovery_registry.go
index 5fffcd4,ba66a3f..3c2a112
--- a/registry/servicediscovery/service_discovery_registry.go
+++ b/registry/servicediscovery/service_discovery_registry.go
@@@ -344,26 -338,5 +330,23 @@@ func tryInitMetadataService(url *common
  	if err != nil {
  		logger.Errorf("could not export the metadata service", err)
  	}
 -	extension.GetGlobalDispatcher().Dispatch(event.NewServiceConfigExportedEvent(expt.(*configurable.MetadataServiceExporter).ServiceConfig))
 +
 +	// report interface-app mapping
 +	err = publishMapping(expt.(*configurable.MetadataServiceExporter).ServiceConfig)
 +	if err != nil {
 +		logger.Errorf("Publish interface-application mapping failed, got error %#v", err)
 +	}
 +}
 +
 +// OnEvent only handle ServiceConfigExportedEvent
 +func publishMapping(sc *config.ServiceConfig) error {
 +	urls := sc.GetExportedUrls()
 +
 +	for _, u := range urls {
- 		err := extension.GetGlobalServiceNameMapping().Map(u.GetParam(constant.INTERFACE_KEY, ""),
- 			u.GetParam(constant.GROUP_KEY, ""),
- 			u.GetParam(constant.Version, ""),
- 			u.Protocol)
++		err := extension.GetGlobalServiceNameMapping().Map(u)
 +		if err != nil {
 +			return perrors.WithMessage(err, "could not map the service: "+u.String())
 +		}
 +	}
 +	return nil
  }
diff --cc registry/servicediscovery/service_discovery_registry_test.go
index d8b8445,84db0a8..29b0e6f
--- a/registry/servicediscovery/service_discovery_registry_test.go
+++ b/registry/servicediscovery/service_discovery_registry_test.go
@@@ -17,199 -17,208 +17,199 @@@
  
  package servicediscovery
  
- import (
- 	"testing"
- )
- 
- import (
- 	gxset "github.com/dubbogo/gost/container/set"
- 	"github.com/dubbogo/gost/hash/page"
- 	"github.com/stretchr/testify/assert"
- )
- 
- import (
- 	"dubbo.apache.org/dubbo-go/v3/common"
- 	"dubbo.apache.org/dubbo-go/v3/common/extension"
- 	"dubbo.apache.org/dubbo-go/v3/config"
- 	"dubbo.apache.org/dubbo-go/v3/metadata/mapping"
- 	"dubbo.apache.org/dubbo-go/v3/metadata/service"
- 	"dubbo.apache.org/dubbo-go/v3/registry"
- )
- 
- var (
- 	serviceInterface = "org.apache.dubbo.metadata.MetadataService"
- 	group            = "dubbo-provider"
- 	version          = "1.0.0"
- )
- 
- func TestServiceDiscoveryRegistry_Register(t *testing.T) {
- 	config.GetApplicationConfig().MetadataType = "mock"
- 	extension.SetLocalMetadataService("mock", func() (service service.MetadataService, err error) {
- 		service = &mockMetadataService{}
- 		return
- 	})
- 
- 	extension.SetServiceDiscovery("mock", func(name string) (discovery registry.ServiceDiscovery, err error) {
- 		return &mockServiceDiscovery{}, nil
- 	})
- 
- 	extension.SetGlobalServiceNameMapping(func() mapping.ServiceNameMapping {
- 		return mapping.NewMockServiceNameMapping()
- 	})
- 
- 	config.GetBaseConfig().ServiceDiscoveries["mock"] = &config.ServiceDiscoveryConfig{
- 		Protocol: "mock",
- 	}
- 	registryURL, _ := common.NewURL("service-discovery://localhost:12345",
- 		common.WithParamsValue("service_discovery", "mock"),
- 		common.WithParamsValue("subscribed-services", "a, b , c,d,e ,"))
- 	url, _ := common.NewURL("dubbo://192.168.0.102:20880/" + serviceInterface +
- 		"?&application=" + group +
- 		"&interface=" + serviceInterface +
- 		"&group=" + group +
- 		"&version=" + version +
- 		"&service_discovery=mock" +
- 		"&methods=getAllServiceKeys,getServiceRestMetadata,getExportedURLs,getAllExportedURLs" +
- 		"&side=provider")
- 	registry, err := newServiceDiscoveryRegistry(registryURL)
- 	assert.Nil(t, err)
- 	assert.NotNil(t, registry)
- 	err = registry.Register(url)
- 	assert.NoError(t, err)
- }
- 
- type mockServiceDiscovery struct{}
- 
- func (m *mockServiceDiscovery) String() string {
- 	panic("implement me")
- }
- 
- func (m *mockServiceDiscovery) Destroy() error {
- 	panic("implement me")
- }
- 
- func (m *mockServiceDiscovery) Register(registry.ServiceInstance) error {
- 	return nil
- }
- 
- func (m *mockServiceDiscovery) Update(registry.ServiceInstance) error {
- 	panic("implement me")
- }
- 
- func (m *mockServiceDiscovery) Unregister(registry.ServiceInstance) error {
- 	panic("implement me")
- }
- 
- func (m *mockServiceDiscovery) GetDefaultPageSize() int {
- 	panic("implement me")
- }
- 
- func (m *mockServiceDiscovery) GetServices() *gxset.HashSet {
- 	panic("implement me")
- }
- 
- func (m *mockServiceDiscovery) GetInstances(string) []registry.ServiceInstance {
- 	panic("implement me")
- }
- 
- func (m *mockServiceDiscovery) GetInstancesByPage(string, int, int) gxpage.Pager {
- 	panic("implement me")
- }
- 
- func (m *mockServiceDiscovery) GetHealthyInstancesByPage(string, int, int, bool) gxpage.Pager {
- 	panic("implement me")
- }
- 
- func (m *mockServiceDiscovery) GetRequestInstances([]string, int, int) map[string]gxpage.Pager {
- 	panic("implement me")
- }
- 
- func (m *mockServiceDiscovery) AddListener(registry.ServiceInstancesChangedListener) error {
- 	panic("implement me")
- }
- 
- func (m *mockServiceDiscovery) DispatchEventByServiceName(string) error {
- 	panic("implement me")
- }
- 
- func (m *mockServiceDiscovery) DispatchEventForInstances(string, []registry.ServiceInstance) error {
- 	panic("implement me")
- }
- 
- func (m *mockServiceDiscovery) DispatchEvent(*registry.ServiceInstancesChangedEvent) error {
- 	panic("implement me")
- }
- 
- type mockMetadataService struct{}
- 
- func (m *mockMetadataService) GetExportedURLs(string, string, string, string) ([]*common.URL, error) {
- 	panic("implement me")
- }
- 
- func (m *mockMetadataService) GetMetadataInfo(revision string) (*common.MetadataInfo, error) {
- 	panic("implement me")
- }
- 
- func (m *mockMetadataService) GetExportedServiceURLs() []*common.URL {
- 	panic("implement me")
- }
- 
- func (m *mockMetadataService) GetMetadataServiceURL() *common.URL {
- 	panic("implement me")
- }
- 
- func (m *mockMetadataService) SetMetadataServiceURL(url *common.URL) {
- 	panic("implement me")
- }
- 
- func (m *mockMetadataService) Reference() string {
- 	panic("implement me")
- }
- 
- func (m *mockMetadataService) ServiceName() (string, error) {
- 	panic("implement me")
- }
- 
- func (m *mockMetadataService) ExportURL(*common.URL) (bool, error) {
- 	return true, nil
- }
- 
- func (m *mockMetadataService) UnexportURL(*common.URL) error {
- 	panic("implement me")
- }
- 
- func (m *mockMetadataService) SubscribeURL(*common.URL) (bool, error) {
- 	panic("implement me")
- }
- 
- func (m *mockMetadataService) UnsubscribeURL(*common.URL) error {
- 	panic("implement me")
- }
- 
- func (m *mockMetadataService) PublishServiceDefinition(*common.URL) error {
- 	return nil
- }
- 
- func (m *mockMetadataService) MethodMapper() map[string]string {
- 	panic("implement me")
- }
- 
- func (m *mockMetadataService) GetSubscribedURLs() ([]*common.URL, error) {
- 	panic("implement me")
- }
- 
- func (m *mockMetadataService) GetServiceDefinition(string, string, string) (string, error) {
- 	panic("implement me")
- }
- 
- func (m *mockMetadataService) GetServiceDefinitionByServiceKey(string) (string, error) {
- 	panic("implement me")
- }
- 
- func (m *mockMetadataService) RefreshMetadata(string, string) (bool, error) {
- 	panic("implement me")
- }
- 
- func (m *mockMetadataService) Version() (string, error) {
- 	panic("implement me")
- }
 -//
+ //import (
+ //	"testing"
+ //)
+ //
+ //import (
+ //	gxset "github.com/dubbogo/gost/container/set"
 -//	gxpage "github.com/dubbogo/gost/hash/page"
 -//
++//	"github.com/dubbogo/gost/hash/page"
+ //	"github.com/stretchr/testify/assert"
+ //)
+ //
+ //import (
+ //	"dubbo.apache.org/dubbo-go/v3/common"
+ //	"dubbo.apache.org/dubbo-go/v3/common/extension"
 -//	"dubbo.apache.org/dubbo-go/v3/common/observer"
 -//	"dubbo.apache.org/dubbo-go/v3/common/observer/dispatcher"
+ //	"dubbo.apache.org/dubbo-go/v3/config"
+ //	"dubbo.apache.org/dubbo-go/v3/metadata/mapping"
+ //	"dubbo.apache.org/dubbo-go/v3/metadata/service"
+ //	"dubbo.apache.org/dubbo-go/v3/registry"
+ //)
+ //
+ //var (
+ //	serviceInterface = "org.apache.dubbo.metadata.MetadataService"
+ //	group            = "dubbo-provider"
+ //	version          = "1.0.0"
+ //)
+ //
+ //func TestServiceDiscoveryRegistry_Register(t *testing.T) {
+ //	config.GetApplicationConfig().MetadataType = "mock"
+ //	extension.SetLocalMetadataService("mock", func() (service service.MetadataService, err error) {
+ //		service = &mockMetadataService{}
+ //		return
+ //	})
+ //
 -//	extension.SetServiceDiscovery("mock", func() (discovery registry.ServiceDiscovery, err error) {
++//	extension.SetServiceDiscovery("mock", func(name string) (discovery registry.ServiceDiscovery, err error) {
+ //		return &mockServiceDiscovery{}, nil
+ //	})
+ //
+ //	extension.SetGlobalServiceNameMapping(func() mapping.ServiceNameMapping {
+ //		return mapping.NewMockServiceNameMapping()
+ //	})
+ //
 -//	extension.SetEventDispatcher("mock", func() observer.EventDispatcher {
 -//		return dispatcher.NewMockEventDispatcher()
 -//	})
 -//	extension.SetAndInitGlobalDispatcher("mock")
 -//
 -//	config.GetRootConfig().ServiceDiscoveries["mock"] = &config.ServiceDiscoveryConfig{
++//	config.GetBaseConfig().ServiceDiscoveries["mock"] = &config.ServiceDiscoveryConfig{
+ //		Protocol: "mock",
+ //	}
+ //	registryURL, _ := common.NewURL("service-discovery://localhost:12345",
+ //		common.WithParamsValue("service_discovery", "mock"),
+ //		common.WithParamsValue("subscribed-services", "a, b , c,d,e ,"))
+ //	url, _ := common.NewURL("dubbo://192.168.0.102:20880/" + serviceInterface +
+ //		"?&application=" + group +
+ //		"&interface=" + serviceInterface +
+ //		"&group=" + group +
+ //		"&version=" + version +
+ //		"&service_discovery=mock" +
+ //		"&methods=getAllServiceKeys,getServiceRestMetadata,getExportedURLs,getAllExportedURLs" +
+ //		"&side=provider")
+ //	registry, err := newServiceDiscoveryRegistry(registryURL)
+ //	assert.Nil(t, err)
+ //	assert.NotNil(t, registry)
+ //	err = registry.Register(url)
+ //	assert.NoError(t, err)
+ //}
+ //
+ //type mockServiceDiscovery struct{}
+ //
+ //func (m *mockServiceDiscovery) String() string {
+ //	panic("implement me")
+ //}
+ //
+ //func (m *mockServiceDiscovery) Destroy() error {
+ //	panic("implement me")
+ //}
+ //
+ //func (m *mockServiceDiscovery) Register(registry.ServiceInstance) error {
+ //	return nil
+ //}
+ //
+ //func (m *mockServiceDiscovery) Update(registry.ServiceInstance) error {
+ //	panic("implement me")
+ //}
+ //
+ //func (m *mockServiceDiscovery) Unregister(registry.ServiceInstance) error {
+ //	panic("implement me")
+ //}
+ //
+ //func (m *mockServiceDiscovery) GetDefaultPageSize() int {
+ //	panic("implement me")
+ //}
+ //
+ //func (m *mockServiceDiscovery) GetServices() *gxset.HashSet {
+ //	panic("implement me")
+ //}
+ //
+ //func (m *mockServiceDiscovery) GetInstances(string) []registry.ServiceInstance {
+ //	panic("implement me")
+ //}
+ //
+ //func (m *mockServiceDiscovery) GetInstancesByPage(string, int, int) gxpage.Pager {
+ //	panic("implement me")
+ //}
+ //
+ //func (m *mockServiceDiscovery) GetHealthyInstancesByPage(string, int, int, bool) gxpage.Pager {
+ //	panic("implement me")
+ //}
+ //
+ //func (m *mockServiceDiscovery) GetRequestInstances([]string, int, int) map[string]gxpage.Pager {
+ //	panic("implement me")
+ //}
+ //
+ //func (m *mockServiceDiscovery) AddListener(registry.ServiceInstancesChangedListener) error {
+ //	panic("implement me")
+ //}
+ //
+ //func (m *mockServiceDiscovery) DispatchEventByServiceName(string) error {
+ //	panic("implement me")
+ //}
+ //
+ //func (m *mockServiceDiscovery) DispatchEventForInstances(string, []registry.ServiceInstance) error {
+ //	panic("implement me")
+ //}
+ //
+ //func (m *mockServiceDiscovery) DispatchEvent(*registry.ServiceInstancesChangedEvent) error {
+ //	panic("implement me")
+ //}
+ //
+ //type mockMetadataService struct{}
+ //
+ //func (m *mockMetadataService) GetExportedURLs(string, string, string, string) ([]*common.URL, error) {
+ //	panic("implement me")
+ //}
+ //
+ //func (m *mockMetadataService) GetMetadataInfo(revision string) (*common.MetadataInfo, error) {
+ //	panic("implement me")
+ //}
+ //
+ //func (m *mockMetadataService) GetExportedServiceURLs() []*common.URL {
+ //	panic("implement me")
+ //}
+ //
+ //func (m *mockMetadataService) GetMetadataServiceURL() *common.URL {
+ //	panic("implement me")
+ //}
+ //
+ //func (m *mockMetadataService) SetMetadataServiceURL(url *common.URL) {
+ //	panic("implement me")
+ //}
+ //
+ //func (m *mockMetadataService) Reference() string {
+ //	panic("implement me")
+ //}
+ //
+ //func (m *mockMetadataService) ServiceName() (string, error) {
+ //	panic("implement me")
+ //}
+ //
+ //func (m *mockMetadataService) ExportURL(*common.URL) (bool, error) {
+ //	return true, nil
+ //}
+ //
+ //func (m *mockMetadataService) UnexportURL(*common.URL) error {
+ //	panic("implement me")
+ //}
+ //
+ //func (m *mockMetadataService) SubscribeURL(*common.URL) (bool, error) {
+ //	panic("implement me")
+ //}
+ //
+ //func (m *mockMetadataService) UnsubscribeURL(*common.URL) error {
+ //	panic("implement me")
+ //}
+ //
+ //func (m *mockMetadataService) PublishServiceDefinition(*common.URL) error {
+ //	return nil
+ //}
+ //
+ //func (m *mockMetadataService) MethodMapper() map[string]string {
+ //	panic("implement me")
+ //}
+ //
+ //func (m *mockMetadataService) GetSubscribedURLs() ([]*common.URL, error) {
+ //	panic("implement me")
+ //}
+ //
+ //func (m *mockMetadataService) GetServiceDefinition(string, string, string) (string, error) {
+ //	panic("implement me")
+ //}
+ //
+ //func (m *mockMetadataService) GetServiceDefinitionByServiceKey(string) (string, error) {
+ //	panic("implement me")
+ //}
+ //
+ //func (m *mockMetadataService) RefreshMetadata(string, string) (bool, error) {
+ //	panic("implement me")
+ //}
+ //
+ //func (m *mockMetadataService) Version() (string, error) {
+ //	panic("implement me")
+ //}
diff --cc registry/zookeeper/service_discovery.go
index b1909ae,4c49cb6..6ea4082
--- a/registry/zookeeper/service_discovery.go
+++ b/registry/zookeeper/service_discovery.go
@@@ -75,40 -62,18 +63,19 @@@ type zookeeperServiceDiscovery struct 
  }
  
  // newZookeeperServiceDiscovery the constructor of newZookeeperServiceDiscovery
- func newZookeeperServiceDiscovery(name string) (registry.ServiceDiscovery, error) {
- 	instance, ok := instanceMap[name]
- 	if ok {
- 		return instance, nil
- 	}
- 
- 	initLock.Lock()
- 	defer initLock.Unlock()
- 
- 	// double check
- 	instance, ok = instanceMap[name]
- 	if ok {
- 		return instance, nil
- 	}
- 
- 	sdc, ok := config.GetBaseConfig().GetServiceDiscoveries(name)
- 	if !ok || len(sdc.RemoteRef) == 0 {
- 		return nil, perrors.New("could not init the instance because the config is invalid")
- 	}
- 	remoteConfig, ok := config.GetBaseConfig().GetRemoteConfig(sdc.RemoteRef)
- 	if !ok {
- 		return nil, perrors.New("could not find the remote config for name: " + sdc.RemoteRef)
- 	}
- 	rootPath := remoteConfig.GetParam("rootPath", "/services")
+ func newZookeeperServiceDiscovery() (registry.ServiceDiscovery, error) {
+ 	metadataReportConfig := config.GetMetadataReportConfg()
+ 	rootPath := "/services"
  	url := common.NewURLWithOptions(
  		common.WithParams(make(url.Values)),
- 		common.WithPassword(remoteConfig.Password),
- 		common.WithUsername(remoteConfig.Username),
- 		common.WithParamsValue(constant.CONFIG_TIMEOUT_KEY, remoteConfig.TimeoutStr))
- 	url.Location = remoteConfig.Address
+ 		common.WithPassword(metadataReportConfig.Password),
+ 		common.WithUsername(metadataReportConfig.Username),
+ 		common.WithParamsValue(constant.REGISTRY_TIMEOUT_KEY, metadataReportConfig.Timeout))
+ 	url.Location = metadataReportConfig.Address
  	zksd := &zookeeperServiceDiscovery{
 -		url:      url,
 -		rootPath: rootPath,
 +		url:                 url,
 +		rootPath:            rootPath,
 +		instanceListenerMap: make(map[string]*gxset.HashSet),
  	}
  	err := zookeeper.ValidateZookeeperClient(zksd, url.Location)
  	if err != nil {
diff --cc remoting/nacos/log/nacos-sdk.log-202109260800
index 0000000,0000000..800ba25
new file mode 100644
--- /dev/null
+++ b/remoting/nacos/log/nacos-sdk.log-202109260800
@@@ -1,0 -1,0 +1,9 @@@
++2021-09-26T17:54:01.705+0800	ERROR	login has error unknown user!
++2021-09-26T17:54:01.705+0800	INFO	udp server start, port: 55385
++2021-09-26T17:54:01.705+0800	INFO	logDir:</Users/laurence/Desktop/workplace/dubbogo/dubbo-go/remoting/nacos/log>   cacheDir:</Users/laurence/Desktop/workplace/dubbogo/dubbo-go/remoting/nacos/cache>
++2021-09-26T18:05:24.602+0800	ERROR	login has error unknown user!
++2021-09-26T18:05:24.604+0800	INFO	udp server start, port: 54988
++2021-09-26T18:05:24.605+0800	INFO	logDir:</Users/laurence/Desktop/workplace/dubbogo/dubbo-go/remoting/nacos/log>   cacheDir:</Users/laurence/Desktop/workplace/dubbogo/dubbo-go/remoting/nacos/cache>
++2021-09-26T18:10:35.126+0800	ERROR	login has error unknown user!
++2021-09-26T18:10:35.129+0800	INFO	udp server start, port: 55071
++2021-09-26T18:10:35.130+0800	INFO	logDir:</Users/laurence/Desktop/workplace/dubbogo/dubbo-go/remoting/nacos/log>   cacheDir:</Users/laurence/Desktop/workplace/dubbogo/dubbo-go/remoting/nacos/cache>