You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by li...@apache.org on 2018/12/24 07:48:47 UTC

[incubator-dubbo] branch master updated (a35f942 -> b88bf3a)

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

liujun pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git.


    from a35f942  'continue' statement is unnecessary as the last statement in a loop (#3046)
     add c061ec4  Integrate with dynamic config
     add 23275bd  A basically running dynamic config integration
     add 83076fd  Reformat code
     add c321bbe  New config format
     add 6d95c4d  Add app level configuration
     add 191cae1  Add route part
     add 2b80c3e  fix route cache issue, can run
     add 3cd4603  Merge branch 'master' into dev-metadata
     add 692dbdf  Solve merge conflicts manually
     add 0e133c5  Add Router name and fix routerchain error.
     add efc566c  Add demo method
     add 103cdb3  Check children size is 0 in RouterChain
     add 72e47d9  Refactor tag router
     add 09863b6  Rename GroupRouter to TagRouter
     add 2ba2ddd  Change variable name
     add 01ce1b3  Change ConfigConditionRouter and TagRouter: scope and rules
     add aaa8758  To identify app level or service level changes
     add 553b206  Fix compilation error in UTs
     add 927a7e5  Fix router problems: 1. TagRouter change from global to Application level 2. Add tag rule and condition rule support 3. Fix problem when building RouterChain 4. Change logic of getting invokers from router cache.
     add c0be5e5  Add demo change for tagrouter
     add 6f70f03  Remove duplicate ut classes
     add 0242852  Remove duplicate ut classes
     add 75853a8  Merge branch 'master' into dev-metadata
     add a5695af  Fix problem when rule need to run at runtime.
     add ca057cb  Refactor dynamic config, 1. Extract common method to AbstractDynamicConfiguration 2. Unify strategy when config server cannot be reached at startup: start using local snapshot and try to connect in background.
     add 507f5bf  Update config connecting status when ZK connection changes.
     add 4ef7f28  Fix small bugs and add comments
     add 7edb71c  Fix compilation problem
     add e37319d  Support enabled property.
     add 49f1caa  Fix compilation problem
     add 514fd4e  Support static tag group in TagRouter
     add 3747cc3  Remove useless config item in xsd
     add 612e3ac  Improve the route logic.
     add 714951a  Change for demo and test logic
     add 577eb77  Merge pull request #2468, Simplify registry data and add a new service data store seperated from registry #2030 (#2468)
     add 91fddde  Improvements for dynamic config and router: 1. support route in StaticDirectory, multi-registry & group merger 2. tolerance of abnormal configs from configserver. 3. add check policy when failed to connect to configserver
     add 44fb07f  Demo and ut changes
     add 59dd98a  Merge pull request #2626, simplify registry data and add a new service data store seperated from registry.
     add ab2b736  Merge branch 'dev-metadata' of https://github.com/apache/incubator-dubbo into dev-metadata
     add aef5bb7  Adjust test class, remove version
     add bfa1795  Demo, remove version
     add 515f709  Extract pom dependency version in config-dynamic.
     add 123c66d  Clear dependency of commons-lang in RegistryProtocol
     add 97836c2  Refactor the dynamic-config module to governance module
     add e8da094  Refactor the dynamic-config module to governance module
     add 97a5825  Add test scope pom dependency
     add 9bd9563  Add test scope pom dependency
     add ffdb46b  Rename SPI config file of governance module
     add daf24b3  Remove provided scope restrict of commons-configuration dependency
     add 1646e6c  Enhancements for router chain: 1. make route cache building in RouterChain thread-safe. 2. clear generated routers when urls change. 3. clear invokers in route cache when provider list in notification is empty. 4. add name for each router.
     add de32524  Change the default root directory of zookeeper config center from '/dubbo/config' to '/dubbo'.
     add 413ed71  test registry group
     add 37c22c7  Merge pull request #2672, simplify registry url: rename servicestore to metada & enhancements.
     add 2f9dcf1  Merge branch 'dev-metadata' of https://github.com/apache/incubator-dubbo into dev-metadata
     add 8839c9b  Ignore invalid configurators
     add ac13330  Rename MetadataReportFactory SPI config files
     add 4c51b0d  fix comments
     add e125951  Add dynamic configuration support
     add 9af1f1a  Merge branch 'master' into dev-metadata-config-mergemaster
     add 596721d  Fix compiler error after merge master branch
     add 79812af  Enhancements for dynamic config
     add 93b1cf0  Move UT in config-api to bootstrap temporarily, to solve the unreasonable dependency problem between modules. For long term run, we should refactor the config-api module to stop it from depending on other modules.
     add e6e6689  Changes on demo, for test purpose.
     add d423f55  Add xml schema and spring bean support for ConfigCenterConfig
     add d20a6aa  Change ZooKeeper's data structure as a config center
     add a45bfd4  Move UT in config-api to bootstrap temporarily, to solve the unreasonable dependency problem between modules.
     add 80f9091  Changes for demo
     add 91f1ce8  Merge pull request #2721, Refactor , add switch to simplify registry url and control metadata flow.
     add 65450f5  Merge url part from cvictory and fix configuration override problems
     add b727c87  Merge url part from cvictory and fix configuration override problems
     add 201d1f3  Add app level configuration file; Unified group and namespace in different configcenter implementation.
     add 4b68368  Demo changes.
     add 4097405  Add spring annotation support for ConfigCenter.
     add 220c9da  cherry-pick 4d0a36c435ca59bfcf909c0e76fa2ab024fb7408 from master 重构 ServiceBean 的 isDelay 方法,使其更符合语义
     add 22599b9  Make ReferenceBean depend on ConfigCenterBean, so that ConfigCenterBean can always be initialized before refer.
     add 072b51e  Merge pull request #2744, metadata unit test and generic test, refactor zk store.
     add d85550a  Merge branch 'dev-metadata' of https://github.com/apache/incubator-dubbo into dev-metadata
     add 546b135  override url in directory
     add 708cdb5  Remove default group in DynamicConfiguration API
     add ebb7dd7  Fix problem when parsing override rule
     add 42fac3e  Fix subscribe and parse problems with override protocol.
     add 3d79fe0  Add enabled=true check for override url.
     add e2f664f  record init status.
     add b787ab7  Move refresh action of configs from Spring bean to a Config API.
     add 60b1342  support accepting external configuration from application.
     add b7e8b1e  Merge branch 'dev-metadata-spring-environment' into dev-metadata
     add bdfc500  Fix NPE in TagRouter
     add 042ab09  support standard spring PropertySource
     add e3916ef  add cluster-style address support for configcenter
     add e572f15  merge from base
     add 678b3fd  Merge branch 'dev-metadata' of https://github.com/apache/incubator-dubbo into dev-metadata
     add fd36193  add metadata master flow
     add d3d6025  modify apache license
     add 1aa9138  new pull
     add 98021af  Merge branch 'dev-metadata' into dev-metadata
     add 653f5e4  new pull
     add cd13f62  new pull
     add bab12d2  new pull
     add d93515a  fix review issue: english comments and class format
     add 5ab51cf  Merge branch 'dev-metadata' of https://github.com/apache/incubator-dubbo into dev-metadata
     add 5fcfbce  Merge branch 'dev-metadata' of https://github.com/apache/incubator-dubbo into dev-metadata
     add 0cb75df  Merge branch 'dev-metadata' of https://github.com/apache/incubator-dubbo into dev-metadata
     add 1af7240  modify data store
     add f532ffd  add redis service store support
     add 98daa43  add test
     add d695b5e  add test on serviceStore and serviceStoreFactory
     add f8a9315  Merge branch 'dev-metadata' of https://github.com/apache/incubator-dubbo into dev-metadata
     add fe8380f  add classinfo collect
     add 9f6f0f5  add serviceStoreService test and modify the code
     add 6f86a8e  add tests
     add 0dac06e  add unit test
     add 336ffd1  add unit test
     add 00513f8  zk and redis unit test and fix some bug
     add 5e3415f  fix review issue
     add d3469fd  delete class
     add 462337f  remove author
     add 1dc5d35  remove author
     add a69bc0a  Merge branch 'dev-metadata' of https://github.com/apache/incubator-dubbo into dev-metadata
     add 695d9f8  move getKey from RedisServiceStore to AbstractServiceStore;  modify demo consumer url
     add 10b2af4  modify dubbo configuration key
     add 876b9d6  merge from dev-metadata
     add 5194066  Merge branch 'dev-metadata' of https://github.com/apache/incubator-dubbo into dev-metadata
     add a97bf43  renew the module name, package name, class name
     add 604439a  Merge branch 'dev-metadata' of https://github.com/apache/incubator-dubbo into dev-metadata
     add 0a29783  refactor AbstractMetadataReport
     add 1e6800b  seperate retry from AbstractMetadataReport
     add ca649e3  rename the serviceStore to metadataReport; default MetadataReportFactory to redis
     add f1ea451  Merge branch 'dev-metadata' of https://github.com/apache/incubator-dubbo into dev-metadata
     add 8416db1  refactor the interface and import jaket source
     add 2a8986a  refactor the interface and import jaket source
     add 801eb73  Merge branch 'dev-metadata' of https://github.com/apache/incubator-dubbo into dev-metadata
     add 26f01c9  modify servicestore and refactory abstractMetadataReport
     add 10bca19  add simple registry switch and metadata retry switch
     add a4db979  add simple registry switch and metadata retry switch
     add 6f90215  fix compiler issue
     add 033b58e  remove the group of registry from demo-provider
     add 8600ae4  remove dependent and import
     add a41930e  merge dev-metadata
     add 61bdd46  make demo work
     add 90a9134  merge dev-metadata from upstream and refactor zk store
     add 6b4bae0  merge dev-metadata and add unit test
     add 9d37574  remove origin metadata code , add new metadata test, add generic test for metadata
     add c064b0a  Merge branch 'dev-metadata' of https://github.com/apache/incubator-dubbo into dev-metadata
     add 8f498c9  if no metadata config address, config the log level to warn
     add bc9cf99  Merge branch 'dev-metadata' of https://github.com/apache/incubator-dubbo into dev-metadata
     add c5bc3bc  Merge branch 'dev-metadata' of https://github.com/apache/incubator-dubbo into dev-metadata
     add d8db928  fix :dubbo.properties cannot work on MetadataReportConfig
     add efacb58  Merge branch 'dev-metadata' of https://github.com/apache/incubator-dubbo into dev-metadata
     add 29ef73f  refactor the simplified, add some unit test, fix issue.
     add 21b4334  Merge branch 'dev-metadata' of github.com:apache/incubator-dubbo into dev-metadata
     add d11b876  Merge branch 'dev-metadata' of https://github.com/apache/incubator-dubbo into dev-metadata
     add dbca54c  Merge branch 'master' into dev-metadata
     add 0d0c955  solve dubbo-bootstrap conficts after merged master
     add 5f0d8c8  change how DynamicConfiguration instance is fetched.
     add 46a0580  fix ut
     add dc23a34  Add pom dependency
     add a3f9a54  change log level to info
     add 453e323  ignore parameter(exclude=true).
     add 2e9e85a  avoid repeat init of dynamicconfiguration
     add e430443  modify the variable name and support springbean configuration
     add 1a8e8b1  Merge branch 'dev-metadata' of github.com:apache/incubator-dubbo into dev-metadata
     add 92e8825  Merge branch 'dev-metadata' of https://github.com/apache/incubator-dubbo into dev-metadata
     add 3de0ec0  Restore the previous behaviour
     add 6999c6a  refactor override rule
     add 0a4cce7  rename module name from governance to configcenter
     add a3215cb  refactor governance to configcenter
     add c880720  if the registry type is zookeeper, use the address as default configcenter address.
     add 51146f7  Split the Environment into two parts: Environment in Common and ConfigurationUtils in ConfigCenter
     add 912498a  empty rule protection: "" should not be treated as delete.
     add 0aebefe  modify consumer metadatareport: param type from string to map
     add 1ab215e  add dubbo specification version into registry for ops
     add 701cf26  Merge branch 'dev-metadata' of https://github.com/apache/incubator-dubbo into dev-metadata
     add 3845d78  add apiVersion to override url
     add ecc34c2  Fix reExport, check url to registry changed before do register.
     add 740b5aa  remove unnecessary volatile restrict
     add 9f02b97  Fix configurator bug
     add 6140bc2  Fix concurrent problem of zookeeper configcenter, wait to start until cache being fully populated.
     add 6a1b9ee  Merge pull request #2810, code review and refactor for dubbo-configcenter.
     add 1bebd2d  Fix problems in Configuration: remove cache usage in startupCompositeConfiguration.
     add 607af9d  Merge pull request #2817, code review for dubbo-configcente.
     add 65e1640  support ops; modify properties with split -, fix issue
     add 7adf111  Merge pull request  #2818, code review for AbstractConfig.
     add 1e28f7a  Merge branch 'dev-metadata' of https://github.com/apache/incubator-dubbo into dev-metadata
     add 2d7b8c1  Add extra type match check when override config value.
     add 773d7f4  Fix small bugs find in UT
     add da978fd  does not use parameter key in config metadata
     add 3dfa8d2  Code review around Environment, AbstractConfig, and AbstractPrefixConfiguration's impls. (#2820)
     add 720784c  Merge branch 'dev-metadata' of https://github.com/apache/incubator-dubbo into dev-metadata
     add 8f40549  add missing return statement.
     add 8d8aed2  Merge pull request #2823, Code review for ConfigurationUtils and Environment.
     add 3206dba  store DynamicConfiguration reference in Environment
     add b9ce4a4  Add UT for Configuration
     add 6f61822  try different zookeeper implementations
     add bc3086e  add unit tests
     add d4156cc  upgrade curator version
     add d9e0b64  save one zookeeper implementation as default
     add 0fb3657  temporarily close checkstyle on importing orders
     add d39343e  adjust zookeeper dependency
     add 23f0e52  fix NPE when no listeners registered for key
     add 4700f2c  create separate RouterChain for StaticDirectory
     add a1b9e0a  fix ut
     add 8465e9a  add Apache license
     add 719b5a3  reformat code
     add 7101b6b  reformat code
     add 14d1f97  optimize dynamic configuration api
     add 83a27e8  rename
     add abb62c8  add dependency into dubbo.jar
     add 8f9a76e  Merge branch 'dev-metadata' of https://github.com/apache/incubator-dubbo into dev-metadata
     add 38a8fad  add fixme comment
     add 00b15a4  refactor config-center implementation
     add 7473662  app level override rule should only generate one url
     add 25080d3  add `dubbo.` prefix for tag router key
     add cc943d3  fix unit test
     add 52a325d  Merge pull request #2872, refactor config-center implementation.
     add 92c721b  Merge remote-tracking branch 'origin/dev-metadata' into dev-metadata
     add 6081c9e  add log for rule notification.
     add dfdd424  remove useless file
     add b01e251  fix problem when creating router chain for StaticDirectory (consume multi groups)
     add c94ac7a  Optimize ConfigCenter api and implementation 1. add group to api definition. 2. add removeListener implementation. 3. fix Zookeeper implementation
     add 6007fd3  Optimize service governance: 1. avoid duplicate notification of application level override rule 2. remove route cache 3. support sub menu in ops for router and configurator
     add 0a2aab8  support using multi registries/protocols in config center.
     add e425767  fix problem of governance: configurator & router
     add c2b34c8  unit test
     add 2b01e0c  Merge branch 'dev-metadata' of github.com:apache/incubator-dubbo into dev-metadata
     add 5a9406c  modify metadata store from sync to async
     add d40beeb  add licence
     add 85eb412  remove chinese comments
     add e0bd630  fix unit test
     add 0d3c0da  fix unit test and add licence
     add 48e482e  [DOCS]:[fix comment statement and reformat code] (#2844)
     add d4d827e  remove Provider and ConsumerMetataIdentifier
     add 368a59e  Release resource after use in ConfigParserTest (#2905)
     add e86b89c  resolve conflicts
     add f92f00f  use asyncInterfaceClass
     add c8c5b3d  make sure compatible Router works fine
     add 67c8718  Refactor, put overrides related to Config Center inside ConfigurationListeners
     add c0b277c  generate a empty list for invokerUrls in refreshInvoker if it's null
     add 5b1b14d  set reg status to true after reExport
     add 455943f  add fault tolerant code to avoid NPE
     add 47213f4  fix wrong invokers reference to StaticDirectory under multi-group
     add 5d690d9  add comment
     add 275635e  unify the config key format, sth like: dubbo.registries.id.address=xxx dubbo.registry.address=xxx dubbo.configCenters.apollo.address=xxx dubbo.configCenter.address=xxx
     add 5c2293d  fix UT compile error
     add fdc9202  update demo
     add d962113  fix NPE
     new 4bd2ed4  unify config format.
     new 5184416  fix busy loop caused by singledThreadExecutor
     new b132451  Merge branch 'dev-metadata'
     new ac31d4f  fix compile error.
     new cedba72  fix UT
     new 411abe9  make condition router enabled by default.
     new 96dffe3  set all router rule enabled by default
     new 9897aa3  remove appConfigs cache to support one service/reference registered more than one time (if users don't explicitly add id, cache can not work properly)
     new c20164e  fix wrong reference
     new b88bf3a  Merge branch 'master' of https://github.com/apache/incubator-dubbo

The 10 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 codestyle/checkstyle.xml                           |  10 +-
 dubbo-all/pom.xml                                  |  57 +++
 dubbo-bom/pom.xml                                  |  35 ++
 dubbo-cluster/pom.xml                              |  20 +
 ...rFactory.java => AbstractAppRouterFactory.java} |  24 +-
 ...uterFactory.java => AbstractRouterFactory.java} |  19 +-
 .../org/apache/dubbo/rpc/cluster/Configurator.java |  48 +++
 .../java/org/apache/dubbo/rpc/cluster/Router.java  |  45 ++-
 .../org/apache/dubbo/rpc/cluster/RouterChain.java  | 156 ++++++++
 .../apache/dubbo/rpc/cluster/RouterFactory.java    |   7 +-
 .../cluster/configurator/AbstractConfigurator.java |  75 +++-
 .../cluster/configurator/parser/ConfigParser.java  | 201 ++++++++++
 .../configurator/parser/model/ConfigItem.java      | 103 +++++
 .../parser/model/ConfiguratorConfig.java           |  74 ++++
 .../rpc/cluster/directory/AbstractDirectory.java   |  54 +--
 .../rpc/cluster/directory/StaticDirectory.java     |  35 +-
 .../dubbo/rpc/cluster/router/AbstractRouter.java   | 101 +++++
 .../rpc/cluster/router/AbstractRouterRule.java     | 105 +++++
 .../cluster/router/condition/ConditionRouter.java  |  46 ++-
 .../config/AbstractConfigConditionRouter.java      | 145 +++++++
 .../condition/config/AppConfigConditionRouter.java |  28 +-
 .../config/AppConfigConditionRouterFactory.java}   |  19 +-
 .../config/ServiceConfigConditionRouter.java       |  28 +-
 .../ServiceConfigConditionRouterFactory.java}      |  19 +-
 .../condition/config/model/BlackWhiteListRule.java |  73 ++--
 .../config/model/ConditionRouterRule.java          |  99 +++--
 .../config/model/ConditionRuleParser.java          |  57 +++
 .../router/{ => mock}/MockInvokersSelector.java    | 214 +++++-----
 .../MockRouterFactory.java}                        |  16 +-
 .../rpc/cluster/router/script/ScriptRouter.java    |  32 +-
 .../dubbo/rpc/cluster/router/tag/TagRouter.java    | 217 ++++++++--
 .../rpc/cluster/router/tag/TagRouterFactory.java   |  14 +-
 .../dubbo/rpc/cluster/router/tag/model/Tag.java    |  80 ++--
 .../cluster/router/tag/model/TagRouterRule.java    |  86 ++++
 .../cluster/router/tag/model/TagRuleParser.java    |  45 +++
 .../cluster/support/AbstractClusterInvoker.java    |   2 +-
 .../dubbo/rpc/cluster/support/ClusterUtils.java    |  15 +-
 .../cluster/support/MergeableClusterInvoker.java   |  29 +-
 .../rpc/cluster/support/RegistryAwareCluster.java  |  25 +-
 .../support/RegistryAwareClusterInvoker.java       |  59 +++
 .../internal/org.apache.dubbo.rpc.cluster.Cluster  |   3 +-
 .../org.apache.dubbo.rpc.cluster.RouterFactory     |   5 +-
 .../configurator/parser/ConfigParserTest.java      | 163 ++++++++
 .../loadbalance/RoundRobinLoadBalanceTest.java     |  32 +-
 .../cluster/router/ConfigConditionRouterTest.java  | 134 +++++++
 .../dubbo/rpc/cluster/router/TagRouterTest.java    |  67 ++++
 .../cluster/router/file/FileRouterEngineTest.java  |  14 +-
 .../rpc/cluster/router/tag/TagRouterTest.java      | 170 --------
 .../support/AbstractClusterInvokerTest.java        |  10 +-
 .../support/wrapper/MockClusterInvokerTest.java    |  22 +-
 .../src/test/resources/AppAnyServices.yml          |  32 ++
 .../src/test/resources/AppMultiServices.yml        |  32 ++
 dubbo-cluster/src/test/resources/AppNoService.yml  |  32 ++
 dubbo-cluster/src/test/resources/ConditionRule.yml |  56 +++
 .../test/resources/ConsumerSpecificProviders.yml   |  34 ++
 .../src/test/resources/ServiceGroupVersion.yml     |  29 ++
 .../src/test/resources/ServiceMultiApps.yml        |  30 ++
 dubbo-cluster/src/test/resources/ServiceNoApp.yml  |  29 ++
 dubbo-cluster/src/test/resources/ServiceNoRule.yml |  28 ++
 dubbo-cluster/src/test/resources/TagRule.yml       |  31 ++
 .../java/org/apache/dubbo/common/Constants.java    |  89 ++++-
 .../src/main/java/org/apache/dubbo/common/URL.java |  62 ++-
 .../dubbo/common/config/AbstractConfiguration.java |  91 +++++
 .../common/config/AbstractPrefixConfiguration.java |  52 +++
 .../common/config/CompositeConfiguration.java      |  82 ++++
 .../apache/dubbo/common/config/Configuration.java  |  82 ++++
 .../dubbo/common/config/ConfigurationUtils.java    |  59 +++
 .../apache/dubbo/common/config/Environment.java    | 172 ++++++++
 .../common/config/EnvironmentConfiguration.java    |  22 +-
 .../dubbo/common/config/InmemoryConfiguration.java |  67 ++++
 .../common/config/PropertiesConfiguration.java     |  28 +-
 .../dubbo/common/config/SystemConfiguration.java   |  27 +-
 .../dubbo/common/extension/ExtensionLoader.java    |  20 +-
 .../org/apache/dubbo/common/utils/ClassHelper.java |  70 ++++
 .../org/apache/dubbo/common/utils/ConfigUtils.java |  40 +-
 .../org/apache/dubbo/common/utils/UrlUtils.java    |  11 +-
 .../config/AbstractPrefixConfigurationTest.java    |  46 +--
 .../common/config/CompositeConfigurationTest.java  |  46 +--
 .../dubbo/common/config/EnvironmentTest.java       |  46 +--
 .../apache/dubbo/common/utils/ConfigUtilsTest.java |  27 --
 dubbo-compatible/pom.xml                           |   7 +-
 .../java/com/alibaba/dubbo/rpc/cluster/Router.java |  34 +-
 .../dubbo/config/RegistryDataConfigTest.java       |  87 ++++
 .../apache/dubbo/generic/GenericServiceTest.java   | 181 ++++++++-
 .../apache/dubbo/rpc/cluster/CompatibleRouter.java |  88 +++--
 .../org/apache/dubbo/service/ComplexObject.java    | 282 +++++++++++++
 .../java/org/apache/dubbo/service/DemoService.java |   8 +-
 .../org/apache/dubbo/service/DemoServiceImpl.java  |  15 +-
 dubbo-config/dubbo-config-api/pom.xml              |   5 +
 .../org/apache/dubbo/config/AbstractConfig.java    | 331 ++++++++++------
 .../dubbo/config/AbstractInterfaceConfig.java      | 297 ++++++++++----
 .../apache/dubbo/config/AbstractMethodConfig.java  |  16 +-
 .../apache/dubbo/config/AbstractServiceConfig.java |  36 +-
 .../org/apache/dubbo/config/ApplicationConfig.java |  29 +-
 .../apache/dubbo/config/ConfigCenterConfig.java    | 313 +++++++++++++++
 .../org/apache/dubbo/config/ConsumerConfig.java    |   8 +-
 .../org/apache/dubbo/config/DubboShutdownHook.java |   9 +-
 ...onitorConfig.java => MetadataReportConfig.java} | 280 ++++++-------
 .../java/org/apache/dubbo/config/MethodConfig.java |  37 ++
 .../java/org/apache/dubbo/config/ModuleConfig.java |   8 +-
 .../org/apache/dubbo/config/MonitorConfig.java     |  13 +-
 .../org/apache/dubbo/config/ProtocolConfig.java    |  11 +-
 .../org/apache/dubbo/config/ReferenceConfig.java   | 121 +++---
 .../org/apache/dubbo/config/RegistryConfig.java    |  49 ++-
 .../apache/dubbo/config/RegistryDataConfig.java    |  86 ++++
 .../org/apache/dubbo/config/ServiceConfig.java     | 177 ++++++---
 .../invoker/DelegateProviderMetaDataInvoker.java   |   2 +-
 .../org/apache/dubbo/config/support/Parameter.java |   2 +
 .../apache/dubbo/config/AbstractConfigTest.java    | 280 ++++++++++++-
 .../dubbo/config/AbstractInterfaceConfigTest.java  |   5 +-
 .../dubbo/config/AbstractReferenceConfigTest.java  |   1 +
 .../dubbo/config/AbstractServiceConfigTest.java    |   1 +
 .../apache/dubbo/config/ApplicationConfigTest.java |   1 +
 .../org/apache/dubbo/config/MethodConfigTest.java  |   1 +
 .../apache/dubbo/config/ProtocolConfigTest.java    |   1 +
 .../apache/dubbo/config/ReferenceConfigTest.java   |   6 +
 .../apache/dubbo/config/RegistryConfigTest.java    |   2 +
 .../org/apache/dubbo/config/ServiceConfigTest.java |   6 +-
 .../org/apache/dubbo/config/api/DemoException.java |  84 ++--
 .../org/apache/dubbo/config/api/DemoService.java   |  72 ++--
 .../java/org/apache/dubbo/config/api/User.java     | 130 +++---
 .../apache/dubbo/config/cache/CacheService.java    |  52 +--
 .../dubbo/config/cache/CacheServiceImpl.java       |  64 +--
 .../org/apache/dubbo/config/cache/CacheTest.java   | 238 +++++------
 .../config/consumer/DemoActionByAnnotation.java    |  68 ++--
 .../dubbo/config/consumer/DemoActionBySetter.java  |  70 ++--
 .../dubbo/config/consumer/DemoInterceptor.java     |  60 +--
 .../DelegateProviderMetaDataInvokerTest.java       |   3 +-
 .../dubbo/config/mock/MockExporterListener.java    |   2 +-
 .../org/apache/dubbo/config/mock/MockRegistry.java |  16 +-
 .../dubbo/config/mock/MockRegistryFactory.java     |   2 +-
 .../apache/dubbo/config/mock/MockThreadPool.java   |   2 +-
 .../apache/dubbo/config/mock/MockTransporter.java  |   1 +
 .../config/provider/impl/DemoServiceImpl.java      | 100 ++---
 .../org.apache.dubbo.registry.RegistryFactory      |   4 +-
 .../src/test/resources/dubbo.properties            |   2 +
 .../dubbo-config-api/src/test/resources/log4j.xml  |  54 +--
 .../dubbo/config/spring/ConfigCenterBean.java      | 154 ++++++++
 .../apache/dubbo/config/spring/ReferenceBean.java  |  57 ++-
 .../apache/dubbo/config/spring/ServiceBean.java    |  76 +++-
 .../annotation/DubboConfigConfiguration.java       |  12 +-
 .../spring/schema/DubboBeanDefinitionParser.java   |  46 +--
 .../spring/schema/DubboNamespaceHandler.java       |   2 +
 .../src/main/resources/META-INF/compat/dubbo.xsd   | 137 ++++++-
 .../src/main/resources/META-INF/dubbo.xsd          | 128 ++++++
 .../dubbo-configcenter-api}/pom.xml                |  14 +-
 .../configcenter/AbstractDynamicConfiguration.java | 127 ++++++
 .../AbstractDynamicConfigurationFactory.java       |  26 +-
 .../dubbo/configcenter/ConfigChangeEvent.java      |  63 +++
 .../dubbo/configcenter/ConfigChangeType.java       |  63 +--
 .../dubbo/configcenter/ConfigurationListener.java  |  57 +--
 .../dubbo/configcenter/DynamicConfiguration.java   | 106 +++++
 .../configcenter/DynamicConfigurationFactory.java  |  56 +--
 .../support/nop/NopDynamicConfiguration.java       |  66 ++++
 .../nop/NopDynamicConfigurationFactory.java        |  17 +-
 ....dubbo.configcenter.DynamicConfigurationFactory |   1 +
 .../mock/AbstractDynamicConfigurationTest.java     |  47 +++
 .../mock/MockDynamicConfiguration.java             |  64 +++
 .../mock/MockDynamicConfigurationFactory.java      |  17 +-
 ....dubbo.configcenter.DynamicConfigurationFactory |   1 +
 .../dubbo-configcenter-apollo}/pom.xml             |  16 +-
 .../support/apollo/ApolloDynamicConfiguration.java | 191 +++++++++
 .../apollo/ApolloDynamicConfigurationFactory.java  |  18 +-
 ....dubbo.configcenter.DynamicConfigurationFactory |   1 +
 .../dubbo-configcenter-zookeeper}/pom.xml          |  43 +-
 .../support/zookeeper/CacheListener.java           | 119 ++++++
 .../zookeeper/ZookeeperDynamicConfiguration.java   | 162 ++++++++
 .../ZookeeperDynamicConfigurationFactory.java      |  20 +-
 ....dubbo.configcenter.DynamicConfigurationFactory |   1 +
 .../ZookeeperDynamicConfigurationTest.java         | 151 +++++++
 {dubbo-cluster => dubbo-configcenter}/pom.xml      |  22 +-
 dubbo-container/dubbo-container-log4j/pom.xml      |   5 +
 .../dubbo/container/log4j/Log4jContainer.java      |   8 +-
 .../java/org/apache/dubbo/demo/DemoService.java    |   4 +
 dubbo-demo/dubbo-demo-consumer/pom.xml             |  14 +-
 .../org/apache/dubbo/demo/consumer/Consumer.java   |   8 +
 .../dubbo/demo/consumer/DemoServiceMock.java       |  24 +-
 .../META-INF/spring/dubbo-demo-consumer.xml        |   8 +-
 dubbo-demo/dubbo-demo-provider/pom.xml             |  18 +-
 .../dubbo/demo/provider/DemoServiceImpl.java       |  12 +
 .../META-INF/spring/dubbo-demo-provider.xml        |  86 ++--
 dubbo-dependencies-bom/pom.xml                     |  54 ++-
 .../dubbo-metadata-definition}/pom.xml             |  27 +-
 .../definition/ServiceDefinitionBuilder.java       | 107 +++++
 .../metadata/definition/TypeDefinitionBuilder.java |  79 ++++
 .../definition/builder/ArrayTypeBuilder.java       | 119 +++---
 .../definition/builder/CollectionTypeBuilder.java  |  79 ++++
 .../definition/builder/DefaultTypeBuilder.java     |  70 ++++
 .../definition/builder/EnumTypeBuilder.java        |  63 +++
 .../definition/builder/MapTypeBuilder.java         |  76 ++++
 .../metadata/definition/builder/TypeBuilder.java   |  82 ++--
 .../definition/model/FullServiceDefinition.java    |  30 +-
 .../definition/model/MethodDefinition.java         |  92 +++++
 .../definition/model/ServiceDefinition.java        |  96 +++++
 .../metadata/definition/model/TypeDefinition.java  | 124 ++++++
 .../dubbo/metadata/definition/util/ClassUtils.java | 111 ++++++
 .../definition/util/JaketConfigurationUtils.java   | 100 +++++
 .../dubbo/metadata/definition/MetadataTest.java    | 143 +++++++
 .../dubbo/metadata/definition/MetadataUtils.java   |  75 ++++
 .../definition/ServiceDefinitionBuildderTest.java  |  98 +++++
 .../definition/common/ClassExtendsMap.java         |  19 +-
 .../metadata/definition/common/ColorEnum.java      |  45 ++-
 .../metadata/definition/common/OuterClass.java     |  72 ++--
 .../common/ResultWithRawCollections.java           |  96 +++--
 .../metadata/definition/common/TestService.java    |  98 +++--
 .../metadata/definition/service/ComplexObject.java | 296 ++++++++++++++
 .../metadata/definition/service}/DemoService.java  |  67 ++--
 .../dubbo-metadata-report-api}/pom.xml             |  53 ++-
 .../metadata/identifier/MetadataIdentifier.java    | 125 ++++++
 .../integration/MetadataReportService.java         | 103 +++++
 .../dubbo/metadata/store/MetadataReport.java       |  73 ++--
 .../metadata/store/MetadataReportFactory.java      |  56 +--
 .../metadata/support/AbstractMetadataReport.java   | 407 +++++++++++++++++++
 .../support/AbstractMetadataReportFactory.java     |  64 +++
 .../integration/InterfaceNameTestService.java      |  48 +--
 .../integration/InterfaceNameTestService2.java     |  48 +--
 .../integration/MetadataReportServiceTest.java     | 137 +++++++
 .../metadata/integration/RetryTestService.java     |  53 +--
 .../store/test/JTestMetadataReport4Test.java       |  69 ++++
 .../test/JTestMetadataReportFactory4Test.java      |  25 +-
 .../support/AbstractMetadataReportFactoryTest.java |  94 +++++
 .../support/AbstractMetadataReportTest.java        | 323 +++++++++++++++
 ...ache.dubbo.metadata.store.MetadataReportFactory |   1 +
 .../dubbo-metadata-report-redis}/pom.xml           |  35 +-
 .../metadata/store/redis/RedisMetadataReport.java  |  63 +++
 .../store/redis/RedisMetadataReportFactory.java    |  17 +-
 ...ache.dubbo.metadata.store.MetadataReportFactory |   1 +
 .../store/redis/RedisMetadata4TstService.java      |  12 +
 .../store/redis/RedisMetadataReportTest.java       | 130 ++++++
 .../dubbo-metadata-report-zookeeper}/pom.xml       |  29 +-
 .../store/zookeeper/ZookeeperMetadataReport.java   |  94 +++++
 .../zookeeper/ZookeeperMetadataReportFactory.java  |  25 +-
 ...ache.dubbo.metadata.store.MetadataReportFactory |   1 +
 .../ZookeeperMetadataReport4TstService.java        |  11 +
 .../zookeeper/ZookeeperMetadataReportTest.java     | 125 ++++++
 {dubbo-cluster => dubbo-metadata-report}/pom.xml   |  35 +-
 dubbo-plugin/dubbo-qos/pom.xml                     |   2 +-
 dubbo-registry/dubbo-registry-api/pom.xml          |  23 +-
 .../integration/AbstractConfiguratorListener.java  |  71 ++++
 .../registry/integration/RegistryDirectory.java    | 439 +++++++++++++--------
 .../registry/integration/RegistryProtocol.java     | 317 +++++++++++----
 .../registry/support/ProviderConsumerRegTable.java |  48 ++-
 .../registry/support/ProviderInvokerWrapper.java   |   9 +
 .../java/org/apache/dubbo/registry/ZKTools.java    | 307 ++++++++++++++
 dubbo-registry/dubbo-registry-default/pom.xml      |   5 +
 .../registry/dubbo/RegistryDirectoryTest.java      |  18 +-
 .../dubbo/registry/dubbo/RegistryProtocolTest.java |   1 -
 .../registry/integration/RegistryProtocolTest.java |  23 ++
 .../dubbo/remoting/zookeeper/ZookeeperClient.java  |   4 +
 .../zookeeper/curator/CuratorZookeeperClient.java  |  40 ++
 .../zookeeper/support/AbstractZookeeperClient.java |  28 ++
 .../zookeeper/zkclient/ZkClientWrapper.java        |  15 +
 .../zkclient/ZkclientZookeeperClient.java          |  25 ++
 .../curator/CuratorZookeeperClientTest.java        |  30 +-
 .../zkclient/ZkclientZookeeperClientTest.java      |  30 +-
 .../java/org/apache/dubbo/rpc/AsyncContext.java    |   1 +
 .../java/org/apache/dubbo/rpc/AsyncRpcResult.java  |   4 +-
 .../main/java/org/apache/dubbo/rpc/RpcContext.java |   5 +-
 .../java/org/apache/dubbo/rpc/RpcException.java    |   5 +
 .../org/apache/dubbo/rpc/filter/ContextFilter.java |   1 -
 .../apache/dubbo/rpc/model/ApplicationModel.java   |  10 +
 dubbo-rpc/dubbo-rpc-dubbo/pom.xml                  |   5 +
 .../dubbo/rpc/protocol/dubbo/DubboInvoker.java     |   4 +-
 .../dubbo/rpc/protocol/dubbo/DubboProtocol.java    |   8 +-
 .../protocol/dubbo/DubboInvokerAvilableTest.java   |   3 +-
 .../dubbo/rpc/protocol/thrift/ThriftProtocol.java  |   4 +-
 .../webservice/WebserviceProtocolTest.java         |   4 +-
 .../dubbo/test/provider/DefaultDemoService.java    |  10 +
 pom.xml                                            |   2 +
 269 files changed, 13754 insertions(+), 3059 deletions(-)
 copy dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/{router/tag/TagRouterFactory.java => AbstractAppRouterFactory.java} (67%)
 copy dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/{router/tag/TagRouterFactory.java => AbstractRouterFactory.java} (57%)
 create mode 100644 dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/RouterChain.java
 create mode 100644 dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/parser/ConfigParser.java
 create mode 100644 dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/parser/model/ConfigItem.java
 create mode 100644 dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/parser/model/ConfiguratorConfig.java
 create mode 100644 dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/AbstractRouter.java
 create mode 100644 dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/AbstractRouterRule.java
 create mode 100644 dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/AbstractConfigConditionRouter.java
 copy dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/mock/MockRegistryFactory.java => dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/AppConfigConditionRouter.java (52%)
 copy dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/{tag/TagRouterFactory.java => condition/config/AppConfigConditionRouterFactory.java} (62%)
 copy dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/mock/MockRegistryFactory.java => dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/ServiceConfigConditionRouter.java (53%)
 copy dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/{tag/TagRouterFactory.java => condition/config/ServiceConfigConditionRouterFactory.java} (62%)
 copy dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/api/DemoService.java => dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/model/BlackWhiteListRule.java (67%)
 copy dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/provider/impl/DemoServiceImpl.java => dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/model/ConditionRouterRule.java (55%)
 create mode 100644 dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/model/ConditionRuleParser.java
 rename dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/{ => mock}/MockInvokersSelector.java (88%)
 copy dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/{tag/TagRouterFactory.java => mock/MockRouterFactory.java} (81%)
 copy dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/api/DemoService.java => dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/model/Tag.java (65%)
 create mode 100644 dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/model/TagRouterRule.java
 create mode 100644 dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/model/TagRuleParser.java
 copy dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/mock/MockRegistryFactory.java => dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/RegistryAwareCluster.java (63%)
 create mode 100644 dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/RegistryAwareClusterInvoker.java
 create mode 100644 dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/configurator/parser/ConfigParserTest.java
 create mode 100644 dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/ConfigConditionRouterTest.java
 create mode 100644 dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/TagRouterTest.java
 delete mode 100644 dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouterTest.java
 create mode 100644 dubbo-cluster/src/test/resources/AppAnyServices.yml
 create mode 100644 dubbo-cluster/src/test/resources/AppMultiServices.yml
 create mode 100644 dubbo-cluster/src/test/resources/AppNoService.yml
 create mode 100644 dubbo-cluster/src/test/resources/ConditionRule.yml
 create mode 100644 dubbo-cluster/src/test/resources/ConsumerSpecificProviders.yml
 create mode 100644 dubbo-cluster/src/test/resources/ServiceGroupVersion.yml
 create mode 100644 dubbo-cluster/src/test/resources/ServiceMultiApps.yml
 create mode 100644 dubbo-cluster/src/test/resources/ServiceNoApp.yml
 create mode 100644 dubbo-cluster/src/test/resources/ServiceNoRule.yml
 create mode 100644 dubbo-cluster/src/test/resources/TagRule.yml
 create mode 100644 dubbo-common/src/main/java/org/apache/dubbo/common/config/AbstractConfiguration.java
 create mode 100644 dubbo-common/src/main/java/org/apache/dubbo/common/config/AbstractPrefixConfiguration.java
 create mode 100644 dubbo-common/src/main/java/org/apache/dubbo/common/config/CompositeConfiguration.java
 create mode 100644 dubbo-common/src/main/java/org/apache/dubbo/common/config/Configuration.java
 create mode 100644 dubbo-common/src/main/java/org/apache/dubbo/common/config/ConfigurationUtils.java
 create mode 100644 dubbo-common/src/main/java/org/apache/dubbo/common/config/Environment.java
 copy dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouterFactory.java => dubbo-common/src/main/java/org/apache/dubbo/common/config/EnvironmentConfiguration.java (66%)
 create mode 100644 dubbo-common/src/main/java/org/apache/dubbo/common/config/InmemoryConfiguration.java
 copy dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/mock/MockRegistryFactory.java => dubbo-common/src/main/java/org/apache/dubbo/common/config/PropertiesConfiguration.java (54%)
 copy dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/mock/MockRegistryFactory.java => dubbo-common/src/main/java/org/apache/dubbo/common/config/SystemConfiguration.java (61%)
 copy dubbo-demo/dubbo-demo-api/src/main/java/org/apache/dubbo/demo/DemoService.java => dubbo-common/src/test/java/org/apache/dubbo/common/config/AbstractPrefixConfigurationTest.java (86%)
 copy dubbo-demo/dubbo-demo-api/src/main/java/org/apache/dubbo/demo/DemoService.java => dubbo-common/src/test/java/org/apache/dubbo/common/config/CompositeConfigurationTest.java (86%)
 copy dubbo-demo/dubbo-demo-api/src/main/java/org/apache/dubbo/demo/DemoService.java => dubbo-common/src/test/java/org/apache/dubbo/common/config/EnvironmentTest.java (86%)
 create mode 100644 dubbo-compatible/src/test/java/org/apache/dubbo/config/RegistryDataConfigTest.java
 copy dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Configurator.java => dubbo-compatible/src/test/java/org/apache/dubbo/rpc/cluster/CompatibleRouter.java (59%)
 create mode 100644 dubbo-compatible/src/test/java/org/apache/dubbo/service/ComplexObject.java
 create mode 100644 dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java
 copy dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/{MonitorConfig.java => MetadataReportConfig.java} (53%)
 create mode 100644 dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/RegistryDataConfig.java
 create mode 100644 dubbo-config/dubbo-config-api/src/test/resources/dubbo.properties
 create mode 100644 dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/ConfigCenterBean.java
 copy {dubbo-container/dubbo-container-log4j => dubbo-configcenter/dubbo-configcenter-api}/pom.xml (73%)
 create mode 100644 dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/AbstractDynamicConfiguration.java
 copy dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/mock/MockRegistryFactory.java => dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/AbstractDynamicConfigurationFactory.java (57%)
 create mode 100644 dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigChangeEvent.java
 copy dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/cache/CacheService.java => dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigChangeType.java (75%)
 copy dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/cache/CacheService.java => dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/ConfigurationListener.java (66%)
 create mode 100644 dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/DynamicConfiguration.java
 copy dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/cache/CacheService.java => dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/DynamicConfigurationFactory.java (77%)
 create mode 100644 dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/support/nop/NopDynamicConfiguration.java
 copy dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouterFactory.java => dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/support/nop/NopDynamicConfigurationFactory.java (67%)
 create mode 100644 dubbo-configcenter/dubbo-configcenter-api/src/main/resources/META-INF/dubbo/org.apache.dubbo.configcenter.DynamicConfigurationFactory
 create mode 100644 dubbo-configcenter/dubbo-configcenter-api/src/test/java/org/apache/dubbo/configcenter/mock/AbstractDynamicConfigurationTest.java
 create mode 100644 dubbo-configcenter/dubbo-configcenter-api/src/test/java/org/apache/dubbo/configcenter/mock/MockDynamicConfiguration.java
 copy dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouterFactory.java => dubbo-configcenter/dubbo-configcenter-api/src/test/java/org/apache/dubbo/configcenter/mock/MockDynamicConfigurationFactory.java (68%)
 create mode 100644 dubbo-configcenter/dubbo-configcenter-api/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.configcenter.DynamicConfigurationFactory
 copy {dubbo-container/dubbo-container-log4j => dubbo-configcenter/dubbo-configcenter-apollo}/pom.xml (67%)
 create mode 100644 dubbo-configcenter/dubbo-configcenter-apollo/src/main/java/org/apache/dubbo/configcenter/support/apollo/ApolloDynamicConfiguration.java
 copy dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouterFactory.java => dubbo-configcenter/dubbo-configcenter-apollo/src/main/java/org/apache/dubbo/configcenter/support/apollo/ApolloDynamicConfigurationFactory.java (67%)
 create mode 100644 dubbo-configcenter/dubbo-configcenter-apollo/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.configcenter.DynamicConfigurationFactory
 copy {dubbo-registry/dubbo-registry-api => dubbo-configcenter/dubbo-configcenter-zookeeper}/pom.xml (53%)
 create mode 100644 dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/CacheListener.java
 create mode 100644 dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfiguration.java
 copy dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/mock/MockRegistryFactory.java => dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfigurationFactory.java (67%)
 create mode 100644 dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.configcenter.DynamicConfigurationFactory
 create mode 100644 dubbo-configcenter/dubbo-configcenter-zookeeper/src/test/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfigurationTest.java
 copy {dubbo-cluster => dubbo-configcenter}/pom.xml (65%)
 copy dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouterFactory.java => dubbo-demo/dubbo-demo-consumer/src/main/java/org/apache/dubbo/demo/consumer/DemoServiceMock.java (69%)
 copy {dubbo-cluster => dubbo-metadata-report/dubbo-metadata-definition}/pom.xml (66%)
 create mode 100755 dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/ServiceDefinitionBuilder.java
 create mode 100755 dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/TypeDefinitionBuilder.java
 copy dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/api/User.java => dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/builder/ArrayTypeBuilder.java (52%)
 mode change 100644 => 100755
 create mode 100755 dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/builder/CollectionTypeBuilder.java
 create mode 100755 dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/builder/DefaultTypeBuilder.java
 create mode 100755 dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/builder/EnumTypeBuilder.java
 create mode 100755 dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/builder/MapTypeBuilder.java
 copy dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Configurator.java => dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/builder/TypeBuilder.java (64%)
 mode change 100644 => 100755
 copy dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/mock/MockRegistryFactory.java => dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/model/FullServiceDefinition.java (60%)
 create mode 100755 dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/model/MethodDefinition.java
 create mode 100755 dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/model/ServiceDefinition.java
 create mode 100755 dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/model/TypeDefinition.java
 create mode 100755 dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/util/ClassUtils.java
 create mode 100755 dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/util/JaketConfigurationUtils.java
 create mode 100644 dubbo-metadata-report/dubbo-metadata-definition/src/test/java/org/apache/dubbo/metadata/definition/MetadataTest.java
 create mode 100644 dubbo-metadata-report/dubbo-metadata-definition/src/test/java/org/apache/dubbo/metadata/definition/MetadataUtils.java
 create mode 100644 dubbo-metadata-report/dubbo-metadata-definition/src/test/java/org/apache/dubbo/metadata/definition/ServiceDefinitionBuildderTest.java
 copy dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouterFactory.java => dubbo-metadata-report/dubbo-metadata-definition/src/test/java/org/apache/dubbo/metadata/definition/common/ClassExtendsMap.java (68%)
 copy dubbo-demo/dubbo-demo-api/src/main/java/org/apache/dubbo/demo/DemoService.java => dubbo-metadata-report/dubbo-metadata-definition/src/test/java/org/apache/dubbo/metadata/definition/common/ColorEnum.java (87%)
 copy dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/cache/CacheServiceImpl.java => dubbo-metadata-report/dubbo-metadata-definition/src/test/java/org/apache/dubbo/metadata/definition/common/OuterClass.java (67%)
 copy dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/api/DemoException.java => dubbo-metadata-report/dubbo-metadata-definition/src/test/java/org/apache/dubbo/metadata/definition/common/ResultWithRawCollections.java (58%)
 copy dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Configurator.java => dubbo-metadata-report/dubbo-metadata-definition/src/test/java/org/apache/dubbo/metadata/definition/common/TestService.java (64%)
 create mode 100644 dubbo-metadata-report/dubbo-metadata-definition/src/test/java/org/apache/dubbo/metadata/definition/service/ComplexObject.java
 copy {dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/api => dubbo-metadata-report/dubbo-metadata-definition/src/test/java/org/apache/dubbo/metadata/definition/service}/DemoService.java (76%)
 copy {dubbo-config/dubbo-config-api => dubbo-metadata-report/dubbo-metadata-report-api}/pom.xml (59%)
 create mode 100644 dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/identifier/MetadataIdentifier.java
 create mode 100644 dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/integration/MetadataReportService.java
 copy dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/api/DemoService.java => dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/store/MetadataReport.java (60%)
 copy dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/cache/CacheService.java => dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/store/MetadataReportFactory.java (72%)
 create mode 100644 dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/support/AbstractMetadataReport.java
 create mode 100644 dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/support/AbstractMetadataReportFactory.java
 copy dubbo-demo/dubbo-demo-api/src/main/java/org/apache/dubbo/demo/DemoService.java => dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/integration/InterfaceNameTestService.java (85%)
 copy dubbo-demo/dubbo-demo-api/src/main/java/org/apache/dubbo/demo/DemoService.java => dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/integration/InterfaceNameTestService2.java (85%)
 create mode 100644 dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/integration/MetadataReportServiceTest.java
 copy dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/cache/CacheService.java => dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/integration/RetryTestService.java (84%)
 create mode 100644 dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/store/test/JTestMetadataReport4Test.java
 copy dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/mock/MockRegistryFactory.java => dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/store/test/JTestMetadataReportFactory4Test.java (55%)
 create mode 100644 dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/support/AbstractMetadataReportFactoryTest.java
 create mode 100644 dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/support/AbstractMetadataReportTest.java
 create mode 100644 dubbo-metadata-report/dubbo-metadata-report-api/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.metadata.store.MetadataReportFactory
 copy {dubbo-plugin/dubbo-qos => dubbo-metadata-report/dubbo-metadata-report-redis}/pom.xml (56%)
 create mode 100644 dubbo-metadata-report/dubbo-metadata-report-redis/src/main/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReport.java
 copy dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouterFactory.java => dubbo-metadata-report/dubbo-metadata-report-redis/src/main/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReportFactory.java (68%)
 create mode 100644 dubbo-metadata-report/dubbo-metadata-report-redis/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.metadata.store.MetadataReportFactory
 create mode 100644 dubbo-metadata-report/dubbo-metadata-report-redis/src/test/java/org/apache/dubbo/metadata/store/redis/RedisMetadata4TstService.java
 create mode 100644 dubbo-metadata-report/dubbo-metadata-report-redis/src/test/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReportTest.java
 copy {dubbo-plugin/dubbo-qos => dubbo-metadata-report/dubbo-metadata-report-zookeeper}/pom.xml (60%)
 create mode 100644 dubbo-metadata-report/dubbo-metadata-report-zookeeper/src/main/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReport.java
 copy dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/mock/MockRegistryFactory.java => dubbo-metadata-report/dubbo-metadata-report-zookeeper/src/main/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReportFactory.java (55%)
 create mode 100644 dubbo-metadata-report/dubbo-metadata-report-zookeeper/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.metadata.store.MetadataReportFactory
 create mode 100644 dubbo-metadata-report/dubbo-metadata-report-zookeeper/src/test/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReport4TstService.java
 create mode 100644 dubbo-metadata-report/dubbo-metadata-report-zookeeper/src/test/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReportTest.java
 copy {dubbo-cluster => dubbo-metadata-report}/pom.xml (57%)
 create mode 100644 dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/AbstractConfiguratorListener.java
 create mode 100644 dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/ZKTools.java
 create mode 100644 dubbo-registry/dubbo-registry-default/src/test/java/org/apache/dubbo/registry/integration/RegistryProtocolTest.java


