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 := ®istry2.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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [31mERROR[0m [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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [31mERROR[0m [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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [31mERROR[0m [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 [34mINFO[0m udp server start, port: 55716
++2021-09-26T17:53:58.278+0800 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m Local IP:30.225.19.232
++2021-09-26T17:54:03.725+0800 [34mINFO[0m 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 [34mINFO[0m service not found in cache DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc
++2021-09-26T17:54:03.867+0800 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m adding DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc with to listener map
++2021-09-26T17:54:03.943+0800 [34mINFO[0m 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 [34mINFO[0m service not found in cache DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc
++2021-09-26T17:54:04.089+0800 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m adding DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc with to listener map
++2021-09-26T17:54:04.418+0800 [34mINFO[0m 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 [34mINFO[0m service not found in cache DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc
++2021-09-26T17:54:04.493+0800 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m removing @@providers:com.ikurento.user.UserProvider2:1.0.0:guangzhou-idc with to listener map
++2021-09-26T17:54:48.386+0800 [34mINFO[0m adding DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider2:1.0.0:guangzhou-idc with to listener map
++2021-09-26T18:05:22.129+0800 [34mINFO[0m udp server start, port: 55177
++2021-09-26T18:05:22.130+0800 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m Local IP:30.225.19.232
++2021-09-26T18:05:27.365+0800 [34mINFO[0m service not found in cache DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc
++2021-09-26T18:05:27.366+0800 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m adding DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc with to listener map
++2021-09-26T18:05:27.586+0800 [34mINFO[0m 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 [34mINFO[0m service not found in cache DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc
++2021-09-26T18:05:27.737+0800 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m adding DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc with to listener map
++2021-09-26T18:05:27.883+0800 [34mINFO[0m 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 [34mINFO[0m service not found in cache DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc
++2021-09-26T18:05:27.960+0800 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m removing @@providers:com.ikurento.user.UserProvider2:1.0.0:guangzhou-idc with to listener map
++2021-09-26T18:06:11.326+0800 [34mINFO[0m adding DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider2:1.0.0:guangzhou-idc with to listener map
++2021-09-26T18:10:32.159+0800 [34mINFO[0m udp server start, port: 55409
++2021-09-26T18:10:32.160+0800 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m Local IP:30.225.19.232
++2021-09-26T18:10:37.393+0800 [34mINFO[0m 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 [34mINFO[0m service not found in cache DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc
++2021-09-26T18:10:37.543+0800 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m adding DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc with to listener map
++2021-09-26T18:10:37.621+0800 [34mINFO[0m 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 [34mINFO[0m service not found in cache DEFAULT_GROUP@@providers:com.dubbo.user.UserProvider:1.0.0:guangzhou-idc
++2021-09-26T18:10:37.783+0800 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m adding DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc with to listener map
++2021-09-26T18:10:37.927+0800 [34mINFO[0m 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 [34mINFO[0m service not found in cache DEFAULT_GROUP@@providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc
++2021-09-26T18:10:38.008+0800 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m 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 [34mINFO[0m removing @@providers:com.ikurento.user.UserProvider2:1.0.0:guangzhou-idc with to listener map
++2021-09-26T18:11:20.348+0800 [34mINFO[0m 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 := ®istry.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(®istry.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 := ®istry.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(®istry.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 [31mERROR[0m login has error unknown user!
++2021-09-26T17:54:01.705+0800 [34mINFO[0m udp server start, port: 55385
++2021-09-26T17:54:01.705+0800 [34mINFO[0m 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 [31mERROR[0m login has error unknown user!
++2021-09-26T18:05:24.604+0800 [34mINFO[0m udp server start, port: 54988
++2021-09-26T18:05:24.605+0800 [34mINFO[0m 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 [31mERROR[0m login has error unknown user!
++2021-09-26T18:10:35.129+0800 [34mINFO[0m udp server start, port: 55071
++2021-09-26T18:10:35.130+0800 [34mINFO[0m logDir:</Users/laurence/Desktop/workplace/dubbogo/dubbo-go/remoting/nacos/log> cacheDir:</Users/laurence/Desktop/workplace/dubbogo/dubbo-go/remoting/nacos/cache>