[incubator-dubbo] 06/10: make condition router enabled by default.

Posted by li...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

liujun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git

commit 411abe9026ea4d6b8c9e73515947c3a520411656
Author: ken.lj <ke...@gmail.com>
AuthorDate: Mon Dec 24 12:17:27 2018 +0800

    make condition router enabled by default.
---
 .../org/apache/dubbo/rpc/cluster/router/condition/ConditionRouter.java  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/ConditionRouter.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/ConditionRouter.java
index 6ba42ee..0cc3da6 100644
--- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/ConditionRouter.java
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/ConditionRouter.java
@@ -196,7 +196,7 @@ public class ConditionRouter extends AbstractRouter implements Comparable<Router
 
     @Override
     public boolean isEnabled() {
-        return url == null ? enabled : url.getParameter(Constants.ENABLED_KEY, false);
+        return url == null ? enabled : url.getParameter(Constants.ENABLED_KEY, true);
     }
 
     @Override


[incubator-dubbo] 03/10: Merge branch 'dev-metadata'

Posted by li...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

liujun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git

commit b1324511d13aad36d14adee7bce71cdbe65a872a
Merge: 678cdb4 5184416
Author: ken.lj <ke...@gmail.com>
AuthorDate: Sun Dec 23 20:29:38 2018 +0800

    Merge branch 'dev-metadata'
    
    # Conflicts:
    #	dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Router.java
    #	dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/ConditionRouter.java
    #	dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/mock/MockInvokersSelector.java
    #	dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/script/ScriptRouter.java
    #	dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java
    #	dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/AbstractClusterInvoker.java
    #	dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java
    #	dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
    #	dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
    #	dubbo-config/dubbo-config-api/src/test/resources/log4j.xml
    #	dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/DubboBeanDefinitionParser.java
    #	dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java
    #	dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/ProviderConsumerRegTable.java
    #	dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java
    #	dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/support/RuntimeExceptionInvoker.java
    #	dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvokerAvilableTest.java
    #	dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/service/GenericServiceTest.java
    #	dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/validation/ValidationParameter.java
    #	dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/validation/ValidationService.java
    #	dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/validation/ValidationTest.java

 codestyle/checkstyle.xml                           |  10 +-
 dubbo-all/pom.xml                                  |  57 +++
 dubbo-bom/pom.xml                                  |  35 ++
 dubbo-cluster/pom.xml                              |  20 +
 ...rFactory.java => AbstractAppRouterFactory.java} |  24 +-
 ...uterFactory.java => AbstractRouterFactory.java} |  19 +-
 .../org/apache/dubbo/rpc/cluster/Configurator.java |  48 +++
 .../java/org/apache/dubbo/rpc/cluster/Router.java  |  45 ++-
 .../org/apache/dubbo/rpc/cluster/RouterChain.java  | 156 ++++++++
 .../apache/dubbo/rpc/cluster/RouterFactory.java    |   7 +-
 .../cluster/configurator/AbstractConfigurator.java |  75 +++-
 .../cluster/configurator/parser/ConfigParser.java  | 201 ++++++++++
 .../configurator/parser/model/ConfigItem.java      | 103 +++++
 .../parser/model/ConfiguratorConfig.java           |  74 ++++
 .../rpc/cluster/directory/AbstractDirectory.java   |  55 +--
 .../rpc/cluster/directory/StaticDirectory.java     |  35 +-
 .../dubbo/rpc/cluster/router/AbstractRouter.java   | 101 +++++
 .../rpc/cluster/router/AbstractRouterRule.java     | 105 +++++
 .../cluster/router/condition/ConditionRouter.java  |  46 ++-
 .../config/AbstractConfigConditionRouter.java      | 145 +++++++
 .../condition/config/AppConfigConditionRouter.java |  28 +-
 .../config/AppConfigConditionRouterFactory.java}   |  19 +-
 .../config/ServiceConfigConditionRouter.java       |  28 +-
 .../ServiceConfigConditionRouterFactory.java}      |  19 +-
 .../condition/config/model/BlackWhiteListRule.java |  73 ++--
 .../config/model/ConditionRouterRule.java          |  99 +++--
 .../config/model/ConditionRuleParser.java          |  57 +++
 .../router/{ => mock}/MockInvokersSelector.java    | 214 +++++-----
 .../MockRouterFactory.java}                        |  16 +-
 .../rpc/cluster/router/script/ScriptRouter.java    |  32 +-
 .../dubbo/rpc/cluster/router/tag/TagRouter.java    | 217 ++++++++--
 .../rpc/cluster/router/tag/TagRouterFactory.java   |  14 +-
 .../dubbo/rpc/cluster/router/tag/model/Tag.java    |  80 ++--
 .../cluster/router/tag/model/TagRouterRule.java    |  86 ++++
 .../cluster/router/tag/model/TagRuleParser.java    |  45 +++
 .../cluster/support/AbstractClusterInvoker.java    |   2 +-
 .../dubbo/rpc/cluster/support/ClusterUtils.java    |  15 +-
 .../cluster/support/MergeableClusterInvoker.java   |  29 +-
 .../rpc/cluster/support/RegistryAwareCluster.java  |  25 +-
 .../support/RegistryAwareClusterInvoker.java       |  59 +++
 .../internal/org.apache.dubbo.rpc.cluster.Cluster  |   3 +-
 .../org.apache.dubbo.rpc.cluster.RouterFactory     |   5 +-
 .../configurator/parser/ConfigParserTest.java      | 167 ++++++++
 .../loadbalance/RoundRobinLoadBalanceTest.java     |  32 +-
 .../cluster/router/ConfigConditionRouterTest.java  | 134 +++++++
 .../dubbo/rpc/cluster/router/TagRouterTest.java    |  67 ++++
 .../cluster/router/file/FileRouterEngineTest.java  |  14 +-
 .../rpc/cluster/router/tag/TagRouterTest.java      | 170 --------
 .../support/AbstractClusterInvokerTest.java        |  10 +-
 .../support/wrapper/MockClusterInvokerTest.java    |  22 +-
 .../src/test/resources/AppAnyServices.yml          |  32 ++
 .../src/test/resources/AppMultiServices.yml        |  32 ++
 dubbo-cluster/src/test/resources/AppNoService.yml  |  32 ++
 dubbo-cluster/src/test/resources/ConditionRule.yml |  56 +++
 .../test/resources/ConsumerSpecificProviders.yml   |  34 ++
 .../src/test/resources/ServiceGroupVersion.yml     |  29 ++
 .../src/test/resources/ServiceMultiApps.yml        |  30 ++
 dubbo-cluster/src/test/resources/ServiceNoApp.yml  |  29 ++
 dubbo-cluster/src/test/resources/ServiceNoRule.yml |  28 ++
 dubbo-cluster/src/test/resources/TagRule.yml       |  31 ++
 .../java/org/apache/dubbo/common/Constants.java    |  89 ++++-
 .../src/main/java/org/apache/dubbo/common/URL.java |  62 ++-
 .../dubbo/common/config/AbstractConfiguration.java |  91 +++++
 .../common/config/AbstractPrefixConfiguration.java |  52 +++
 .../common/config/CompositeConfiguration.java      |  82 ++++
 .../apache/dubbo/common/config/Configuration.java  |  82 ++++
 .../dubbo/common/config/ConfigurationUtils.java    |  59 +++
 .../apache/dubbo/common/config/Environment.java    | 199 ++++++++++
 .../common/config/EnvironmentConfiguration.java    |  22 +-
 .../dubbo/common/config/InmemoryConfiguration.java |  67 ++++
 .../common/config/PropertiesConfiguration.java     |  28 +-
 .../dubbo/common/config/SystemConfiguration.java   |  27 +-
 .../dubbo/common/extension/ExtensionLoader.java    |  20 +-
 .../org/apache/dubbo/common/utils/ClassHelper.java |  70 ++++
 .../org/apache/dubbo/common/utils/ConfigUtils.java |  40 +-
 .../org/apache/dubbo/common/utils/UrlUtils.java    |  11 +-
 .../config/AbstractPrefixConfigurationTest.java    |  46 +--
 .../common/config/CompositeConfigurationTest.java  |  46 +--
 .../dubbo/common/config/EnvironmentTest.java       |  46 +--
 .../apache/dubbo/common/utils/ConfigUtilsTest.java |  27 --
 dubbo-compatible/pom.xml                           |   7 +-
 .../java/com/alibaba/dubbo/rpc/cluster/Router.java |  34 +-
 .../dubbo/config/RegistryDataConfigTest.java       |  87 ++++
 .../apache/dubbo/generic/GenericServiceTest.java   | 181 ++++++++-
 .../apache/dubbo/rpc/cluster/CompatibleRouter.java |  88 +++--
 .../org/apache/dubbo/service/ComplexObject.java    | 282 +++++++++++++
 .../java/org/apache/dubbo/service/DemoService.java |   8 +-
 .../org/apache/dubbo/service/DemoServiceImpl.java  |  15 +-
 dubbo-config/dubbo-config-api/pom.xml              |   5 +
 .../org/apache/dubbo/config/AbstractConfig.java    | 323 +++++++++------
 .../dubbo/config/AbstractInterfaceConfig.java      | 297 ++++++++++----
 .../apache/dubbo/config/AbstractMethodConfig.java  |  16 +-
 .../apache/dubbo/config/AbstractServiceConfig.java |  36 +-
 .../org/apache/dubbo/config/ApplicationConfig.java |  29 +-
 .../apache/dubbo/config/ConfigCenterConfig.java    | 313 +++++++++++++++
 .../org/apache/dubbo/config/ConsumerConfig.java    |   8 +-
 .../org/apache/dubbo/config/DubboShutdownHook.java |   9 +-
 ...onitorConfig.java => MetadataReportConfig.java} | 280 ++++++-------
 .../java/org/apache/dubbo/config/MethodConfig.java |  37 ++
 .../java/org/apache/dubbo/config/ModuleConfig.java |   8 +-
 .../org/apache/dubbo/config/MonitorConfig.java     |  13 +-
 .../org/apache/dubbo/config/ProtocolConfig.java    |  11 +-
 .../org/apache/dubbo/config/ReferenceConfig.java   | 121 +++---
 .../org/apache/dubbo/config/RegistryConfig.java    |  49 ++-
 .../apache/dubbo/config/RegistryDataConfig.java    |  86 ++++
 .../org/apache/dubbo/config/ServiceConfig.java     | 177 ++++++---
 .../invoker/DelegateProviderMetaDataInvoker.java   |   2 +-
 .../org/apache/dubbo/config/support/Parameter.java |   2 +
 .../apache/dubbo/config/AbstractConfigTest.java    | 280 ++++++++++++-
 .../dubbo/config/AbstractInterfaceConfigTest.java  |   5 +-
 .../dubbo/config/AbstractReferenceConfigTest.java  |   1 +
 .../dubbo/config/AbstractServiceConfigTest.java    |   1 +
 .../apache/dubbo/config/ApplicationConfigTest.java |   1 +
 .../org/apache/dubbo/config/MethodConfigTest.java  |   1 +
 .../apache/dubbo/config/ProtocolConfigTest.java    |   1 +
 .../apache/dubbo/config/ReferenceConfigTest.java   |   6 +
 .../apache/dubbo/config/RegistryConfigTest.java    |   2 +
 .../org/apache/dubbo/config/ServiceConfigTest.java |   6 +-
 .../org/apache/dubbo/config/api/DemoException.java |  84 ++--
 .../org/apache/dubbo/config/api/DemoService.java   |  72 ++--
 .../java/org/apache/dubbo/config/api/User.java     | 130 +++---
 .../apache/dubbo/config/cache/CacheService.java    |  52 +--
 .../dubbo/config/cache/CacheServiceImpl.java       |  64 +--
 .../org/apache/dubbo/config/cache/CacheTest.java   | 238 +++++------
 .../config/consumer/DemoActionByAnnotation.java    |  68 ++--
 .../dubbo/config/consumer/DemoActionBySetter.java  |  70 ++--
 .../dubbo/config/consumer/DemoInterceptor.java     |  60 +--
 .../DelegateProviderMetaDataInvokerTest.java       |   3 +-
 .../dubbo/config/mock/MockExporterListener.java    |   2 +-
 .../org/apache/dubbo/config/mock/MockRegistry.java |  16 +-
 .../dubbo/config/mock/MockRegistryFactory.java     |   2 +-
 .../apache/dubbo/config/mock/MockThreadPool.java   |   2 +-
 .../apache/dubbo/config/mock/MockTransporter.java  |   1 +
 .../config/provider/impl/DemoServiceImpl.java      | 100 ++---
 .../org.apache.dubbo.registry.RegistryFactory      |   4 +-
 .../src/test/resources/dubbo.properties            |   2 +
 .../dubbo-config-api/src/test/resources/log4j.xml  |  54 +--
 .../dubbo/config/spring/ConfigCenterBean.java      | 154 ++++++++
 .../apache/dubbo/config/spring/ReferenceBean.java  |  57 ++-
 .../apache/dubbo/config/spring/ServiceBean.java    |  76 +++-
 .../annotation/DubboConfigConfiguration.java       |  12 +-
 .../spring/schema/DubboBeanDefinitionParser.java   |  46 +--
 .../spring/schema/DubboNamespaceHandler.java       |   2 +
 .../src/main/resources/META-INF/compat/dubbo.xsd   | 137 ++++++-
 .../src/main/resources/META-INF/dubbo.xsd          | 128 ++++++
 .../dubbo-configcenter-api}/pom.xml                |  14 +-
 .../configcenter/AbstractDynamicConfiguration.java | 127 ++++++
 .../AbstractDynamicConfigurationFactory.java       |  26 +-
 .../dubbo/configcenter/ConfigChangeEvent.java      |  63 +++
 .../dubbo/configcenter/ConfigChangeType.java       |  63 +--
 .../dubbo/configcenter/ConfigurationListener.java  |  57 +--
 .../dubbo/configcenter/DynamicConfiguration.java   | 106 +++++
 .../configcenter/DynamicConfigurationFactory.java  |  56 +--
 .../support/nop/NopDynamicConfiguration.java       |  66 ++++
 .../nop/NopDynamicConfigurationFactory.java        |  17 +-
 ....dubbo.configcenter.DynamicConfigurationFactory |   1 +
 .../mock/AbstractDynamicConfigurationTest.java     |  47 +++
 .../mock/MockDynamicConfiguration.java             |  64 +++
 .../mock/MockDynamicConfigurationFactory.java      |  17 +-
 ....dubbo.configcenter.DynamicConfigurationFactory |   1 +
 .../dubbo-configcenter-apollo}/pom.xml             |  16 +-
 .../support/apollo/ApolloDynamicConfiguration.java | 191 +++++++++
 .../apollo/ApolloDynamicConfigurationFactory.java  |  18 +-
 ....dubbo.configcenter.DynamicConfigurationFactory |   1 +
 .../dubbo-configcenter-zookeeper}/pom.xml          |  43 +-
 .../support/zookeeper/CacheListener.java           | 119 ++++++
 .../zookeeper/ZookeeperDynamicConfiguration.java   | 162 ++++++++
 .../ZookeeperDynamicConfigurationFactory.java      |  20 +-
 ....dubbo.configcenter.DynamicConfigurationFactory |   1 +
 .../ZookeeperDynamicConfigurationTest.java         | 151 +++++++
 {dubbo-cluster => dubbo-configcenter}/pom.xml      |  22 +-
 dubbo-container/dubbo-container-log4j/pom.xml      |   5 +
 .../dubbo/container/log4j/Log4jContainer.java      |   8 +-
 .../java/org/apache/dubbo/demo/DemoService.java    |   4 +
 dubbo-demo/dubbo-demo-consumer/pom.xml             |  14 +-
 .../org/apache/dubbo/demo/consumer/Consumer.java   |   8 +
 .../dubbo/demo/consumer/DemoServiceMock.java       |  24 +-
 .../META-INF/spring/dubbo-demo-consumer.xml        |   8 +-
 dubbo-demo/dubbo-demo-provider/pom.xml             |  18 +-
 .../dubbo/demo/provider/DemoServiceImpl.java       |  12 +
 .../META-INF/spring/dubbo-demo-provider.xml        |  86 ++--
 dubbo-dependencies-bom/pom.xml                     |  54 ++-
 .../dubbo-metadata-definition}/pom.xml             |  27 +-
 .../definition/ServiceDefinitionBuilder.java       | 107 +++++
 .../metadata/definition/TypeDefinitionBuilder.java |  79 ++++
 .../definition/builder/ArrayTypeBuilder.java       | 119 +++---
 .../definition/builder/CollectionTypeBuilder.java  |  79 ++++
 .../definition/builder/DefaultTypeBuilder.java     |  70 ++++
 .../definition/builder/EnumTypeBuilder.java        |  63 +++
 .../definition/builder/MapTypeBuilder.java         |  76 ++++
 .../metadata/definition/builder/TypeBuilder.java   |  82 ++--
 .../definition/model/FullServiceDefinition.java    |  30 +-
 .../definition/model/MethodDefinition.java         |  92 +++++
 .../definition/model/ServiceDefinition.java        |  96 +++++
 .../metadata/definition/model/TypeDefinition.java  | 124 ++++++
 .../dubbo/metadata/definition/util/ClassUtils.java | 111 ++++++
 .../definition/util/JaketConfigurationUtils.java   | 100 +++++
 .../dubbo/metadata/definition/MetadataTest.java    | 143 +++++++
 .../dubbo/metadata/definition/MetadataUtils.java   |  75 ++++
 .../definition/ServiceDefinitionBuildderTest.java  |  98 +++++
 .../definition/common/ClassExtendsMap.java         |  19 +-
 .../metadata/definition/common/ColorEnum.java      |  45 ++-
 .../metadata/definition/common/OuterClass.java     |  72 ++--
 .../common/ResultWithRawCollections.java           |  96 +++--
 .../metadata/definition/common/TestService.java    |  98 +++--
 .../metadata/definition/service/ComplexObject.java | 296 ++++++++++++++
 .../metadata/definition/service}/DemoService.java  |  67 ++--
 .../dubbo-metadata-report-api}/pom.xml             |  53 ++-
 .../metadata/identifier/MetadataIdentifier.java    | 125 ++++++
 .../integration/MetadataReportService.java         | 103 +++++
 .../dubbo/metadata/store/MetadataReport.java       |  73 ++--
 .../metadata/store/MetadataReportFactory.java      |  56 +--
 .../metadata/support/AbstractMetadataReport.java   | 407 +++++++++++++++++++
 .../support/AbstractMetadataReportFactory.java     |  64 +++
 .../integration/InterfaceNameTestService.java      |  48 +--
 .../integration/InterfaceNameTestService2.java     |  48 +--
 .../integration/MetadataReportServiceTest.java     | 137 +++++++
 .../metadata/integration/RetryTestService.java     |  53 +--
 .../store/test/JTestMetadataReport4Test.java       |  69 ++++
 .../test/JTestMetadataReportFactory4Test.java      |  25 +-
 .../support/AbstractMetadataReportFactoryTest.java |  94 +++++
 .../support/AbstractMetadataReportTest.java        | 323 +++++++++++++++
 ...ache.dubbo.metadata.store.MetadataReportFactory |   1 +
 .../dubbo-metadata-report-redis}/pom.xml           |  35 +-
 .../metadata/store/redis/RedisMetadataReport.java  |  63 +++
 .../store/redis/RedisMetadataReportFactory.java    |  17 +-
 ...ache.dubbo.metadata.store.MetadataReportFactory |   1 +
 .../store/redis/RedisMetadata4TstService.java      |  12 +
 .../store/redis/RedisMetadataReportTest.java       | 130 ++++++
 .../dubbo-metadata-report-zookeeper}/pom.xml       |  29 +-
 .../store/zookeeper/ZookeeperMetadataReport.java   |  94 +++++
 .../zookeeper/ZookeeperMetadataReportFactory.java  |  25 +-
 ...ache.dubbo.metadata.store.MetadataReportFactory |   1 +
 .../ZookeeperMetadataReport4TstService.java        |  11 +
 .../zookeeper/ZookeeperMetadataReportTest.java     | 125 ++++++
 {dubbo-cluster => dubbo-metadata-report}/pom.xml   |  35 +-
 dubbo-plugin/dubbo-qos/pom.xml                     |   2 +-
 dubbo-registry/dubbo-registry-api/pom.xml          |  23 +-
 .../integration/AbstractConfiguratorListener.java  |  71 ++++
 .../registry/integration/RegistryDirectory.java    | 439 +++++++++++++--------
 .../registry/integration/RegistryProtocol.java     | 317 +++++++++++----
 .../registry/support/ProviderConsumerRegTable.java |  48 ++-
 .../registry/support/ProviderInvokerWrapper.java   |   9 +
 .../java/org/apache/dubbo/registry/ZKTools.java    | 307 ++++++++++++++
 dubbo-registry/dubbo-registry-default/pom.xml      |   5 +
 .../registry/dubbo/RegistryDirectoryTest.java      |  18 +-
 .../dubbo/registry/dubbo/RegistryProtocolTest.java |   1 -
 .../registry/integration/RegistryProtocolTest.java |  23 ++
 .../dubbo/remoting/zookeeper/ZookeeperClient.java  |   4 +
 .../zookeeper/curator/CuratorZookeeperClient.java  |  40 ++
 .../zookeeper/support/AbstractZookeeperClient.java |  28 ++
 .../zookeeper/zkclient/ZkClientWrapper.java        |  15 +
 .../zkclient/ZkclientZookeeperClient.java          |  25 ++
 .../curator/CuratorZookeeperClientTest.java        |  30 +-
 .../zkclient/ZkclientZookeeperClientTest.java      |  30 +-
 .../java/org/apache/dubbo/rpc/AsyncContext.java    |   1 +
 .../java/org/apache/dubbo/rpc/AsyncRpcResult.java  |   4 +-
 .../main/java/org/apache/dubbo/rpc/RpcContext.java |   5 +-
 .../java/org/apache/dubbo/rpc/RpcException.java    |   5 +
 .../org/apache/dubbo/rpc/filter/ContextFilter.java |   1 -
 .../apache/dubbo/rpc/model/ApplicationModel.java   |  10 +
 dubbo-rpc/dubbo-rpc-dubbo/pom.xml                  |   5 +
 .../dubbo/rpc/protocol/dubbo/DubboInvoker.java     |   4 +-
 .../dubbo/rpc/protocol/dubbo/DubboProtocol.java    |   8 +-
 .../protocol/dubbo/DubboInvokerAvilableTest.java   |   3 +-
 .../dubbo/rpc/protocol/thrift/ThriftProtocol.java  |   4 +-
 .../webservice/WebserviceProtocolTest.java         |   4 +-
 .../dubbo/test/provider/DefaultDemoService.java    |  10 +
 pom.xml                                            |   2 +
 269 files changed, 13777 insertions(+), 3060 deletions(-)

diff --cc dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/directory/AbstractDirectory.java
index f650b6e,20b0a0e..f44c398
--- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/directory/AbstractDirectory.java
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/directory/AbstractDirectory.java
@@@ -16,24 -16,18 +16,20 @@@
   */
  package org.apache.dubbo.rpc.cluster.directory;
  
- import org.apache.dubbo.common.Constants;
  import org.apache.dubbo.common.URL;
- import org.apache.dubbo.common.extension.ExtensionLoader;
  import org.apache.dubbo.common.logger.Logger;
  import org.apache.dubbo.common.logger.LoggerFactory;
 +import org.apache.dubbo.common.utils.StringUtils;
  import org.apache.dubbo.rpc.Invocation;
  import org.apache.dubbo.rpc.Invoker;
  import org.apache.dubbo.rpc.RpcException;
  import org.apache.dubbo.rpc.cluster.Directory;
  import org.apache.dubbo.rpc.cluster.Router;
- import org.apache.dubbo.rpc.cluster.RouterFactory;
- import org.apache.dubbo.rpc.cluster.router.MockInvokersSelector;
+ import org.apache.dubbo.rpc.cluster.RouterChain;
  
  import java.util.ArrayList;
- import java.util.Collections;
  import java.util.List;
 +import java.util.Map;
  
  /**
   * Abstract implementation of Directory: Invoker list returned from this Directory's list method have been filtered by Routers
@@@ -64,16 -58,9 +60,16 @@@ public abstract class AbstractDirectory
          if (url == null) {
              throw new IllegalArgumentException("url == null");
          }
 -        this.url = url;
 +
 +        if (url.getProtocol().equals(Constants.REGISTRY_PROTOCOL)) {
 +            Map<String, String> queryMap = StringUtils.parseQueryString(url.getParameterAndDecoded(Constants.REFER_KEY));
 +            this.url = url.clearParameters().addParameters(queryMap).removeParameter(Constants.MONITOR_KEY);
 +        } else {
 +            this.url = url;
 +        }
 +
          this.consumerUrl = consumerUrl;
-         setRouters(routers);
+         setRouterChain(routerChain);
      }
  
      @Override
diff --cc dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/script/ScriptRouter.java
index 7c3070a,05815df..f95573c
--- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/script/ScriptRouter.java
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/script/ScriptRouter.java
@@@ -40,9 -40,10 +40,9 @@@ import java.util.concurrent.ConcurrentH
  
  /**
   * ScriptRouter
 - *
   */
- public class ScriptRouter implements Router {
- 
+ public class ScriptRouter extends AbstractRouter {
+     public static final String NAME = "SCRIPT_ROUTER";
      private static final Logger logger = LoggerFactory.getLogger(ScriptRouter.class);
  
      private static final Map<String, ScriptEngine> engines = new ConcurrentHashMap<String, ScriptEngine>();
diff --cc dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/AbstractClusterInvoker.java
index 2d3602a,14e9f07..63486aa
--- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/AbstractClusterInvoker.java
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/AbstractClusterInvoker.java
@@@ -256,8 -257,8 +256,8 @@@ public abstract class AbstractClusterIn
      }
  
      protected void checkInvokers(List<Invoker<T>> invokers, Invocation invocation) {
 -        if (invokers == null || invokers.isEmpty()) {
 +        if (CollectionUtils.isEmpty(invokers)) {
-             throw new RpcException("Failed to invoke the method "
+             throw new RpcException(RpcException.NO_INVOKER_AVAILABLE_AFTER_FILTER, "Failed to invoke the method "
                      + invocation.getMethodName() + " in the service " + getInterface().getName()
                      + ". No provider available for the service " + directory.getUrl().getServiceKey()
                      + " from registry " + directory.getUrl().getAddress()
diff --cc dubbo-common/src/main/java/org/apache/dubbo/common/Constants.java
index c6f8b1f,5c1006b..1750e31
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/Constants.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/Constants.java
@@@ -671,11 -715,41 +725,42 @@@ public class Constants 
  
      public static final String MULTICAST = "multicast";
  
-     public static final String TAG_KEY = "tag";
+     public static final String TAG_KEY = "dubbo.tag";
+ 
+     public static final String FORCE_USE_TAG = "dubbo.force.tag";
+ 
+     public static final String HOST_KEY = "host";
+ 
+     public static final String ADDRESS_KEY = "address";
+ 
+     public static final String RETRY_TIMES_KEY = "retry.times";
+ 
+     public static final String RETRY_PERIOD_KEY = "retry.period";
+ 
+     public static final String SYNC_REPORT_KEY = "sync.report";
+ 
+     public static final String CYCLE_REPORT_KEY = "cycle.report";
+ 
+     public static final String CONFIG_VERSION_KEY = "configVersion";
+ 
+     public static final String COMPATIBLE_CONFIG_KEY = "compatible_config";
+     // package version in the manifest
+     public static final String SPECIFICATION_VERSION_KEY = "specVersion";
+ 
+     public static final String OVERRIDE_PROVIDERS_KEY = "providerAddreses";
+ 
+     public static final String PROTOCOLS_SUFFIX = "dubbo.protocols.";
+ 
+     public static final String PROTOCOL_SUFFIX = "dubbo.protocol.";
+ 
+     public static final String REGISTRIES_SUFFIX = "dubbo.registries.";
+ 
+     public static final String[] DEFAULT_REGISTER_PROVIDER_KEYS = {APPLICATION_KEY, CODEC_KEY, EXCHANGER_KEY, SERIALIZATION_KEY, CLUSTER_KEY, CONNECTIONS_KEY, DEPRECATED_KEY,
+             GROUP_KEY, LOADBALANCE_KEY, MOCK_KEY, PATH_KEY, TIMEOUT_KEY, TOKEN_KEY, VERSION_KEY, WARMUP_KEY, WEIGHT_KEY, TIMESTAMP_KEY, DUBBO_VERSION_KEY, SPECIFICATION_VERSION_KEY};
  
-     public static final String REQUEST_TAG_KEY = "request.tag";
+     public static final String[] DEFAULT_REGISTER_CONSUMER_KEYS = {APPLICATION_KEY, VERSION_KEY, GROUP_KEY, DUBBO_VERSION_KEY, SPECIFICATION_VERSION_KEY};
  
 +    public static final String TELNET = "telnet";
      /*
       * private Constants(){ }
       */
diff --cc dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java
index 7cddb97,a64c73e..952853d
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java
@@@ -1,535 -1,606 +1,606 @@@
 -/*
 - * 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 org.apache.dubbo.config;
 -
 -import org.apache.dubbo.common.Constants;
 -import org.apache.dubbo.common.URL;
 -import org.apache.dubbo.common.config.Configuration;
 -import org.apache.dubbo.common.config.Environment;
 -import org.apache.dubbo.common.extension.ExtensionLoader;
 -import org.apache.dubbo.common.logger.Logger;
 -import org.apache.dubbo.common.logger.LoggerFactory;
 -import org.apache.dubbo.common.utils.ClassHelper;
 -import org.apache.dubbo.common.utils.CollectionUtils;
 -import org.apache.dubbo.common.utils.ReflectUtils;
 -import org.apache.dubbo.common.utils.StringUtils;
 -import org.apache.dubbo.config.support.Parameter;
 -import org.apache.dubbo.rpc.model.ConsumerMethodModel;
 -
 -import java.io.Serializable;
 -import java.lang.reflect.Method;
 -import java.lang.reflect.Modifier;
 -import java.util.HashMap;
 -import java.util.Map;
 -import java.util.Set;
 -import java.util.regex.Matcher;
 -import java.util.regex.Pattern;
 -import java.util.stream.Collectors;
 -
 -/**
 - * Utility methods and public methods for parsing configuration
 - *
 - * @export
 - */
 -public abstract class AbstractConfig implements Serializable {
 -
 -    protected static final Logger logger = LoggerFactory.getLogger(AbstractConfig.class);
 -    private static final long serialVersionUID = 4267533505537413570L;
 -    private static final int MAX_LENGTH = 200;
 -
 -    private static final int MAX_PATH_LENGTH = 200;
 -
 -    private static final Pattern PATTERN_NAME = Pattern.compile("[\\-._0-9a-zA-Z]+");
 -
 -    private static final Pattern PATTERN_MULTI_NAME = Pattern.compile("[,\\-._0-9a-zA-Z]+");
 -
 -    private static final Pattern PATTERN_METHOD_NAME = Pattern.compile("[a-zA-Z][0-9a-zA-Z]*");
 -
 -    private static final Pattern PATTERN_PATH = Pattern.compile("[/\\-$._0-9a-zA-Z]+");
 -
 -    private static final Pattern PATTERN_NAME_HAS_SYMBOL = Pattern.compile("[:*,\\s/\\-._0-9a-zA-Z]+");
 -
 -    private static final Pattern PATTERN_KEY = Pattern.compile("[*,\\-._0-9a-zA-Z]+");
 -    private static final Map<String, String> legacyProperties = new HashMap<String, String>();
 -    private static final String[] SUFFIXES = new String[]{"Config", "Bean"};
 -
 -    static {
 -        legacyProperties.put("dubbo.protocol.name", "dubbo.service.protocol");
 -        legacyProperties.put("dubbo.protocol.host", "dubbo.service.server.host");
 -        legacyProperties.put("dubbo.protocol.port", "dubbo.service.server.port");
 -        legacyProperties.put("dubbo.protocol.threads", "dubbo.service.max.thread.pool.size");
 -        legacyProperties.put("dubbo.consumer.timeout", "dubbo.service.invoke.timeout");
 -        legacyProperties.put("dubbo.consumer.retries", "dubbo.service.max.retry.providers");
 -        legacyProperties.put("dubbo.consumer.check", "dubbo.service.allow.no.provider");
 -        legacyProperties.put("dubbo.service.url", "dubbo.service.address");
 -
 -        // this is only for compatibility
 -        Runtime.getRuntime().addShutdownHook(DubboShutdownHook.getDubboShutdownHook());
 -    }
 -
 -    protected String id;
 -    protected String prefix;
 -
 -    private static String convertLegacyValue(String key, String value) {
 -        if (value != null && value.length() > 0) {
 -            if ("dubbo.service.max.retry.providers".equals(key)) {
 -                return String.valueOf(Integer.parseInt(value) - 1);
 -            } else if ("dubbo.service.allow.no.provider".equals(key)) {
 -                return String.valueOf(!Boolean.parseBoolean(value));
 -            }
 -        }
 -        return value;
 -    }
 -
 -    private static String getTagName(Class<?> cls) {
 -        String tag = cls.getSimpleName();
 -        for (String suffix : SUFFIXES) {
 -            if (tag.endsWith(suffix)) {
 -                tag = tag.substring(0, tag.length() - suffix.length());
 -                break;
 -            }
 -        }
 -        return tag.substring(0, 1).toLowerCase() + tag.substring(1);
 -    }
 -
 -    protected static void appendParameters(Map<String, String> parameters, Object config) {
 -        appendParameters(parameters, config, null);
 -    }
 -
 -    @SuppressWarnings("unchecked")
 -    protected static void appendParameters(Map<String, String> parameters, Object config, String prefix) {
 -        if (config == null) {
 -            return;
 -        }
 -        Method[] methods = config.getClass().getMethods();
 -        for (Method method : methods) {
 -            try {
 -                String name = method.getName();
 -                if (ClassHelper.isGetter(method)) {
 -                    Parameter parameter = method.getAnnotation(Parameter.class);
 -                    if (method.getReturnType() == Object.class || parameter != null && parameter.excluded()) {
 -                        continue;
 -                    }
 -                    String key;
 -                    if (parameter != null && parameter.key().length() > 0) {
 -                        key = parameter.key();
 -                    } else {
 -                        key = calculatePropertyFromGetter(name);
 -                    }
 -                    Object value = method.invoke(config);
 -                    String str = String.valueOf(value).trim();
 -                    if (value != null && str.length() > 0) {
 -                        if (parameter != null && parameter.escaped()) {
 -                            str = URL.encode(str);
 -                        }
 -                        if (parameter != null && parameter.append()) {
 -                            String pre = parameters.get(Constants.DEFAULT_KEY + "." + key);
 -                            if (pre != null && pre.length() > 0) {
 -                                str = pre + "," + str;
 -                            }
 -                            pre = parameters.get(key);
 -                            if (pre != null && pre.length() > 0) {
 -                                str = pre + "," + str;
 -                            }
 -                        }
 -                        if (prefix != null && prefix.length() > 0) {
 -                            key = prefix + "." + key;
 -                        }
 -                        parameters.put(key, str);
 -                    } else if (parameter != null && parameter.required()) {
 -                        throw new IllegalStateException(config.getClass().getSimpleName() + "." + key + " == null");
 -                    }
 -                } else if ("getParameters".equals(name)
 -                        && Modifier.isPublic(method.getModifiers())
 -                        && method.getParameterTypes().length == 0
 -                        && method.getReturnType() == Map.class) {
 -                    Map<String, String> map = (Map<String, String>) method.invoke(config, new Object[0]);
 -                    if (map != null && map.size() > 0) {
 -                        String pre = (prefix != null && prefix.length() > 0 ? prefix + "." : "");
 -                        for (Map.Entry<String, String> entry : map.entrySet()) {
 -                            parameters.put(pre + entry.getKey().replace('-', '.'), entry.getValue());
 -                        }
 -                    }
 -                }
 -            } catch (Exception e) {
 -                throw new IllegalStateException(e.getMessage(), e);
 -            }
 -        }
 -    }
 -
 -    protected static void appendAttributes(Map<String, Object> parameters, Object config) {
 -        appendAttributes(parameters, config, null);
 -    }
 -
 -    protected static void appendAttributes(Map<String, Object> parameters, Object config, String prefix) {
 -        if (config == null) {
 -            return;
 -        }
 -        Method[] methods = config.getClass().getMethods();
 -        for (Method method : methods) {
 -            try {
 -                Parameter parameter = method.getAnnotation(Parameter.class);
 -                if (parameter == null || !parameter.attribute()) {
 -                    continue;
 -                }
 -                String name = method.getName();
 -                if (ClassHelper.isGetter(method)) {
 -                    String key;
 -                    if (parameter.key().length() > 0) {
 -                        key = parameter.key();
 -                    } else {
 -                        key = calculateAttributeFromGetter(name);
 -                    }
 -                    Object value = method.invoke(config);
 -                    if (value != null) {
 -                        if (prefix != null && prefix.length() > 0) {
 -                            key = prefix + "." + key;
 -                        }
 -                        parameters.put(key, value);
 -                    }
 -                }
 -            } catch (Exception e) {
 -                throw new IllegalStateException(e.getMessage(), e);
 -            }
 -        }
 -    }
 -
 -    protected static ConsumerMethodModel.AsyncMethodInfo convertMethodConfig2AyncInfo(MethodConfig methodConfig) {
 -        if (methodConfig == null || (methodConfig.getOninvoke() == null && methodConfig.getOnreturn() == null && methodConfig.getOnthrow() == null)) {
 -            return null;
 -        }
 -
 -        //check config conflict
 -        if (Boolean.FALSE.equals(methodConfig.isReturn()) && (methodConfig.getOnreturn() != null || methodConfig.getOnthrow() != null)) {
 -            throw new IllegalStateException("method config error : return attribute must be set true when onreturn or onthrow has been set.");
 -        }
 -
 -        ConsumerMethodModel.AsyncMethodInfo asyncMethodInfo = new ConsumerMethodModel.AsyncMethodInfo();
 -
 -        asyncMethodInfo.setOninvokeInstance(methodConfig.getOninvoke());
 -        asyncMethodInfo.setOnreturnInstance(methodConfig.getOnreturn());
 -        asyncMethodInfo.setOnthrowInstance(methodConfig.getOnthrow());
 -
 -        try {
 -            String oninvokeMethod = methodConfig.getOninvokeMethod();
 -            if (StringUtils.isNotEmpty(oninvokeMethod)) {
 -                asyncMethodInfo.setOninvokeMethod(getMethodByName(methodConfig.getOninvoke().getClass(), oninvokeMethod));
 -            }
 -
 -            String onreturnMethod = methodConfig.getOnreturnMethod();
 -            if (StringUtils.isNotEmpty(onreturnMethod)) {
 -                asyncMethodInfo.setOnreturnMethod(getMethodByName(methodConfig.getOnreturn().getClass(), onreturnMethod));
 -            }
 -
 -            String onthrowMethod = methodConfig.getOnthrowMethod();
 -            if (StringUtils.isNotEmpty(onthrowMethod)) {
 -                asyncMethodInfo.setOnthrowMethod(getMethodByName(methodConfig.getOnthrow().getClass(), onthrowMethod));
 -            }
 -        } catch (Exception e) {
 -            throw new IllegalStateException(e.getMessage(), e);
 -        }
 -
 -        return asyncMethodInfo;
 -    }
 -
 -    private static Method getMethodByName(Class<?> clazz, String methodName) {
 -        try {
 -            return ReflectUtils.findMethodByMethodName(clazz, methodName);
 -        } catch (Exception e) {
 -            throw new IllegalStateException(e);
 -        }
 -    }
 -
 -    /**
 -     * We only check boolean value at this moment.
 -     *
 -     * @param type
 -     * @param value
 -     * @return
 -     */
 -    private static boolean isTypeMatch(Class<?> type, String value) {
 -        if ((type == boolean.class || type == Boolean.class)
 -                && !("true".equals(value) || "false".equals(value))) {
 -            return false;
 -        }
 -        return true;
 -    }
 -
 -    protected static void checkExtension(Class<?> type, String property, String value) {
 -        checkName(property, value);
 -        if (value != null && value.length() > 0
 -                && !ExtensionLoader.getExtensionLoader(type).hasExtension(value)) {
 -            throw new IllegalStateException("No such extension " + value + " for " + property + "/" + type.getName());
 -        }
 -    }
 -
 -    protected static void checkMultiExtension(Class<?> type, String property, String value) {
 -        checkMultiName(property, value);
 -        if (value != null && value.length() > 0) {
 -            String[] values = value.split("\\s*[,]+\\s*");
 -            for (String v : values) {
 -                if (v.startsWith(Constants.REMOVE_VALUE_PREFIX)) {
 -                    v = v.substring(1);
 -                }
 -                if (Constants.DEFAULT_KEY.equals(v)) {
 -                    continue;
 -                }
 -                if (!ExtensionLoader.getExtensionLoader(type).hasExtension(v)) {
 -                    throw new IllegalStateException("No such extension " + v + " for " + property + "/" + type.getName());
 -                }
 -            }
 -        }
 -    }
 -
 -    protected static void checkLength(String property, String value) {
 -        checkProperty(property, value, MAX_LENGTH, null);
 -    }
 -
 -    protected static void checkPathLength(String property, String value) {
 -        checkProperty(property, value, MAX_PATH_LENGTH, null);
 -    }
 -
 -    protected static void checkName(String property, String value) {
 -        checkProperty(property, value, MAX_LENGTH, PATTERN_NAME);
 -    }
 -
 -    protected static void checkNameHasSymbol(String property, String value) {
 -        checkProperty(property, value, MAX_LENGTH, PATTERN_NAME_HAS_SYMBOL);
 -    }
 -
 -    protected static void checkKey(String property, String value) {
 -        checkProperty(property, value, MAX_LENGTH, PATTERN_KEY);
 -    }
 -
 -    protected static void checkMultiName(String property, String value) {
 -        checkProperty(property, value, MAX_LENGTH, PATTERN_MULTI_NAME);
 -    }
 -
 -    protected static void checkPathName(String property, String value) {
 -        checkProperty(property, value, MAX_PATH_LENGTH, PATTERN_PATH);
 -    }
 -
 -    protected static void checkMethodName(String property, String value) {
 -        checkProperty(property, value, MAX_LENGTH, PATTERN_METHOD_NAME);
 -    }
 -
 -    protected static void checkParameterName(Map<String, String> parameters) {
 -        if (parameters == null || parameters.size() == 0) {
 -            return;
 -        }
 -        for (Map.Entry<String, String> entry : parameters.entrySet()) {
 -            checkNameHasSymbol(entry.getKey(), entry.getValue());
 -        }
 -    }
 -
 -    protected static void checkProperty(String property, String value, int maxlength, Pattern pattern) {
 -        if (value == null || value.length() == 0) {
 -            return;
 -        }
 -        if (value.length() > maxlength) {
 -            throw new IllegalStateException("Invalid " + property + "=\"" + value + "\" is longer than " + maxlength);
 -        }
 -        if (pattern != null) {
 -            Matcher matcher = pattern.matcher(value);
 -            if (!matcher.matches()) {
 -                throw new IllegalStateException("Invalid " + property + "=\"" + value + "\" contains illegal " +
 -                        "character, only digit, letter, '-', '_' or '.' is legal.");
 -            }
 -        }
 -    }
 -
 -    protected static Set<String> getSubProperties(Map<String, String> properties, String prefix) {
 -        return properties.keySet().stream().filter(k -> k.contains(prefix)).map(k -> {
 -            k = k.substring(prefix.length());
 -            return k.substring(0, k.indexOf("."));
 -        }).collect(Collectors.toSet());
 -    }
 -
 -    private static String extractPropertyName(Class<?> clazz, Method setter) throws Exception {
 -        String propertyName = setter.getName().substring("set".length());
 -        Method getter = null;
 -        try {
 -            getter = clazz.getMethod("get" + propertyName);
 -        } catch (NoSuchMethodException e) {
 -            getter = clazz.getMethod("is" + propertyName);
 -        }
 -        Parameter parameter = getter.getAnnotation(Parameter.class);
 -        if (parameter != null && StringUtils.isNotEmpty(parameter.key()) && parameter.useKeyAsProperty()) {
 -            propertyName = parameter.key();
 -        } else {
 -            propertyName = propertyName.substring(0, 1).toLowerCase() + propertyName.substring(1);
 -        }
 -        return propertyName;
 -    }
 -
 -    private static String calculatePropertyFromGetter(String name) {
 -        int i = name.startsWith("get") ? 3 : 2;
 -        return StringUtils.camelToSplitName(name.substring(i, i + 1).toLowerCase() + name.substring(i + 1), ".");
 -    }
 -
 -    private static String calculateAttributeFromGetter(String getter) {
 -        int i = getter.startsWith("get") ? 3 : 2;
 -        return getter.substring(i, i + 1).toLowerCase() + getter.substring(i + 1);
 -    }
 -
 -    @Parameter(excluded = true)
 -    public String getId() {
 -        return id;
 -    }
 -
 -    public void setId(String id) {
 -        this.id = id;
 -    }
 -
 -    public void updateIdIfAbsent(String value) {
 -        if (StringUtils.isNotEmpty(value) && StringUtils.isEmpty(id)) {
 -            this.id = value;
 -        }
 -    }
 -
 -    protected void appendAnnotation(Class<?> annotationClass, Object annotation) {
 -        Method[] methods = annotationClass.getMethods();
 -        for (Method method : methods) {
 -            if (method.getDeclaringClass() != Object.class
 -                    && method.getReturnType() != void.class
 -                    && method.getParameterTypes().length == 0
 -                    && Modifier.isPublic(method.getModifiers())
 -                    && !Modifier.isStatic(method.getModifiers())) {
 -                try {
 -                    String property = method.getName();
 -                    if ("interfaceClass".equals(property) || "interfaceName".equals(property)) {
 -                        property = "interface";
 -                    }
 -                    String setter = "set" + property.substring(0, 1).toUpperCase() + property.substring(1);
 -                    Object value = method.invoke(annotation);
 -                    if (value != null && !value.equals(method.getDefaultValue())) {
 -                        Class<?> parameterType = ReflectUtils.getBoxedClass(method.getReturnType());
 -                        if ("filter".equals(property) || "listener".equals(property)) {
 -                            parameterType = String.class;
 -                            value = StringUtils.join((String[]) value, ",");
 -                        } else if ("parameters".equals(property)) {
 -                            parameterType = Map.class;
 -                            value = CollectionUtils.toStringMap((String[]) value);
 -                        }
 -                        try {
 -                            Method setterMethod = getClass().getMethod(setter, parameterType);
 -                            setterMethod.invoke(this, value);
 -                        } catch (NoSuchMethodException e) {
 -                            // ignore
 -                        }
 -                    }
 -                } catch (Throwable e) {
 -                    logger.error(e.getMessage(), e);
 -                }
 -            }
 -        }
 -    }
 -
 -    /**
 -     * Should be called after Config was fully initialized.
 -     * // FIXME: this method should be completely replaced by appendParameters
 -     *
 -     * @return
 -     * @see AbstractConfig#appendParameters(Map, Object, String)
 -     * <p>
 -     * Notice! This method should include all properties in the returning map, treat @Parameter differently compared to appendParameters.
 -     */
 -    public Map<String, String> getMetaData() {
 -        Map<String, String> metaData = new HashMap<>();
 -        Method[] methods = this.getClass().getMethods();
 -        for (Method method : methods) {
 -            try {
 -                String name = method.getName();
 -                if ((name.startsWith("get") || name.startsWith("is"))
 -                        && !name.equals("get")
 -                        && !"getClass".equals(name)
 -                        && Modifier.isPublic(method.getModifiers())
 -                        && method.getParameterTypes().length == 0
 -                        && ClassHelper.isPrimitive(method.getReturnType())) {
 -                    String prop = calculateAttributeFromGetter(name);
 -                    String key;
 -                    Parameter parameter = method.getAnnotation(Parameter.class);
 -                    if (parameter != null && parameter.key().length() > 0 && parameter.useKeyAsProperty()) {
 -                        key = parameter.key();
 -                    } else {
 -                        key = prop;
 -                    }
 -                    // treat url and configuration differently, the value should always present in configuration though it may not need to present in url.
 -                    //if (method.getReturnType() == Object.class || parameter != null && parameter.excluded()) {
 -                    if (method.getReturnType() == Object.class) {
 -                        metaData.put(key, null);
 -                        continue;
 -                    }
 -                    Object value = method.invoke(this);
 -                    String str = String.valueOf(value).trim();
 -                    if (value != null && str.length() > 0) {
 -                        // ignore escape, keep the original value.
 -                        /*if (parameter != null && parameter.escaped()) {
 -                            str = URL.encode(str);
 -                        }*/
 -                        if (parameter != null && parameter.append()) {
 -                            String pre = String.valueOf(metaData.get(Constants.DEFAULT_KEY + "." + key));
 -                            if (pre != null && pre.length() > 0) {
 -                                str = pre + "," + str;
 -                            }
 -                            pre = String.valueOf(metaData.get(key));
 -                            if (pre != null && pre.length() > 0) {
 -                                str = pre + "," + str;
 -                            }
 -                        }
 -                      /*  if (prefix != null && prefix.length() > 0) {
 -                            key = prefix + "." + key;
 -                        }*/
 -                        metaData.put(key, str);
 -                    } else {
 -                        metaData.put(key, null);
 -                    }
 -                    // TODO check required somewhere else.
 -                    /*else if (parameter != null && parameter.required()) {
 -                        throw new IllegalStateException(this.getClass().getSimpleName() + "." + key + " == null");
 -                    }*/
 -                } else if ("getParameters".equals(name)
 -                        && Modifier.isPublic(method.getModifiers())
 -                        && method.getParameterTypes().length == 0
 -                        && method.getReturnType() == Map.class) {
 -                    Map<String, String> map = (Map<String, String>) method.invoke(this, new Object[0]);
 -                    if (map != null && map.size() > 0) {
 -//                            String pre = (prefix != null && prefix.length() > 0 ? prefix + "." : "");
 -                        for (Map.Entry<String, String> entry : map.entrySet()) {
 -                            metaData.put(entry.getKey().replace('-', '.'), entry.getValue());
 -                        }
 -                    }
 -                }
 -            } catch (Exception e) {
 -                throw new IllegalStateException(e.getMessage(), e);
 -            }
 -        }
 -        return metaData;
 -    }
 -
 -    @Parameter(excluded = true)
 -    public String getPrefix() {
 -        return StringUtils.isNotEmpty(prefix) ? prefix : (Constants.DUBBO + "." + getTagName(this.getClass()));
 -    }
 -
 -    public void setPrefix(String prefix) {
 -        this.prefix = prefix;
 -    }
 -
 -    /**
 -     * TODO: Currently, only support overriding of properties explicitly defined in Config class, doesn't support
 -     * overriding of customized parameters stored in 'parameters'.
 -     */
 -    public void refresh() {
 -        try {
 -            Environment env = Environment.getInstance();
 -            env.addAppConfig(getPrefix(), getId(), getMetaData());
 -            Configuration configuration = env.getConfiguration(getPrefix(), getId());
 -
 -            // loop methods, get override value and set the new value back to method
 -            Method[] methods = getClass().getMethods();
 -            for (Method method : methods) {
 -                if (ClassHelper.isSetter(method)) {
 -                    try {
 -                        String value = configuration.getString(extractPropertyName(getClass(), method));
 -                        // isTypeMatch() is called to avoid duplicate and incorrect update, for example, we have two 'setGeneric' methods in ReferenceConfig.
 -                        if (value != null && ClassHelper.isTypeMatch(method.getParameterTypes()[0], value)) {
 -                            method.invoke(this, ClassHelper.convertPrimitive(method.getParameterTypes()[0], value));
 -                        }
 -                    } catch (NoSuchMethodException e) {
 -                        logger.info("Failed to override the property " + method.getName() + " in " +
 -                                this.getClass().getSimpleName() +
 -                                ", please make sure every property has getter/setter method provided.");
 -                    }
 -                }
 -            }
 -        } catch (Exception e) {
 -            logger.error("Failed to override ", e);
 -        }
 -    }
 -
 -    @Override
 -    public String toString() {
 -        try {
 -            StringBuilder buf = new StringBuilder();
 -            buf.append("<dubbo:");
 -            buf.append(getTagName(getClass()));
 -            Method[] methods = getClass().getMethods();
 -            for (Method method : methods) {
 -                try {
 -                    if (ClassHelper.isGetter(method)) {
 -                        String name = method.getName();
 -                        String key = calculateAttributeFromGetter(name);
 -                        Object value = method.invoke(this);
 -                        if (value != null) {
 -                            buf.append(" ");
 -                            buf.append(key);
 -                            buf.append("=\"");
 -                            buf.append(value);
 -                            buf.append("\"");
 -                        }
 -                    }
 -                } catch (Exception e) {
 -                    logger.warn(e.getMessage(), e);
 -                }
 -            }
 -            buf.append(" />");
 -            return buf.toString();
 -        } catch (Throwable t) {
 -            logger.warn(t.getMessage(), t);
 -            return super.toString();
 -        }
 -    }
 -
 -    /**
 -     * FIXME check @Parameter(required=true) and any conditions that need to match.
 -     */
 -    @Parameter(excluded = true)
 -    public boolean isValid() {
 -        return true;
 -    }
 -
 -}
 +/*
 + * 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 org.apache.dubbo.config;
 +
 +import org.apache.dubbo.common.Constants;
 +import org.apache.dubbo.common.URL;
++import org.apache.dubbo.common.config.Configuration;
++import org.apache.dubbo.common.config.Environment;
 +import org.apache.dubbo.common.extension.ExtensionLoader;
 +import org.apache.dubbo.common.logger.Logger;
 +import org.apache.dubbo.common.logger.LoggerFactory;
++import org.apache.dubbo.common.utils.ClassHelper;
 +import org.apache.dubbo.common.utils.CollectionUtils;
- import org.apache.dubbo.common.utils.ConfigUtils;
 +import org.apache.dubbo.common.utils.ReflectUtils;
 +import org.apache.dubbo.common.utils.StringUtils;
 +import org.apache.dubbo.config.support.Parameter;
 +import org.apache.dubbo.rpc.model.ConsumerMethodModel;
 +
 +import java.io.Serializable;
 +import java.lang.reflect.Method;
 +import java.lang.reflect.Modifier;
 +import java.util.HashMap;
 +import java.util.Map;
++import java.util.Set;
 +import java.util.regex.Matcher;
 +import java.util.regex.Pattern;
++import java.util.stream.Collectors;
 +
 +/**
 + * Utility methods and public methods for parsing configuration
 + *
 + * @export
 + */
 +public abstract class AbstractConfig implements Serializable {
 +
 +    protected static final Logger logger = LoggerFactory.getLogger(AbstractConfig.class);
 +    private static final long serialVersionUID = 4267533505537413570L;
 +    private static final int MAX_LENGTH = 200;
 +
 +    private static final int MAX_PATH_LENGTH = 200;
 +
 +    private static final Pattern PATTERN_NAME = Pattern.compile("[\\-._0-9a-zA-Z]+");
 +
 +    private static final Pattern PATTERN_MULTI_NAME = Pattern.compile("[,\\-._0-9a-zA-Z]+");
 +
 +    private static final Pattern PATTERN_METHOD_NAME = Pattern.compile("[a-zA-Z][0-9a-zA-Z]*");
 +
 +    private static final Pattern PATTERN_PATH = Pattern.compile("[/\\-$._0-9a-zA-Z]+");
 +
 +    private static final Pattern PATTERN_NAME_HAS_SYMBOL = Pattern.compile("[:*,\\s/\\-._0-9a-zA-Z]+");
 +
 +    private static final Pattern PATTERN_KEY = Pattern.compile("[*,\\-._0-9a-zA-Z]+");
 +    private static final Map<String, String> legacyProperties = new HashMap<String, String>();
 +    private static final String[] SUFFIXES = new String[]{"Config", "Bean"};
 +
 +    static {
 +        legacyProperties.put("dubbo.protocol.name", "dubbo.service.protocol");
 +        legacyProperties.put("dubbo.protocol.host", "dubbo.service.server.host");
 +        legacyProperties.put("dubbo.protocol.port", "dubbo.service.server.port");
 +        legacyProperties.put("dubbo.protocol.threads", "dubbo.service.max.thread.pool.size");
 +        legacyProperties.put("dubbo.consumer.timeout", "dubbo.service.invoke.timeout");
 +        legacyProperties.put("dubbo.consumer.retries", "dubbo.service.max.retry.providers");
 +        legacyProperties.put("dubbo.consumer.check", "dubbo.service.allow.no.provider");
 +        legacyProperties.put("dubbo.service.url", "dubbo.service.address");
 +
 +        // this is only for compatibility
 +        DubboShutdownHook.getDubboShutdownHook().register();
 +    }
 +
 +    protected String id;
++    protected String prefix;
 +
 +    private static String convertLegacyValue(String key, String value) {
 +        if (value != null && value.length() > 0) {
 +            if ("dubbo.service.max.retry.providers".equals(key)) {
 +                return String.valueOf(Integer.parseInt(value) - 1);
 +            } else if ("dubbo.service.allow.no.provider".equals(key)) {
 +                return String.valueOf(!Boolean.parseBoolean(value));
 +            }
 +        }
 +        return value;
 +    }
 +
-     protected static void appendProperties(AbstractConfig config) {
-         if (config == null) {
-             return;
-         }
-         String prefix = "dubbo." + getTagName(config.getClass()) + ".";
-         Method[] methods = config.getClass().getMethods();
-         for (Method method : methods) {
-             try {
-                 String name = method.getName();
-                 if (name.length() > 3 && name.startsWith("set") && Modifier.isPublic(method.getModifiers())
-                         && method.getParameterTypes().length == 1 && isPrimitive(method.getParameterTypes()[0])) {
-                     String property = StringUtils.camelToSplitName(name.substring(3, 4).toLowerCase() + name.substring(4), ".");
- 
-                     String value = null;
-                     if (config.getId() != null && config.getId().length() > 0) {
-                         String pn = prefix + config.getId() + "." + property;
-                         value = System.getProperty(pn);
-                         if (!StringUtils.isBlank(value)) {
-                             logger.info("Use System Property " + pn + " to config dubbo");
-                         }
-                     }
-                     if (value == null || value.length() == 0) {
-                         String pn = prefix + property;
-                         value = System.getProperty(pn);
-                         if (!StringUtils.isBlank(value)) {
-                             logger.info("Use System Property " + pn + " to config dubbo");
-                         }
-                     }
-                     if (value == null || value.length() == 0) {
-                         Method getter;
-                         try {
-                             getter = config.getClass().getMethod("get" + name.substring(3));
-                         } catch (NoSuchMethodException e) {
-                             try {
-                                 getter = config.getClass().getMethod("is" + name.substring(3));
-                             } catch (NoSuchMethodException e2) {
-                                 getter = null;
-                             }
-                         }
-                         if (getter != null) {
-                             if (getter.invoke(config) == null) {
-                                 if (config.getId() != null && config.getId().length() > 0) {
-                                     value = ConfigUtils.getProperty(prefix + config.getId() + "." + property);
-                                 }
-                                 if (value == null || value.length() == 0) {
-                                     value = ConfigUtils.getProperty(prefix + property);
-                                 }
-                                 if (value == null || value.length() == 0) {
-                                     String legacyKey = legacyProperties.get(prefix + property);
-                                     if (legacyKey != null && legacyKey.length() > 0) {
-                                         value = convertLegacyValue(legacyKey, ConfigUtils.getProperty(legacyKey));
-                                     }
-                                 }
- 
-                             }
-                         }
-                     }
-                     if (value != null && value.length() > 0) {
-                         method.invoke(config, convertPrimitive(method.getParameterTypes()[0], value));
-                     }
-                 }
-             } catch (Exception e) {
-                 logger.error(e.getMessage(), e);
-             }
-         }
-     }
- 
 +    private static String getTagName(Class<?> cls) {
 +        String tag = cls.getSimpleName();
 +        for (String suffix : SUFFIXES) {
 +            if (tag.endsWith(suffix)) {
 +                tag = tag.substring(0, tag.length() - suffix.length());
 +                break;
 +            }
 +        }
-         tag = tag.toLowerCase();
-         return tag;
++        return tag.substring(0, 1).toLowerCase() + tag.substring(1);
 +    }
 +
 +    protected static void appendParameters(Map<String, String> parameters, Object config) {
 +        appendParameters(parameters, config, null);
 +    }
 +
 +    @SuppressWarnings("unchecked")
 +    protected static void appendParameters(Map<String, String> parameters, Object config, String prefix) {
 +        if (config == null) {
 +            return;
 +        }
 +        Method[] methods = config.getClass().getMethods();
 +        for (Method method : methods) {
 +            try {
 +                String name = method.getName();
-                 if ((name.startsWith("get") || name.startsWith("is"))
-                         && !"getClass".equals(name)
-                         && Modifier.isPublic(method.getModifiers())
-                         && method.getParameterTypes().length == 0
-                         && isPrimitive(method.getReturnType())) {
++                if (ClassHelper.isGetter(method)) {
 +                    Parameter parameter = method.getAnnotation(Parameter.class);
 +                    if (method.getReturnType() == Object.class || parameter != null && parameter.excluded()) {
 +                        continue;
 +                    }
-                     int i = name.startsWith("get") ? 3 : 2;
-                     String prop = StringUtils.camelToSplitName(name.substring(i, i + 1).toLowerCase() + name.substring(i + 1), ".");
 +                    String key;
 +                    if (parameter != null && parameter.key().length() > 0) {
 +                        key = parameter.key();
 +                    } else {
-                         key = prop;
++                        key = calculatePropertyFromGetter(name);
 +                    }
 +                    Object value = method.invoke(config);
 +                    String str = String.valueOf(value).trim();
 +                    if (value != null && str.length() > 0) {
 +                        if (parameter != null && parameter.escaped()) {
 +                            str = URL.encode(str);
 +                        }
 +                        if (parameter != null && parameter.append()) {
 +                            String pre = parameters.get(Constants.DEFAULT_KEY + "." + key);
 +                            if (pre != null && pre.length() > 0) {
 +                                str = pre + "," + str;
 +                            }
 +                            pre = parameters.get(key);
 +                            if (pre != null && pre.length() > 0) {
 +                                str = pre + "," + str;
 +                            }
 +                        }
 +                        if (prefix != null && prefix.length() > 0) {
 +                            key = prefix + "." + key;
 +                        }
 +                        parameters.put(key, str);
 +                    } else if (parameter != null && parameter.required()) {
 +                        throw new IllegalStateException(config.getClass().getSimpleName() + "." + key + " == null");
 +                    }
 +                } else if ("getParameters".equals(name)
 +                        && Modifier.isPublic(method.getModifiers())
 +                        && method.getParameterTypes().length == 0
 +                        && method.getReturnType() == Map.class) {
 +                    Map<String, String> map = (Map<String, String>) method.invoke(config, new Object[0]);
 +                    if (map != null && map.size() > 0) {
 +                        String pre = (prefix != null && prefix.length() > 0 ? prefix + "." : "");
 +                        for (Map.Entry<String, String> entry : map.entrySet()) {
 +                            parameters.put(pre + entry.getKey().replace('-', '.'), entry.getValue());
 +                        }
 +                    }
 +                }
 +            } catch (Exception e) {
 +                throw new IllegalStateException(e.getMessage(), e);
 +            }
 +        }
 +    }
 +
 +    protected static void appendAttributes(Map<String, Object> parameters, Object config) {
 +        appendAttributes(parameters, config, null);
 +    }
 +
 +    protected static void appendAttributes(Map<String, Object> parameters, Object config, String prefix) {
 +        if (config == null) {
 +            return;
 +        }
 +        Method[] methods = config.getClass().getMethods();
 +        for (Method method : methods) {
 +            try {
 +                Parameter parameter = method.getAnnotation(Parameter.class);
 +                if (parameter == null || !parameter.attribute()) {
 +                    continue;
 +                }
 +                String name = method.getName();
-                 if ((name.startsWith("get") || name.startsWith("is"))
-                         && !"getClass".equals(name)
-                         && Modifier.isPublic(method.getModifiers())
-                         && method.getParameterTypes().length == 0
-                         && isPrimitive(method.getReturnType())) {
++                if (ClassHelper.isGetter(method)) {
 +                    String key;
 +                    if (parameter.key().length() > 0) {
 +                        key = parameter.key();
 +                    } else {
-                         int i = name.startsWith("get") ? 3 : 2;
-                         key = name.substring(i, i + 1).toLowerCase() + name.substring(i + 1);
++                        key = calculateAttributeFromGetter(name);
 +                    }
 +                    Object value = method.invoke(config);
 +                    if (value != null) {
 +                        if (prefix != null && prefix.length() > 0) {
 +                            key = prefix + "." + key;
 +                        }
 +                        parameters.put(key, value);
 +                    }
 +                }
 +            } catch (Exception e) {
 +                throw new IllegalStateException(e.getMessage(), e);
 +            }
 +        }
 +    }
 +
 +    protected static ConsumerMethodModel.AsyncMethodInfo convertMethodConfig2AyncInfo(MethodConfig methodConfig) {
 +        if (methodConfig == null || (methodConfig.getOninvoke() == null && methodConfig.getOnreturn() == null && methodConfig.getOnthrow() == null)) {
 +            return null;
 +        }
 +
 +        //check config conflict
 +        if (Boolean.FALSE.equals(methodConfig.isReturn()) && (methodConfig.getOnreturn() != null || methodConfig.getOnthrow() != null)) {
 +            throw new IllegalStateException("method config error : return attribute must be set true when onreturn or onthrow has been set.");
 +        }
 +
 +        ConsumerMethodModel.AsyncMethodInfo asyncMethodInfo = new ConsumerMethodModel.AsyncMethodInfo();
 +
 +        asyncMethodInfo.setOninvokeInstance(methodConfig.getOninvoke());
 +        asyncMethodInfo.setOnreturnInstance(methodConfig.getOnreturn());
 +        asyncMethodInfo.setOnthrowInstance(methodConfig.getOnthrow());
 +
 +        try {
 +            String oninvokeMethod = methodConfig.getOninvokeMethod();
 +            if (StringUtils.isNotEmpty(oninvokeMethod)) {
 +                asyncMethodInfo.setOninvokeMethod(getMethodByName(methodConfig.getOninvoke().getClass(), oninvokeMethod));
 +            }
 +
 +            String onreturnMethod = methodConfig.getOnreturnMethod();
 +            if (StringUtils.isNotEmpty(onreturnMethod)) {
 +                asyncMethodInfo.setOnreturnMethod(getMethodByName(methodConfig.getOnreturn().getClass(), onreturnMethod));
 +            }
 +
 +            String onthrowMethod = methodConfig.getOnthrowMethod();
 +            if (StringUtils.isNotEmpty(onthrowMethod)) {
 +                asyncMethodInfo.setOnthrowMethod(getMethodByName(methodConfig.getOnthrow().getClass(), onthrowMethod));
 +            }
 +        } catch (Exception e) {
 +            throw new IllegalStateException(e.getMessage(), e);
 +        }
 +
 +        return asyncMethodInfo;
 +    }
 +
 +    private static Method getMethodByName(Class<?> clazz, String methodName) {
 +        try {
 +            return ReflectUtils.findMethodByMethodName(clazz, methodName);
 +        } catch (Exception e) {
 +            throw new IllegalStateException(e);
 +        }
 +    }
 +
-     private static boolean isPrimitive(Class<?> type) {
-         return type.isPrimitive()
-                 || type == String.class
-                 || type == Character.class
-                 || type == Boolean.class
-                 || type == Byte.class
-                 || type == Short.class
-                 || type == Integer.class
-                 || type == Long.class
-                 || type == Float.class
-                 || type == Double.class
-                 || type == Object.class;
-     }
- 
-     private static Object convertPrimitive(Class<?> type, String value) {
-         if (type == char.class || type == Character.class) {
-             return value.length() > 0 ? value.charAt(0) : '\0';
-         } else if (type == boolean.class || type == Boolean.class) {
-             return Boolean.valueOf(value);
-         } else if (type == byte.class || type == Byte.class) {
-             return Byte.valueOf(value);
-         } else if (type == short.class || type == Short.class) {
-             return Short.valueOf(value);
-         } else if (type == int.class || type == Integer.class) {
-             return Integer.valueOf(value);
-         } else if (type == long.class || type == Long.class) {
-             return Long.valueOf(value);
-         } else if (type == float.class || type == Float.class) {
-             return Float.valueOf(value);
-         } else if (type == double.class || type == Double.class) {
-             return Double.valueOf(value);
++    /**
++     * We only check boolean value at this moment.
++     *
++     * @param type
++     * @param value
++     * @return
++     */
++    private static boolean isTypeMatch(Class<?> type, String value) {
++        if ((type == boolean.class || type == Boolean.class)
++                && !("true".equals(value) || "false".equals(value))) {
++            return false;
 +        }
-         return value;
++        return true;
 +    }
 +
 +    protected static void checkExtension(Class<?> type, String property, String value) {
 +        checkName(property, value);
 +        if (value != null && value.length() > 0
 +                && !ExtensionLoader.getExtensionLoader(type).hasExtension(value)) {
 +            throw new IllegalStateException("No such extension " + value + " for " + property + "/" + type.getName());
 +        }
 +    }
 +
 +    protected static void checkMultiExtension(Class<?> type, String property, String value) {
 +        checkMultiName(property, value);
 +        if (value != null && value.length() > 0) {
 +            String[] values = value.split("\\s*[,]+\\s*");
 +            for (String v : values) {
 +                if (v.startsWith(Constants.REMOVE_VALUE_PREFIX)) {
 +                    v = v.substring(1);
 +                }
 +                if (Constants.DEFAULT_KEY.equals(v)) {
 +                    continue;
 +                }
 +                if (!ExtensionLoader.getExtensionLoader(type).hasExtension(v)) {
 +                    throw new IllegalStateException("No such extension " + v + " for " + property + "/" + type.getName());
 +                }
 +            }
 +        }
 +    }
 +
 +    protected static void checkLength(String property, String value) {
 +        checkProperty(property, value, MAX_LENGTH, null);
 +    }
 +
 +    protected static void checkPathLength(String property, String value) {
 +        checkProperty(property, value, MAX_PATH_LENGTH, null);
 +    }
 +
 +    protected static void checkName(String property, String value) {
 +        checkProperty(property, value, MAX_LENGTH, PATTERN_NAME);
 +    }
 +
 +    protected static void checkNameHasSymbol(String property, String value) {
 +        checkProperty(property, value, MAX_LENGTH, PATTERN_NAME_HAS_SYMBOL);
 +    }
 +
 +    protected static void checkKey(String property, String value) {
 +        checkProperty(property, value, MAX_LENGTH, PATTERN_KEY);
 +    }
 +
 +    protected static void checkMultiName(String property, String value) {
 +        checkProperty(property, value, MAX_LENGTH, PATTERN_MULTI_NAME);
 +    }
 +
 +    protected static void checkPathName(String property, String value) {
 +        checkProperty(property, value, MAX_PATH_LENGTH, PATTERN_PATH);
 +    }
 +
 +    protected static void checkMethodName(String property, String value) {
 +        checkProperty(property, value, MAX_LENGTH, PATTERN_METHOD_NAME);
 +    }
 +
 +    protected static void checkParameterName(Map<String, String> parameters) {
 +        if (parameters == null || parameters.size() == 0) {
 +            return;
 +        }
 +        for (Map.Entry<String, String> entry : parameters.entrySet()) {
 +            checkNameHasSymbol(entry.getKey(), entry.getValue());
 +        }
 +    }
 +
 +    protected static void checkProperty(String property, String value, int maxlength, Pattern pattern) {
 +        if (value == null || value.length() == 0) {
 +            return;
 +        }
 +        if (value.length() > maxlength) {
 +            throw new IllegalStateException("Invalid " + property + "=\"" + value + "\" is longer than " + maxlength);
 +        }
 +        if (pattern != null) {
 +            Matcher matcher = pattern.matcher(value);
 +            if (!matcher.matches()) {
 +                throw new IllegalStateException("Invalid " + property + "=\"" + value + "\" contains illegal " +
 +                        "character, only digit, letter, '-', '_' or '.' is legal.");
 +            }
 +        }
 +    }
 +
++    protected static Set<String> getSubProperties(Map<String, String> properties, String prefix) {
++        return properties.keySet().stream().filter(k -> k.contains(prefix)).map(k -> {
++            k = k.substring(prefix.length());
++            return k.substring(0, k.indexOf("."));
++        }).collect(Collectors.toSet());
++    }
++
++    private static String extractPropertyName(Class<?> clazz, Method setter) throws Exception {
++        String propertyName = setter.getName().substring("set".length());
++        Method getter = null;
++        try {
++            getter = clazz.getMethod("get" + propertyName);
++        } catch (NoSuchMethodException e) {
++            getter = clazz.getMethod("is" + propertyName);
++        }
++        Parameter parameter = getter.getAnnotation(Parameter.class);
++        if (parameter != null && StringUtils.isNotEmpty(parameter.key()) && parameter.useKeyAsProperty()) {
++            propertyName = parameter.key();
++        } else {
++            propertyName = propertyName.substring(0, 1).toLowerCase() + propertyName.substring(1);
++        }
++        return propertyName;
++    }
++
++    private static String calculatePropertyFromGetter(String name) {
++        int i = name.startsWith("get") ? 3 : 2;
++        return StringUtils.camelToSplitName(name.substring(i, i + 1).toLowerCase() + name.substring(i + 1), ".");
++    }
++
++    private static String calculateAttributeFromGetter(String getter) {
++        int i = getter.startsWith("get") ? 3 : 2;
++        return getter.substring(i, i + 1).toLowerCase() + getter.substring(i + 1);
++    }
++
 +    @Parameter(excluded = true)
 +    public String getId() {
 +        return id;
 +    }
 +
 +    public void setId(String id) {
 +        this.id = id;
 +    }
 +
++    public void updateIdIfAbsent(String value) {
++        if (StringUtils.isNotEmpty(value) && StringUtils.isEmpty(id)) {
++            this.id = value;
++        }
++    }
++
 +    protected void appendAnnotation(Class<?> annotationClass, Object annotation) {
 +        Method[] methods = annotationClass.getMethods();
 +        for (Method method : methods) {
 +            if (method.getDeclaringClass() != Object.class
 +                    && method.getReturnType() != void.class
 +                    && method.getParameterTypes().length == 0
 +                    && Modifier.isPublic(method.getModifiers())
 +                    && !Modifier.isStatic(method.getModifiers())) {
 +                try {
 +                    String property = method.getName();
 +                    if ("interfaceClass".equals(property) || "interfaceName".equals(property)) {
 +                        property = "interface";
 +                    }
 +                    String setter = "set" + property.substring(0, 1).toUpperCase() + property.substring(1);
 +                    Object value = method.invoke(annotation);
 +                    if (value != null && !value.equals(method.getDefaultValue())) {
 +                        Class<?> parameterType = ReflectUtils.getBoxedClass(method.getReturnType());
 +                        if ("filter".equals(property) || "listener".equals(property)) {
 +                            parameterType = String.class;
 +                            value = StringUtils.join((String[]) value, ",");
 +                        } else if ("parameters".equals(property)) {
 +                            parameterType = Map.class;
 +                            value = CollectionUtils.toStringMap((String[]) value);
 +                        }
 +                        try {
 +                            Method setterMethod = getClass().getMethod(setter, parameterType);
 +                            setterMethod.invoke(this, value);
 +                        } catch (NoSuchMethodException e) {
 +                            // ignore
 +                        }
 +                    }
 +                } catch (Throwable e) {
 +                    logger.error(e.getMessage(), e);
 +                }
 +            }
 +        }
 +    }
 +
++    /**
++     * Should be called after Config was fully initialized.
++     * // FIXME: this method should be completely replaced by appendParameters
++     *
++     * @return
++     * @see AbstractConfig#appendParameters(Map, Object, String)
++     * <p>
++     * Notice! This method should include all properties in the returning map, treat @Parameter differently compared to appendParameters.
++     */
++    public Map<String, String> getMetaData() {
++        Map<String, String> metaData = new HashMap<>();
++        Method[] methods = this.getClass().getMethods();
++        for (Method method : methods) {
++            try {
++                String name = method.getName();
++                if ((name.startsWith("get") || name.startsWith("is"))
++                        && !name.equals("get")
++                        && !"getClass".equals(name)
++                        && Modifier.isPublic(method.getModifiers())
++                        && method.getParameterTypes().length == 0
++                        && ClassHelper.isPrimitive(method.getReturnType())) {
++                    String prop = calculateAttributeFromGetter(name);
++                    String key;
++                    Parameter parameter = method.getAnnotation(Parameter.class);
++                    if (parameter != null && parameter.key().length() > 0 && parameter.useKeyAsProperty()) {
++                        key = parameter.key();
++                    } else {
++                        key = prop;
++                    }
++                    // treat url and configuration differently, the value should always present in configuration though it may not need to present in url.
++                    //if (method.getReturnType() == Object.class || parameter != null && parameter.excluded()) {
++                    if (method.getReturnType() == Object.class) {
++                        metaData.put(key, null);
++                        continue;
++                    }
++                    Object value = method.invoke(this);
++                    String str = String.valueOf(value).trim();
++                    if (value != null && str.length() > 0) {
++                        // ignore escape, keep the original value.
++                        /*if (parameter != null && parameter.escaped()) {
++                            str = URL.encode(str);
++                        }*/
++                        if (parameter != null && parameter.append()) {
++                            String pre = String.valueOf(metaData.get(Constants.DEFAULT_KEY + "." + key));
++                            if (pre != null && pre.length() > 0) {
++                                str = pre + "," + str;
++                            }
++                            pre = String.valueOf(metaData.get(key));
++                            if (pre != null && pre.length() > 0) {
++                                str = pre + "," + str;
++                            }
++                        }
++                      /*  if (prefix != null && prefix.length() > 0) {
++                            key = prefix + "." + key;
++                        }*/
++                        metaData.put(key, str);
++                    } else {
++                        metaData.put(key, null);
++                    }
++                    // TODO check required somewhere else.
++                    /*else if (parameter != null && parameter.required()) {
++                        throw new IllegalStateException(this.getClass().getSimpleName() + "." + key + " == null");
++                    }*/
++                } else if ("getParameters".equals(name)
++                        && Modifier.isPublic(method.getModifiers())
++                        && method.getParameterTypes().length == 0
++                        && method.getReturnType() == Map.class) {
++                    Map<String, String> map = (Map<String, String>) method.invoke(this, new Object[0]);
++                    if (map != null && map.size() > 0) {
++//                            String pre = (prefix != null && prefix.length() > 0 ? prefix + "." : "");
++                        for (Map.Entry<String, String> entry : map.entrySet()) {
++                            metaData.put(entry.getKey().replace('-', '.'), entry.getValue());
++                        }
++                    }
++                }
++            } catch (Exception e) {
++                throw new IllegalStateException(e.getMessage(), e);
++            }
++        }
++        return metaData;
++    }
++
++    @Parameter(excluded = true)
++    public String getPrefix() {
++        return StringUtils.isNotEmpty(prefix) ? prefix : (Constants.DUBBO + "." + getTagName(this.getClass()));
++    }
++
++    public void setPrefix(String prefix) {
++        this.prefix = prefix;
++    }
++
++    /**
++     * TODO: Currently, only support overriding of properties explicitly defined in Config class, doesn't support
++     * overriding of customized parameters stored in 'parameters'.
++     */
++    public void refresh() {
++        try {
++            Environment env = Environment.getInstance();
++            env.addAppConfig(getPrefix(), getId(), getMetaData());
++            Configuration configuration = env.getConfiguration(getPrefix(), getId());
++
++            // loop methods, get override value and set the new value back to method
++            Method[] methods = getClass().getMethods();
++            for (Method method : methods) {
++                if (ClassHelper.isSetter(method)) {
++                    try {
++                        String value = configuration.getString(extractPropertyName(getClass(), method));
++                        // isTypeMatch() is called to avoid duplicate and incorrect update, for example, we have two 'setGeneric' methods in ReferenceConfig.
++                        if (value != null && ClassHelper.isTypeMatch(method.getParameterTypes()[0], value)) {
++                            method.invoke(this, ClassHelper.convertPrimitive(method.getParameterTypes()[0], value));
++                        }
++                    } catch (NoSuchMethodException e) {
++                        logger.info("Failed to override the property " + method.getName() + " in " +
++                                this.getClass().getSimpleName() +
++                                ", please make sure every property has getter/setter method provided.");
++                    }
++                }
++            }
++        } catch (Exception e) {
++            logger.error("Failed to override ", e);
++        }
++    }
++
 +    @Override
 +    public String toString() {
 +        try {
 +            StringBuilder buf = new StringBuilder();
 +            buf.append("<dubbo:");
 +            buf.append(getTagName(getClass()));
 +            Method[] methods = getClass().getMethods();
 +            for (Method method : methods) {
 +                try {
-                     String name = method.getName();
-                     if ((name.startsWith("get") || name.startsWith("is"))
-                             && !"get".equals(name) && !"is".equals(name)
-                             && !"getClass".equals(name) && !"getObject".equals(name)
-                             && Modifier.isPublic(method.getModifiers())
-                             && method.getParameterTypes().length == 0
-                             && isPrimitive(method.getReturnType())) {
-                         int i = name.startsWith("get") ? 3 : 2;
-                         String key = name.substring(i, i + 1).toLowerCase() + name.substring(i + 1);
++                    if (ClassHelper.isGetter(method)) {
++                        String name = method.getName();
++                        String key = calculateAttributeFromGetter(name);
 +                        Object value = method.invoke(this);
 +                        if (value != null) {
 +                            buf.append(" ");
 +                            buf.append(key);
 +                            buf.append("=\"");
 +                            buf.append(value);
 +                            buf.append("\"");
 +                        }
 +                    }
 +                } catch (Exception e) {
 +                    logger.warn(e.getMessage(), e);
 +                }
 +            }
 +            buf.append(" />");
 +            return buf.toString();
 +        } catch (Throwable t) {
 +            logger.warn(t.getMessage(), t);
 +            return super.toString();
 +        }
 +    }
 +
++    /**
++     * FIXME check @Parameter(required=true) and any conditions that need to match.
++     */
++    @Parameter(excluded = true)
++    public boolean isValid() {
++        return true;
++    }
++
 +}
diff --cc dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/DubboShutdownHook.java
index 57535ac,06c9e12..22d50dd
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/DubboShutdownHook.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/DubboShutdownHook.java
@@@ -35,24 -35,20 +35,23 @@@ public class DubboShutdownHook extends 
      private static final Logger logger = LoggerFactory.getLogger(DubboShutdownHook.class);
  
      private static final DubboShutdownHook dubboShutdownHook = new DubboShutdownHook("DubboShutdownHook");
- 
-     public static DubboShutdownHook getDubboShutdownHook() {
-         return dubboShutdownHook;
-     }
- 
      /**
 +     * Has it already been registered or not?
 +     */
 +    private final AtomicBoolean registered = new AtomicBoolean(false);
 +    /**
       * Has it already been destroyed or not?
       */
 -    private final AtomicBoolean destroyed;
 +    private final AtomicBoolean destroyed= new AtomicBoolean(false);
  
      private DubboShutdownHook(String name) {
          super(name);
 -        this.destroyed = new AtomicBoolean(false);
      }
  
+     public static DubboShutdownHook getDubboShutdownHook() {
+         return dubboShutdownHook;
+     }
+ 
      @Override
      public void run() {
          if (logger.isInfoEnabled()) {
diff --cc dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
index 7ec277d,2389b33..5144fc2
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
@@@ -490,46 -552,10 +513,52 @@@ public class ReferenceConfig<T> extend
          return buf.toString();
      }
  
+     @Override
+     @Parameter(excluded = true)
+     public String getPrefix() {
+         return Constants.DUBBO + ".reference." + interfaceName;
+     }
+ 
 +    private void resolveFile() {
 +        String resolve = System.getProperty(interfaceName);
 +        String resolveFile = null;
 +        if (resolve == null || resolve.length() == 0) {
 +            resolveFile = System.getProperty("dubbo.resolve.file");
 +            if (resolveFile == null || resolveFile.length() == 0) {
 +                File userResolveFile = new File(new File(System.getProperty("user.home")), "dubbo-resolve.properties");
 +                if (userResolveFile.exists()) {
 +                    resolveFile = userResolveFile.getAbsolutePath();
 +                }
 +            }
 +            if (resolveFile != null && resolveFile.length() > 0) {
 +                Properties properties = new Properties();
 +                FileInputStream fis = null;
 +                try {
 +                    fis = new FileInputStream(new File(resolveFile));
 +                    properties.load(fis);
 +                } catch (IOException e) {
 +                    throw new IllegalStateException("Unload " + resolveFile + ", cause: " + e.getMessage(), e);
 +                } finally {
 +                    try {
 +                        if (null != fis) {
 +                            fis.close();
 +                        }
 +                    } catch (IOException e) {
 +                        logger.warn(e.getMessage(), e);
 +                    }
 +                }
 +                resolve = properties.getProperty(interfaceName);
 +            }
 +        }
 +        if (resolve != null && resolve.length() > 0) {
 +            url = resolve;
 +            if (logger.isWarnEnabled()) {
 +                if (resolveFile != null) {
 +                    logger.warn("Using default dubbo resolve file " + resolveFile + " replace " + interfaceName + "" + resolve + " to p2p invoke remote service.");
 +                } else {
 +                    logger.warn("Using -D" + interfaceName + "=" + resolve + " to p2p invoke remote service.");
 +                }
 +            }
 +        }
 +    }
  }
diff --cc dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
index 37539eb,fc5d251..1d20a57
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
@@@ -301,12 -285,46 +286,41 @@@ public class ServiceConfig<T> extends A
                  throw new IllegalStateException("The stub implementation class " + stubClass.getName() + " not implement interface " + interfaceName);
              }
          }
-         checkApplication();
-         checkRegistry();
-         checkProtocol();
-         appendProperties(this);
          checkStub(interfaceClass);
          checkMock(interfaceClass);
+     }
+ 
+     public synchronized void export() {
+         checkAndUpdateSubConfigs();
+ 
+         if (provider != null) {
+             if (export == null) {
+                 export = provider.getExport();
+             }
+             if (delay == null) {
+                 delay = provider.getDelay();
+             }
+         }
+         if (export != null && !export) {
+             return;
+         }
+ 
+         if (delay != null && delay > 0) {
 -            delayExportExecutor.schedule(new Runnable() {
 -                @Override
 -                public void run() {
 -                    doExport();
 -                }
 -            }, delay, TimeUnit.MILLISECONDS);
++            delayExportExecutor.schedule(this::doExport, delay, TimeUnit.MILLISECONDS);
+         } else {
+             doExport();
+         }
+     }
+ 
+     protected synchronized void doExport() {
+         if (unexported) {
+             throw new IllegalStateException("Already unexported!");
+         }
+         if (exported) {
+             return;
+         }
+         exported = true;
+ 
          if (path == null || path.length() == 0) {
              path = interfaceName;
          }
diff --cc dubbo-config/dubbo-config-api/src/test/resources/log4j.xml
index 5007dd1,8607f5d..bfc37a8
--- a/dubbo-config/dubbo-config-api/src/test/resources/log4j.xml
+++ b/dubbo-config/dubbo-config-api/src/test/resources/log4j.xml
@@@ -1,28 -1,28 +1,28 @@@
- <!--
-   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.
-   -->
- <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
- <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
-     <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
-         <layout class="org.apache.log4j.PatternLayout">
-             <param name="ConversionPattern" value="[%d{dd/MM/yy HH:mm:ss:SSS z}] %t %5p %c{2}: %m%n"/>
-         </layout>
-     </appender>
-     <root>
-         <level value="INFO"/>
-         <appender-ref ref="CONSOLE"/>
-     </root>
+ <!--
+   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.
+   -->
+ <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+ <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
+     <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
+         <layout class="org.apache.log4j.PatternLayout">
 -            <param name="ConversionPattern" value="[%d{dd/MM/yy hh:mm:ss:sss z}] %t %5p %c{2}: %m%n"/>
++            <param name="ConversionPattern" value="[%d{dd/MM/yy HH:mm:ss:SSS z}] %t %5p %c{2}: %m%n"/>
+         </layout>
+     </appender>
+     <root>
+         <level value="INFO"/>
+         <appender-ref ref="CONSOLE"/>
+     </root>
  </log4j:configuration>
diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/ProviderConsumerRegTable.java
index 5149760,3f3f018..620c534
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/ProviderConsumerRegTable.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/ProviderConsumerRegTable.java
@@@ -23,10 -22,10 +22,12 @@@ import org.apache.dubbo.registry.integr
  import org.apache.dubbo.rpc.Invoker;
  
  import java.util.Collections;
 +import java.util.Map;
 +import java.util.Objects;
+ import java.util.HashSet;
  import java.util.Set;
  import java.util.concurrent.ConcurrentHashMap;
+ import java.util.concurrent.ConcurrentMap;
  
  /**
   * @date 2017/11/23
diff --cc dubbo-registry/dubbo-registry-default/src/test/java/org/apache/dubbo/registry/dubbo/RegistryDirectoryTest.java
index 8c8b8ea,3a65eb9..b271773
--- a/dubbo-registry/dubbo-registry-default/src/test/java/org/apache/dubbo/registry/dubbo/RegistryDirectoryTest.java
+++ b/dubbo-registry/dubbo-registry-default/src/test/java/org/apache/dubbo/registry/dubbo/RegistryDirectoryTest.java
@@@ -29,12 -29,10 +29,10 @@@ import org.apache.dubbo.rpc.Invoker
  import org.apache.dubbo.rpc.Protocol;
  import org.apache.dubbo.rpc.RpcException;
  import org.apache.dubbo.rpc.RpcInvocation;
- import org.apache.dubbo.rpc.cluster.Router;
  import org.apache.dubbo.rpc.cluster.loadbalance.LeastActiveLoadBalance;
  import org.apache.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance;
- import org.apache.dubbo.rpc.cluster.router.script.ScriptRouter;
  import org.apache.dubbo.rpc.cluster.router.script.ScriptRouterFactory;
 -
 +import org.apache.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker;
  import org.junit.Assert;
  import org.junit.Before;
  import org.junit.Test;
diff --cc dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java
index 26669ce,7c63bc7..cfad21c
--- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java
@@@ -73,11 -75,11 +75,19 @@@ public class ApplicationModel 
          }
      }
  
+     public static String getApplication() {
+         return application;
+     }
+ 
+     public static void setApplication(String application) {
+         ApplicationModel.application = application;
+     }
++
 +    /**
 +     * For unit test
 +     */
 +    public static void reset() {
 +        providedServices.clear();
 +        consumedServices.clear();
 +    }
  }
diff --cc dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvokerAvilableTest.java
index 14ab124,4addbf3..08444f7
--- a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvokerAvilableTest.java
+++ b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/DubboInvokerAvilableTest.java
@@@ -97,7 -92,7 +97,6 @@@ public class DubboInvokerAvilableTest 
  
          try{
              System.setProperty(Constants.SHUTDOWN_WAIT_KEY, "2000");
-             System.out.println("------------ConfigUtils.getServerShutdownTimeout(): " + ConfigUtils.getServerShutdownTimeout());
 -            System.out.println("------------ConfigUtils.getServerShutdownTimeout(): " + ConfigurationUtils.getServerShutdownTimeout());
              protocol.destroy();
          }finally {
              System.getProperties().remove(Constants.SHUTDOWN_WAIT_KEY);


[incubator-dubbo] 10/10: Merge branch 'master' of https://github.com/apache/incubator-dubbo

Posted by li...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

liujun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git

commit b88bf3af685fad81494e0501bcba9dc09554e6b1
Merge: c20164e a35f942
Author: ken.lj <ke...@gmail.com>
AuthorDate: Mon Dec 24 15:47:49 2018 +0800

    Merge branch 'master' of https://github.com/apache/incubator-dubbo

 dubbo-common/src/main/java/org/apache/dubbo/common/Version.java | 1 -
 1 file changed, 1 deletion(-)


[incubator-dubbo] 07/10: set all router rule enabled by default

Posted by li...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

liujun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git

commit 96dffe353ef3c9cdf938bf81d38fd9f19cd17f1a
Author: ken.lj <ke...@gmail.com>
AuthorDate: Mon Dec 24 14:47:51 2018 +0800

    set all router rule enabled by default
---
 .../main/java/org/apache/dubbo/rpc/cluster/router/AbstractRouter.java | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/AbstractRouter.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/AbstractRouter.java
index 301ca01..6192f7a 100644
--- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/AbstractRouter.java
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/AbstractRouter.java
@@ -29,8 +29,8 @@ import java.util.concurrent.CopyOnWriteArrayList;
  */
 public abstract class AbstractRouter implements Router {
     protected int priority;
-    protected boolean force;
-    protected boolean enabled;
+    protected boolean force = false;
+    protected boolean enabled = true;
     protected List<RouterChain> routerChains = new CopyOnWriteArrayList<>();
     protected URL url;
 


[incubator-dubbo] 01/10: unify config format.

Posted by li...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

liujun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git

commit 4bd2ed4979920bef7e04328b5711c662190a4f1a
Author: ken.lj <ke...@gmail.com>
AuthorDate: Sat Dec 22 14:07:31 2018 +0800

    unify config format.
---
 .../java/org/apache/dubbo/common/Constants.java    | 18 +++++------
 .../org/apache/dubbo/config/AbstractConfig.java    |  2 +-
 .../apache/dubbo/config/ConfigCenterConfig.java    | 12 --------
 .../apache/dubbo/config/MetadataReportConfig.java  | 35 ++++++++++------------
 .../apache/dubbo/config/RegistryDataConfig.java    |  5 ----
 .../annotation/DubboConfigConfiguration.java       | 11 ++++---
 6 files changed, 31 insertions(+), 52 deletions(-)

diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/Constants.java b/dubbo-common/src/main/java/org/apache/dubbo/common/Constants.java
index ef3f50c..5c1006b 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/Constants.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/Constants.java
@@ -470,23 +470,23 @@ public class Constants {
      * simple the registry for provider.
      * @since 2.7.0
      */
-    public static final String SIMPLE_PROVIDER_CONFIG_KEY = "simpleProviderConfig";
+    public static final String SIMPLE_PROVIDER_CONFIG_KEY = "simple.provider.config";
     /**
      * simple the registry for consumer.
      * @since 2.7.0
      */
-    public static final String SIMPLE_CONSUMER_CONFIG_KEY = "simpleConsumerConfig";
+    public static final String SIMPLE_CONSUMER_CONFIG_KEY = "simple.consumer.config";
     /**
      * After simplify the registry, should add some paramter individually for provider.
      * @since 2.7.0
      */
-    public static final String EXTRA_PROVIDER_CONFIG_KEYS_KEY = "extraProviderKeys";
+    public static final String EXTRA_PROVIDER_CONFIG_KEYS_KEY = "extra.provider.keys";
     /**
      * After simplify the registry, should add some paramter individually for consumer.
      *
      * @since 2.7.0
      */
-    public static final String EXTRA_CONSUMER_CONFIG_KEYS_KEY = "extraConsumerKeys";
+    public static final String EXTRA_CONSUMER_CONFIG_KEYS_KEY = "extra.consumer.keys";
 
     /**
      * To decide whether to exclude unavailable invoker from the cluster
@@ -723,13 +723,13 @@ public class Constants {
 
     public static final String ADDRESS_KEY = "address";
 
-    public static final String RETRY_TIMES_KEY = "retry-times";
+    public static final String RETRY_TIMES_KEY = "retry.times";
 
-    public static final String RETRY_PERIOD_KEY = "retry-period";
+    public static final String RETRY_PERIOD_KEY = "retry.period";
 
-    public static final String SYNC_REPORT_KEY = "sync-report";
+    public static final String SYNC_REPORT_KEY = "sync.report";
 
-    public static final String CYCLE_REPORT_KEY = "cycle-report";
+    public static final String CYCLE_REPORT_KEY = "cycle.report";
 
     public static final String CONFIG_VERSION_KEY = "configVersion";
 
@@ -745,8 +745,6 @@ public class Constants {
 
     public static final String REGISTRIES_SUFFIX = "dubbo.registries.";
 
-    public static final String CONFIGCENTERS_SUFFIX = "dubbo.configCenters.";
-
     public static final String[] DEFAULT_REGISTER_PROVIDER_KEYS = {APPLICATION_KEY, CODEC_KEY, EXCHANGER_KEY, SERIALIZATION_KEY, CLUSTER_KEY, CONNECTIONS_KEY, DEPRECATED_KEY,
             GROUP_KEY, LOADBALANCE_KEY, MOCK_KEY, PATH_KEY, TIMEOUT_KEY, TOKEN_KEY, VERSION_KEY, WARMUP_KEY, WEIGHT_KEY, TIMESTAMP_KEY, DUBBO_VERSION_KEY, SPECIFICATION_VERSION_KEY};
 
diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java
index f4abaf3..a64c73e 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java
@@ -460,7 +460,7 @@ public abstract class AbstractConfig implements Serializable {
                         && Modifier.isPublic(method.getModifiers())
                         && method.getParameterTypes().length == 0
                         && ClassHelper.isPrimitive(method.getReturnType())) {
-                    String prop = calculatePropertyFromGetter(name);
+                    String prop = calculateAttributeFromGetter(name);
                     String key;
                     Parameter parameter = method.getAnnotation(Parameter.class);
                     if (parameter != null && parameter.key().length() > 0 && parameter.useKeyAsProperty()) {
diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java
index b4043e7..fe62fda 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java
@@ -70,11 +70,6 @@ public class ConfigCenterConfig extends AbstractConfig {
 
         // give jvm properties the chance to override local configs, e.g., -Ddubbo.configcenter.highestPriority
         refresh();
-        if (StringUtils.isNotEmpty(getId())) {
-            // read 'dubbo.configCenters.zookeeper.'
-            setPrefix(Constants.CONFIGCENTERS_SUFFIX);
-            refresh();
-        }
 
         // try to use registryConfig as the default configcenter, only applies to zookeeper.
         if (!isValid() && registry != null && registry.isZookeeperProtocol()) {
@@ -166,7 +161,6 @@ public class ConfigCenterConfig extends AbstractConfig {
 
     public void setProtocol(String protocol) {
         this.protocol = protocol;
-        this.updateIdIfAbsent(protocol);
     }
 
     @Parameter(excluded = true)
@@ -176,12 +170,6 @@ public class ConfigCenterConfig extends AbstractConfig {
 
     public void setAddress(String address) {
         this.address = address;
-        if (address != null) {
-            int i = address.indexOf("://");
-            if (i > 0) {
-                this.updateIdIfAbsent(address.substring(0, i));
-            }
-        }
     }
 
     @Parameter(key = Constants.CONFIG_CLUSTER_KEY, useKeyAsProperty = false)
diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/MetadataReportConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/MetadataReportConfig.java
index 05112ac..a0928b6 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/MetadataReportConfig.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/MetadataReportConfig.java
@@ -44,13 +44,13 @@ public class MetadataReportConfig extends AbstractConfig {
     // customized parameters
     private Map<String, String> parameters;
 
-    private Integer retrytimes;
+    private Integer retryTimes;
 
-    private Integer retryperiod;
+    private Integer retryPeriod;
     /**
      * by default the metadatastore will store full metadata repeatly every day .
      */
-    private Boolean cyclereport;
+    private Boolean cycleReport;
 
     /**
      * sync report, default async
@@ -104,41 +104,36 @@ public class MetadataReportConfig extends AbstractConfig {
         this.parameters = parameters;
     }
 
-    @Parameter(key = "retry-times")
-    public Integer getRetrytimes() {
-        return retrytimes;
+    public Integer getRetryTimes() {
+        return retryTimes;
     }
 
-    public void setRetrytimes(Integer retrytimes) {
-        this.retrytimes = retrytimes;
+    public void setRetryTimes(Integer retryTimes) {
+        this.retryTimes = retryTimes;
     }
 
-    @Parameter(key = "retry-period")
-    public Integer getRetryperiod() {
-        return retryperiod;
+    public Integer getRetryPeriod() {
+        return retryPeriod;
     }
 
-    public void setRetryperiod(Integer retryperiod) {
-        this.retryperiod = retryperiod;
+    public void setRetryPeriod(Integer retryPeriod) {
+        this.retryPeriod = retryPeriod;
     }
 
-    @Parameter(key = "cycle-report")
-    public Boolean getCyclereport() {
-        return cyclereport;
+    public Boolean getCycleReport() {
+        return cycleReport;
     }
 
-    public void setCyclereport(Boolean cyclereport) {
-        this.cyclereport = cyclereport;
+    public void setCycleReport(Boolean cycleReport) {
+        this.cycleReport = cycleReport;
     }
 
-
     @Override
     @Parameter(excluded = true)
     public boolean isValid() {
         return StringUtils.isNotEmpty(address);
     }
 
-    @Parameter(key = "sync-report")
     public Boolean getSyncReport() {
         return syncReport;
     }
diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/RegistryDataConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/RegistryDataConfig.java
index ce2f052..1b41e2e 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/RegistryDataConfig.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/RegistryDataConfig.java
@@ -18,7 +18,6 @@ package org.apache.dubbo.config;
 
 import org.apache.dubbo.common.Constants;
 import org.apache.dubbo.common.utils.StringUtils;
-import org.apache.dubbo.config.support.Parameter;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -52,7 +51,6 @@ public class RegistryDataConfig extends AbstractConfig {
         return map;
     }
 
-    @Parameter(key = "simple-provider-config")
     public Boolean getSimpleProviderConfig() {
         return simpleProviderConfig;
     }
@@ -61,7 +59,6 @@ public class RegistryDataConfig extends AbstractConfig {
         this.simpleProviderConfig = simpleProviderConfig;
     }
 
-    @Parameter(key = "simple-consumer-config")
     public Boolean getSimpleConsumerConfig() {
         return simpleConsumerConfig;
     }
@@ -70,7 +67,6 @@ public class RegistryDataConfig extends AbstractConfig {
         this.simpleConsumerConfig = simpleConsumerConfig;
     }
 
-    @Parameter(key = "extra-provider-keys")
     public String getExtraProviderKeys() {
         return extraProviderKeys;
     }
@@ -80,7 +76,6 @@ public class RegistryDataConfig extends AbstractConfig {
     }
 
 
-    @Parameter(key = "extra-consumer-keys")
     public String getExtraConsumerKeys() {
         return extraConsumerKeys;
     }
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigConfiguration.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigConfiguration.java
index 4b74828..7ace9e1 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigConfiguration.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboConfigConfiguration.java
@@ -57,9 +57,11 @@ public class DubboConfigConfiguration {
             @EnableDubboConfigBinding(prefix = "dubbo.registry", type = RegistryConfig.class),
             @EnableDubboConfigBinding(prefix = "dubbo.protocol", type = ProtocolConfig.class),
             @EnableDubboConfigBinding(prefix = "dubbo.monitor", type = MonitorConfig.class),
-            @EnableDubboConfigBinding(prefix = "dubbo.provider", type = ProviderConfig.class), @EnableDubboConfigBinding(prefix = "dubbo.consumer", type = ConsumerConfig.class), @EnableDubboConfigBinding(prefix = "dubbo.configCenter", type = ConfigCenterBean.class),
-            @EnableDubboConfigBinding(prefix = "dubbo.registrydata", type = RegistryDataConfig.class),
-            @EnableDubboConfigBinding(prefix = "dubbo.metadatareport", type = MetadataReportConfig.class)
+            @EnableDubboConfigBinding(prefix = "dubbo.provider", type = ProviderConfig.class),
+            @EnableDubboConfigBinding(prefix = "dubbo.consumer", type = ConsumerConfig.class),
+            @EnableDubboConfigBinding(prefix = "dubbo.configCenter", type = ConfigCenterBean.class),
+            @EnableDubboConfigBinding(prefix = "dubbo.registryData", type = RegistryDataConfig.class),
+            @EnableDubboConfigBinding(prefix = "dubbo.metadataReport", type = MetadataReportConfig.class)
     })
     public static class Single {
 
@@ -75,7 +77,8 @@ public class DubboConfigConfiguration {
             @EnableDubboConfigBinding(prefix = "dubbo.protocols", type = ProtocolConfig.class, multiple = true),
             @EnableDubboConfigBinding(prefix = "dubbo.monitors", type = MonitorConfig.class, multiple = true),
             @EnableDubboConfigBinding(prefix = "dubbo.providers", type = ProviderConfig.class, multiple = true),
-            @EnableDubboConfigBinding(prefix = "dubbo.consumers", type = ConsumerConfig.class, multiple = true)
+            @EnableDubboConfigBinding(prefix = "dubbo.consumers", type = ConsumerConfig.class, multiple = true),
+            @EnableDubboConfigBinding(prefix = "dubbo.configCenters", type = ConfigCenterBean.class, multiple = true)
     })
     public static class Multiple {
 


[incubator-dubbo] 04/10: fix compile error.

Posted by li...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

liujun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git

commit ac31d4f5217f383574984e05b035c2e0968d675f
Author: ken.lj <ke...@gmail.com>
AuthorDate: Sun Dec 23 21:07:51 2018 +0800

    fix compile error.
---
 .../java/org/apache/dubbo/rpc/cluster/directory/AbstractDirectory.java   | 1 +
 1 file changed, 1 insertion(+)

diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/directory/AbstractDirectory.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/directory/AbstractDirectory.java
index f44c398..6f3a316 100644
--- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/directory/AbstractDirectory.java
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/directory/AbstractDirectory.java
@@ -16,6 +16,7 @@
  */
 package org.apache.dubbo.rpc.cluster.directory;
 
+import org.apache.dubbo.common.Constants;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;


[incubator-dubbo] 08/10: remove appConfigs cache to support one service/reference registered more than one time (if users don't explicitly add id, cache can not work properly)

Posted by li...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

liujun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git

commit 9897aa3d7273e3eb96910cfdc09709a77cae50b0
Author: ken.lj <ke...@gmail.com>
AuthorDate: Mon Dec 24 14:49:22 2018 +0800

    remove appConfigs cache to support one service/reference registered more than one time (if users don't explicitly add id, cache can not work properly)
---
 .../apache/dubbo/common/config/Environment.java    | 37 +++-------------------
 .../org/apache/dubbo/config/AbstractConfig.java    | 16 +++++++---
 2 files changed, 17 insertions(+), 36 deletions(-)

diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/config/Environment.java b/dubbo-common/src/main/java/org/apache/dubbo/common/config/Environment.java
index 74c9d30..4526fbc 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/config/Environment.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/config/Environment.java
@@ -35,7 +35,6 @@ public class Environment {
     private Map<String, EnvironmentConfiguration> environmentConfigs = new ConcurrentHashMap<>();
     private Map<String, InmemoryConfiguration> externalConfigs = new ConcurrentHashMap<>();
     private Map<String, InmemoryConfiguration> appExternalConfigs = new ConcurrentHashMap<>();
-    private Map<String, InmemoryConfiguration> appConfigs = new ConcurrentHashMap<>();
 
     private Map<String, String> externalConfigurationMap = new HashMap<>();
     private Map<String, String> appExternalConfigurationMap = new HashMap<>();
@@ -79,10 +78,6 @@ public class Environment {
         return environmentConfigs.computeIfAbsent(toKey(prefix, id), k -> new EnvironmentConfiguration(prefix, id));
     }
 
-    public InmemoryConfiguration getAppConfig(String prefix, String id) {
-        return appConfigs.get(toKey(prefix, id));
-    }
-
     public void setExternalConfigMap(Map<String, String> externalConfiguration) {
         this.externalConfigurationMap = externalConfiguration;
     }
@@ -99,14 +94,6 @@ public class Environment {
         return appExternalConfigurationMap;
     }
 
-    public void addAppConfig(String prefix, String id, Map<String, String> properties) {
-        appConfigs.computeIfAbsent(toKey(prefix, id), k -> {
-            InmemoryConfiguration configuration = new InmemoryConfiguration(prefix, id);
-            configuration.addProperties(properties);
-            return configuration;
-        });
-    }
-
     public void updateExternalConfigurationMap(Map<String, String> externalMap) {
         this.externalConfigurationMap.putAll(externalMap);
     }
@@ -124,27 +111,13 @@ public class Environment {
      * @param id
      * @return
      */
-    public Configuration getConfiguration(String prefix, String id) {
+    public CompositeConfiguration getConfiguration(String prefix, String id) {
         CompositeConfiguration compositeConfiguration = new CompositeConfiguration();
-        InmemoryConfiguration appConfig = this.getAppConfig(prefix, id);
         // Config center has the highest priority
-        if (!configCenterFirst) {
-            compositeConfiguration.addConfiguration(this.getSystemConfig(prefix, id));
-            if (appConfig != null) {
-                compositeConfiguration.addConfiguration(appConfig);
-            }
-            compositeConfiguration.addConfiguration(this.getAppExternalConfig(prefix, id));
-            compositeConfiguration.addConfiguration(this.getExternalConfig(prefix, id));
-            compositeConfiguration.addConfiguration(this.getPropertiesConfig(prefix, id));
-        } else {
-            compositeConfiguration.addConfiguration(this.getSystemConfig(prefix, id));
-            compositeConfiguration.addConfiguration(this.getAppExternalConfig(prefix, id));
-            compositeConfiguration.addConfiguration(this.getExternalConfig(prefix, id));
-            if (appConfig != null) {
-                compositeConfiguration.addConfiguration(appConfig);
-            }
-            compositeConfiguration.addConfiguration(this.getPropertiesConfig(prefix, id));
-        }
+        compositeConfiguration.addConfiguration(this.getSystemConfig(prefix, id));
+        compositeConfiguration.addConfiguration(this.getAppExternalConfig(prefix, id));
+        compositeConfiguration.addConfiguration(this.getExternalConfig(prefix, id));
+        compositeConfiguration.addConfiguration(this.getPropertiesConfig(prefix, id));
         return compositeConfiguration;
     }
 
diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java
index 952853d..a52b355 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java
@@ -18,8 +18,9 @@ package org.apache.dubbo.config;
 
 import org.apache.dubbo.common.Constants;
 import org.apache.dubbo.common.URL;
-import org.apache.dubbo.common.config.Configuration;
+import org.apache.dubbo.common.config.CompositeConfiguration;
 import org.apache.dubbo.common.config.Environment;
+import org.apache.dubbo.common.config.InmemoryConfiguration;
 import org.apache.dubbo.common.extension.ExtensionLoader;
 import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
@@ -536,9 +537,16 @@ public abstract class AbstractConfig implements Serializable {
      */
     public void refresh() {
         try {
-            Environment env = Environment.getInstance();
-            env.addAppConfig(getPrefix(), getId(), getMetaData());
-            Configuration configuration = env.getConfiguration(getPrefix(), getId());
+            CompositeConfiguration compositeConfiguration = Environment.getInstance().getConfiguration(getPrefix(), getId());
+            InmemoryConfiguration configuration = new InmemoryConfiguration(getPrefix(), getId());
+            configuration.addProperties(getMetaData());
+            if (Environment.getInstance().isConfigCenterFirst()) {
+                // The sequence would be: SystemConfiguration -> ExternalConfiguration -> AppExternalConfiguration -> AbstractConfig -> PropertiesConfiguration
+                compositeConfiguration.addConfiguration(3,configuration);
+            } else {
+                // The sequence would be: SystemConfiguration -> AbstractConfig -> ExternalConfiguration -> AppExternalConfiguration -> PropertiesConfiguration
+                compositeConfiguration.addConfiguration(1, configuration);
+            }
 
             // loop methods, get override value and set the new value back to method
             Method[] methods = getClass().getMethods();


[incubator-dubbo] 09/10: fix wrong reference

Posted by li...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

liujun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git

commit c20164ef1d3ef92ce8db15fc0cc27fc3c059857a
Author: ken.lj <ke...@gmail.com>
AuthorDate: Mon Dec 24 15:09:07 2018 +0800

    fix wrong reference
---
 .../src/main/java/org/apache/dubbo/config/AbstractConfig.java  | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java
index a52b355..6945266 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java
@@ -538,14 +538,14 @@ public abstract class AbstractConfig implements Serializable {
     public void refresh() {
         try {
             CompositeConfiguration compositeConfiguration = Environment.getInstance().getConfiguration(getPrefix(), getId());
-            InmemoryConfiguration configuration = new InmemoryConfiguration(getPrefix(), getId());
-            configuration.addProperties(getMetaData());
+            InmemoryConfiguration config = new InmemoryConfiguration(getPrefix(), getId());
+            config.addProperties(getMetaData());
             if (Environment.getInstance().isConfigCenterFirst()) {
                 // The sequence would be: SystemConfiguration -> ExternalConfiguration -> AppExternalConfiguration -> AbstractConfig -> PropertiesConfiguration
-                compositeConfiguration.addConfiguration(3,configuration);
+                compositeConfiguration.addConfiguration(3,config);
             } else {
                 // The sequence would be: SystemConfiguration -> AbstractConfig -> ExternalConfiguration -> AppExternalConfiguration -> PropertiesConfiguration
-                compositeConfiguration.addConfiguration(1, configuration);
+                compositeConfiguration.addConfiguration(1, config);
             }
 
             // loop methods, get override value and set the new value back to method
@@ -553,7 +553,7 @@ public abstract class AbstractConfig implements Serializable {
             for (Method method : methods) {
                 if (ClassHelper.isSetter(method)) {
                     try {
-                        String value = configuration.getString(extractPropertyName(getClass(), method));
+                        String value = compositeConfiguration.getString(extractPropertyName(getClass(), method));
                         // isTypeMatch() is called to avoid duplicate and incorrect update, for example, we have two 'setGeneric' methods in ReferenceConfig.
                         if (value != null && ClassHelper.isTypeMatch(method.getParameterTypes()[0], value)) {
                             method.invoke(this, ClassHelper.convertPrimitive(method.getParameterTypes()[0], value));


[incubator-dubbo] 02/10: fix busy loop caused by singledThreadExecutor

Posted by li...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

liujun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git

commit 5184416bc7c87f5a6960f29823a071bc1ae826a4
Author: ken.lj <ke...@gmail.com>
AuthorDate: Sat Dec 22 14:08:14 2018 +0800

    fix busy loop caused by singledThreadExecutor
---
 .../org/apache/dubbo/metadata/support/AbstractMetadataReport.java    | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/support/AbstractMetadataReport.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/support/AbstractMetadataReport.java
index c557325..9aab901 100644
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/support/AbstractMetadataReport.java
+++ b/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/support/AbstractMetadataReport.java
@@ -16,7 +16,6 @@
  */
 package org.apache.dubbo.metadata.support;
 
-import com.google.gson.Gson;
 import org.apache.dubbo.common.Constants;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.logger.Logger;
@@ -27,6 +26,8 @@ import org.apache.dubbo.metadata.definition.model.FullServiceDefinition;
 import org.apache.dubbo.metadata.identifier.MetadataIdentifier;
 import org.apache.dubbo.metadata.store.MetadataReport;
 
+import com.google.gson.Gson;
+
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
@@ -98,7 +99,7 @@ public abstract class AbstractMetadataReport implements MetadataReport {
                 reportServerURL.getParameter(Constants.RETRY_PERIOD_KEY, Constants.DEFAULT_METADATA_REPORT_RETRY_PERIOD));
         // cycle report the data switch
         if (reportServerURL.getParameter(Constants.CYCLE_REPORT_KEY, Constants.DEFAULT_METADATA_REPORT_CYCLE_REPORT)) {
-            ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(0, new NamedThreadFactory("DubboMetadataReportTimer", true));
+            ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("DubboMetadataReportTimer", true));
             scheduler.scheduleAtFixedRate(new Runnable() {
                 @Override
                 public void run() {


[incubator-dubbo] 05/10: fix UT

Posted by li...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

liujun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git

commit cedba72024848fa3ceae1d1e6f89e6960b284fb5
Author: ken.lj <ke...@gmail.com>
AuthorDate: Sun Dec 23 21:46:06 2018 +0800

    fix UT
---
 .../dubbo/rpc/cluster/configurator/parser/ConfigParserTest.java     | 6 +-----
 dubbo-cluster/src/test/resources/AppAnyServices.yml                 | 2 +-
 dubbo-cluster/src/test/resources/AppMultiServices.yml               | 2 +-
 dubbo-cluster/src/test/resources/AppNoService.yml                   | 2 +-
 dubbo-cluster/src/test/resources/ConsumerSpecificProviders.yml      | 2 +-
 dubbo-cluster/src/test/resources/ServiceGroupVersion.yml            | 2 +-
 dubbo-cluster/src/test/resources/ServiceMultiApps.yml               | 2 +-
 dubbo-cluster/src/test/resources/ServiceNoApp.yml                   | 2 +-
 dubbo-cluster/src/test/resources/ServiceNoRule.yml                  | 2 +-
 9 files changed, 9 insertions(+), 13 deletions(-)

diff --git a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/configurator/parser/ConfigParserTest.java b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/configurator/parser/ConfigParserTest.java
index 809437f..0c365c0 100644
--- a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/configurator/parser/ConfigParserTest.java
+++ b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/configurator/parser/ConfigParserTest.java
@@ -107,17 +107,13 @@ public class ConfigParserTest {
         String yamlFile = streamToString(yamlStream);
         List<URL> urls = ConfigParser.parseConfigurators(yamlFile);
         Assert.assertNotNull(urls);
-        Assert.assertEquals(2, urls.size());
+        Assert.assertEquals(4, urls.size());
         URL url = urls.get(0);
         Assert.assertEquals("127.0.0.1", url.getAddress());
         Assert.assertEquals("service1", url.getServiceInterface());
         Assert.assertEquals(6666, url.getParameter(Constants.TIMEOUT_KEY, 0));
         Assert.assertEquals("random", url.getParameter(Constants.LOADBALANCE_KEY));
         Assert.assertEquals(url.getParameter(Constants.APPLICATION_KEY), "demo-consumer");
-
-        List<URL> urls2 = ConfigParser.parseConfigurators(yamlFile);
-        Assert.assertNotNull(urls2);
-        Assert.assertEquals(0, urls2.size());
     }
 
 
diff --git a/dubbo-cluster/src/test/resources/AppAnyServices.yml b/dubbo-cluster/src/test/resources/AppAnyServices.yml
index 947faea..e1b401c 100644
--- a/dubbo-cluster/src/test/resources/AppAnyServices.yml
+++ b/dubbo-cluster/src/test/resources/AppAnyServices.yml
@@ -19,7 +19,7 @@
 
 # Application scope, apply to all services.
 ---
-apiVersion: v2.7
+configVersion: v2.7
 scope: application
 key: demo-consumer
 configs:
diff --git a/dubbo-cluster/src/test/resources/AppMultiServices.yml b/dubbo-cluster/src/test/resources/AppMultiServices.yml
index f7f9098..bc6d6bc 100644
--- a/dubbo-cluster/src/test/resources/AppMultiServices.yml
+++ b/dubbo-cluster/src/test/resources/AppMultiServices.yml
@@ -19,7 +19,7 @@
 
 # Application scope, apply to the specified services
 ---
-apiVersion: v2.7
+configVersion: v2.7
 scope: application
 key: demo-consumer
 configs:
diff --git a/dubbo-cluster/src/test/resources/AppNoService.yml b/dubbo-cluster/src/test/resources/AppNoService.yml
index ee8dca3..4b6a236 100644
--- a/dubbo-cluster/src/test/resources/AppNoService.yml
+++ b/dubbo-cluster/src/test/resources/AppNoService.yml
@@ -19,7 +19,7 @@
 
 # Application scope, no service means apply to all
 ---
-apiVersion: v2.7
+configVersion: v2.7
 scope: application
 key: demo-consumer
 configs:
diff --git a/dubbo-cluster/src/test/resources/ConsumerSpecificProviders.yml b/dubbo-cluster/src/test/resources/ConsumerSpecificProviders.yml
index 1e9be4f..2da6a22 100644
--- a/dubbo-cluster/src/test/resources/ConsumerSpecificProviders.yml
+++ b/dubbo-cluster/src/test/resources/ConsumerSpecificProviders.yml
@@ -19,7 +19,7 @@
 
 # Application scope, no service means apply to all
 ---
-apiVersion: v2.7
+configVersion: v2.7
 scope: application
 key: demo-consumer
 configs:
diff --git a/dubbo-cluster/src/test/resources/ServiceGroupVersion.yml b/dubbo-cluster/src/test/resources/ServiceGroupVersion.yml
index 1c09d0d..6d48c5c 100644
--- a/dubbo-cluster/src/test/resources/ServiceGroupVersion.yml
+++ b/dubbo-cluster/src/test/resources/ServiceGroupVersion.yml
@@ -19,7 +19,7 @@
 
 # Service scope, without any app
 ---
-apiVersion: v2.7
+configVersion: v2.7
 scope: service
 key: testgroup/servicekey:1.0.0
 configs:
diff --git a/dubbo-cluster/src/test/resources/ServiceMultiApps.yml b/dubbo-cluster/src/test/resources/ServiceMultiApps.yml
index 6cf3a19..43ed62a 100644
--- a/dubbo-cluster/src/test/resources/ServiceMultiApps.yml
+++ b/dubbo-cluster/src/test/resources/ServiceMultiApps.yml
@@ -19,7 +19,7 @@
 
 # Service scope, with multiple apps
 ---
-apiVersion: v2.7
+configVersion: v2.7
 scope: service
 key: serviceKey
 configs:
diff --git a/dubbo-cluster/src/test/resources/ServiceNoApp.yml b/dubbo-cluster/src/test/resources/ServiceNoApp.yml
index 1a5f191..5009c61 100644
--- a/dubbo-cluster/src/test/resources/ServiceNoApp.yml
+++ b/dubbo-cluster/src/test/resources/ServiceNoApp.yml
@@ -19,7 +19,7 @@
 
 # Service scope, without any app
 ---
-apiVersion: v2.7
+configVersion: v2.7
 scope: service
 key: serviceKey
 configs:
diff --git a/dubbo-cluster/src/test/resources/ServiceNoRule.yml b/dubbo-cluster/src/test/resources/ServiceNoRule.yml
index 7dd21fe..b320878 100644
--- a/dubbo-cluster/src/test/resources/ServiceNoRule.yml
+++ b/dubbo-cluster/src/test/resources/ServiceNoRule.yml
@@ -19,7 +19,7 @@
 
 # Service scope, without  specific App
 ---
-apiVersion: v2.7
+configVersion: v2.7
 scope: service
 key: serviceKey
 configs: