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 2021/11/25 06:19:47 UTC

[dubbo] 01/45: first commit

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

liujun pushed a commit to branch release/3.0.14-rpccontext-bugfix
in repository https://gitbox.apache.org/repos/asf/dubbo.git

commit e13170e4ff5f0f01178eaa948ffd2dd8dc62fa54
Author: 未宇 <li...@alibaba-inc.com>
AuthorDate: Fri Jun 5 14:39:30 2020 +0800

    first commit
---
 .codecov.yml                                       |   11 +
 .../ISSUE_TEMPLATE/dubbo-issue-report-template.md  |   36 +
 .gitignore                                         |   43 +
 .mvn/wrapper/maven-wrapper.jar                     |  Bin 0 -> 47774 bytes
 .mvn/wrapper/maven-wrapper.properties              |    1 +
 .travis.yml                                        |   22 +
 CHANGES.md                                         |  511 ++
 CODE_OF_CONDUCT.md                                 |   46 +
 CONTRIBUTING.md                                    |   76 +
 Jenkinsfile                                        |  138 +
 LICENSE                                            |  282 ++
 NOTICE                                             |   22 +
 PULL_REQUEST_TEMPLATE.md                           |   20 +
 README.md                                          |  239 +
 SECURITY.md                                        |   31 +
 codestyle/checkstyle-suppressions.xml              |    8 +
 codestyle/checkstyle.xml                           |   38 +
 codestyle/dubbo_codestyle_for_idea.xml             |   16 +
 codestyle/manage_profiles.png                      |  Bin 0 -> 430 bytes
 compiler/pom.xml                                   |  237 +
 .../org/apache/dubbo/gen/AbstractGenerator.java    |  293 ++
 .../org/apache/dubbo/gen/dubbo/DubboGenerator.java |   42 +
 .../apache/dubbo/gen/grpc/DubboGrpcGenerator.java  |   41 +
 .../grpc/reactive/ReactorDubboGrpcGenerator.java   |   42 +
 .../gen/grpc/reactive/RxDubboGrpcGenerator.java    |   41 +
 compiler/src/main/resources/DubboGrpcStub.mustache |  312 ++
 compiler/src/main/resources/DubboStub.mustache     |   53 +
 .../main/resources/ReactorDubboGrpcStub.mustache   |  212 +
 .../src/main/resources/RxDubboGrpcStub.mustache    |  246 +
 dubbo-all/pom.xml                                  | 1042 ++++
 dubbo-bom/pom.xml                                  |  459 ++
 dubbo-build-tools/pom.xml                          |   30 +
 .../src/main/resources/checkstyle-header.txt       |   16 +
 dubbo-cluster/pom.xml                              |   54 +
 .../dubbo/rpc/cluster/CacheableRouterFactory.java  |   37 +
 .../java/org/apache/dubbo/rpc/cluster/Cluster.java |   59 +
 .../apache/dubbo/rpc/cluster/ClusterInvoker.java   |   38 +
 .../org/apache/dubbo/rpc/cluster/Configurator.java |  120 +
 .../dubbo/rpc/cluster/ConfiguratorFactory.java     |   39 +
 .../org/apache/dubbo/rpc/cluster/Constants.java    |  102 +
 .../org/apache/dubbo/rpc/cluster/Directory.java    |   54 +
 .../org/apache/dubbo/rpc/cluster/LoadBalance.java  |   50 +
 .../java/org/apache/dubbo/rpc/cluster/Merger.java  |   26 +
 .../java/org/apache/dubbo/rpc/cluster/Router.java  |   99 +
 .../org/apache/dubbo/rpc/cluster/RouterChain.java  |  112 +
 .../apache/dubbo/rpc/cluster/RouterFactory.java    |   47 +
 .../apache/dubbo/rpc/cluster/RuleConverter.java    |   30 +
 .../cluster/configurator/AbstractConfigurator.java |  158 +
 .../configurator/absent/AbsentConfigurator.java    |   37 +
 .../absent/AbsentConfiguratorFactory.java          |   34 +
 .../override/OverrideConfigurator.java             |   37 +
 .../override/OverrideConfiguratorFactory.java      |   34 +
 .../cluster/configurator/parser/ConfigParser.java  |  229 +
 .../configurator/parser/model/ConfigItem.java      |  103 +
 .../parser/model/ConfiguratorConfig.java           |   74 +
 .../rpc/cluster/directory/AbstractDirectory.java   |  114 +
 .../rpc/cluster/directory/StaticDirectory.java     |  113 +
 .../DefaultGovernanceRuleRepositoryImpl.java       |   40 +
 .../governance/GovernanceRuleRepository.java       |   91 +
 .../cluster/interceptor/ClusterInterceptor.java    |   56 +
 .../ConsumerContextClusterInterceptor.java         |   54 +
 .../interceptor/ZoneAwareClusterInterceptor.java   |   62 +
 .../cluster/loadbalance/AbstractLoadBalance.java   |   99 +
 .../loadbalance/ConsistentHashLoadBalance.java     |  147 +
 .../loadbalance/LeastActiveLoadBalance.java        |  115 +
 .../rpc/cluster/loadbalance/RandomLoadBalance.java |   84 +
 .../cluster/loadbalance/RoundRobinLoadBalance.java |  131 +
 .../loadbalance/ShortestResponseLoadBalance.java   |  100 +
 .../dubbo/rpc/cluster/merger/ArrayMerger.java      |   73 +
 .../rpc/cluster/merger/BooleanArrayMerger.java     |   48 +
 .../dubbo/rpc/cluster/merger/ByteArrayMerger.java  |   48 +
 .../dubbo/rpc/cluster/merger/CharArrayMerger.java  |   47 +
 .../rpc/cluster/merger/DoubleArrayMerger.java      |   37 +
 .../dubbo/rpc/cluster/merger/FloatArrayMerger.java |   47 +
 .../dubbo/rpc/cluster/merger/IntArrayMerger.java   |   38 +
 .../dubbo/rpc/cluster/merger/ListMerger.java       |   43 +
 .../dubbo/rpc/cluster/merger/LongArrayMerger.java  |   37 +
 .../apache/dubbo/rpc/cluster/merger/MapMerger.java |   40 +
 .../dubbo/rpc/cluster/merger/MergerFactory.java    |   76 +
 .../apache/dubbo/rpc/cluster/merger/SetMerger.java |   39 +
 .../dubbo/rpc/cluster/merger/ShortArrayMerger.java |   47 +
 .../dubbo/rpc/cluster/router/AbstractRouter.java   |   71 +
 .../rpc/cluster/router/AbstractRouterRule.java     |  105 +
 .../cluster/router/condition/ConditionRouter.java  |  301 ++
 .../router/condition/ConditionRouterFactory.java   |   36 +
 .../cluster/router/condition/config/AppRouter.java |   36 +
 .../router/condition/config/AppRouterFactory.java  |   49 +
 .../router/condition/config/ListenableRouter.java  |  127 +
 .../router/condition/config/ServiceRouter.java     |   36 +
 .../condition/config/ServiceRouterFactory.java     |   37 +
 .../config/model/ConditionRouterRule.java          |   39 +
 .../config/model/ConditionRuleParser.java          |   53 +
 .../rpc/cluster/router/file/FileRouterFactory.java |   76 +
 .../cluster/router/mock/MockInvokersSelector.java  |  103 +
 .../rpc/cluster/router/mock/MockRouterFactory.java |   36 +
 .../rpc/cluster/router/script/ScriptRouter.java    |  159 +
 .../cluster/router/script/ScriptRouterFactory.java |   45 +
 .../dubbo/rpc/cluster/router/tag/TagRouter.java    |  263 +
 .../rpc/cluster/router/tag/TagRouterFactory.java   |   36 +
 .../dubbo/rpc/cluster/router/tag/model/Tag.java    |   43 +
 .../cluster/router/tag/model/TagRouterRule.java    |   90 +
 .../cluster/router/tag/model/TagRuleParser.java    |   45 +
 .../cluster/support/AbstractClusterInvoker.java    |  314 ++
 .../rpc/cluster/support/AvailableCluster.java      |   37 +
 .../cluster/support/AvailableClusterInvoker.java   |   48 +
 .../rpc/cluster/support/BroadcastCluster.java      |   34 +
 .../cluster/support/BroadcastClusterInvoker.java   |   67 +
 .../dubbo/rpc/cluster/support/ClusterUtils.java    |  120 +
 .../dubbo/rpc/cluster/support/FailbackCluster.java |   36 +
 .../cluster/support/FailbackClusterInvoker.java    |  168 +
 .../dubbo/rpc/cluster/support/FailfastCluster.java |   36 +
 .../cluster/support/FailfastClusterInvoker.java    |   62 +
 .../dubbo/rpc/cluster/support/FailoverCluster.java |   36 +
 .../cluster/support/FailoverClusterInvoker.java    |  116 +
 .../dubbo/rpc/cluster/support/FailsafeCluster.java |   36 +
 .../cluster/support/FailsafeClusterInvoker.java    |   56 +
 .../dubbo/rpc/cluster/support/ForkingCluster.java  |   36 +
 .../rpc/cluster/support/ForkingClusterInvoker.java |  113 +
 .../rpc/cluster/support/MergeableCluster.java      |   32 +
 .../cluster/support/MergeableClusterInvoker.java   |  195 +
 .../cluster/support/registry/ZoneAwareCluster.java |   36 +
 .../support/registry/ZoneAwareClusterInvoker.java  |  106 +
 .../cluster/support/wrapper/AbstractCluster.java   |  132 +
 .../support/wrapper/MockClusterInvoker.java        |  190 +
 .../support/wrapper/MockClusterWrapper.java        |   43 +
 .../internal/org.apache.dubbo.rpc.cluster.Cluster  |   10 +
 ...rg.apache.dubbo.rpc.cluster.ConfiguratorFactory |    2 +
 .../org.apache.dubbo.rpc.cluster.LoadBalance       |    5 +
 .../internal/org.apache.dubbo.rpc.cluster.Merger   |   11 +
 .../org.apache.dubbo.rpc.cluster.RouterFactory     |    7 +
 ...rpc.cluster.governance.GovernanceRuleRepository |    1 +
 ...ubbo.rpc.cluster.interceptor.ClusterInterceptor |    2 +
 .../org/apache/dubbo/rpc/cluster/StickyTest.java   |  166 +
 .../absent/AbsentConfiguratorTest.java             |   68 +
 .../cluster/configurator/consts/UrlConstant.java   |   31 +
 .../override/OverrideConfiguratorTest.java         |   68 +
 .../configurator/parser/ConfigParserTest.java      |  193 +
 .../rpc/cluster/directory/MockDirInvocation.java   |  154 +
 .../rpc/cluster/directory/StaticDirectoryTest.java |   66 +
 .../dubbo/rpc/cluster/filter/DemoService.java      |   27 +
 .../dubbo/rpc/cluster/filter/DemoServiceLocal.java |   43 +
 .../dubbo/rpc/cluster/filter/DemoServiceMock.java  |   31 +
 .../dubbo/rpc/cluster/filter/DemoServiceStub.java  |   35 +
 .../dubbo/rpc/cluster/filter/MockService.java      |   31 +
 .../loadbalance/AbstractLoadBalanceTest.java       |   82 +
 .../loadbalance/ConsistentHashLoadBalanceTest.java |   72 +
 .../loadbalance/LeastActiveBalanceTest.java        |   69 +
 .../cluster/loadbalance/LoadBalanceBaseTest.java   |  298 ++
 .../cluster/loadbalance/RandomLoadBalanceTest.java |   88 +
 .../loadbalance/RoundRobinLoadBalanceTest.java     |  168 +
 .../ShortestResponseLoadBalanceTest.java           |   53 +
 .../dubbo/rpc/cluster/merger/ResultMergerTest.java |  364 ++
 .../cluster/router/ConfigConditionRouterTest.java  |  133 +
 .../dubbo/rpc/cluster/router/MockInvoker.java      |   63 +
 .../dubbo/rpc/cluster/router/TagRouterTest.java    |  112 +
 .../router/condition/ConditionRouterTest.java      |  314 ++
 .../cluster/router/file/FileRouterEngineTest.java  |  192 +
 .../cluster/router/script/ScriptRouterTest.java    |  132 +
 .../support/AbstractClusterInvokerTest.java        |  540 ++
 .../rpc/cluster/support/ClusterUtilsTest.java      |  168 +
 .../support/FailSafeClusterInvokerTest.java        |  122 +
 .../support/FailbackClusterInvokerTest.java        |  177 +
 .../support/FailfastClusterInvokerTest.java        |  127 +
 .../support/FailoverClusterInvokerTest.java        |  262 +
 .../cluster/support/ForkingClusterInvokerTest.java |  157 +
 .../org/apache/dubbo/rpc/cluster/support/Menu.java |   66 +
 .../dubbo/rpc/cluster/support/MenuService.java     |   27 +
 .../support/MergeableClusterInvokerTest.java       |  224 +
 .../support/wrapper/MockClusterInvokerTest.java    |  816 ++++
 .../wrapper/MockProviderRpcExceptionTest.java      |  238 +
 .../cluster/support/wrapper/MyMockException.java   |   28 +
 .../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 +
 dubbo-cluster/src/test/resources/log4j.xml         |   30 +
 .../cluster/router/file/availablerule.javascript   |   11 +
 .../rpc/cluster/router/file/methodrule.javascript  |   10 +
 .../router/file/notAvailablerule.javascript        |   11 +
 dubbo-common/pom.xml                               |   77 +
 .../alibaba/dubbo/common/extension/Activate.java   |   45 +
 .../alibaba/dubbo/config/annotation/Reference.java |  113 +
 .../alibaba/dubbo/config/annotation/Service.java   |  120 +
 .../apache/dubbo/common/BaseServiceMetadata.java   |  135 +
 .../java/org/apache/dubbo/common/Experimental.java |   37 +
 .../java/org/apache/dubbo/common/Extension.java    |   68 +
 .../main/java/org/apache/dubbo/common/Node.java    |   43 +
 .../java/org/apache/dubbo/common/Parameters.java   |  260 +
 .../java/org/apache/dubbo/common/Resetable.java    |   31 +
 .../src/main/java/org/apache/dubbo/common/URL.java | 1638 +++++++
 .../java/org/apache/dubbo/common/URLBuilder.java   |  427 ++
 .../java/org/apache/dubbo/common/URLStrParser.java |  348 ++
 .../main/java/org/apache/dubbo/common/Version.java |  273 ++
 .../dubbo/common/beanutil/JavaBeanAccessor.java    |   42 +
 .../dubbo/common/beanutil/JavaBeanDescriptor.java  |  207 +
 .../common/beanutil/JavaBeanSerializeUtil.java     |  484 ++
 .../dubbo/common/bytecode/ClassGenerator.java      |  390 ++
 .../dubbo/common/bytecode/HSFLoaderClassPath.java  |  104 +
 .../org/apache/dubbo/common/bytecode/Mixin.java    |  227 +
 .../common/bytecode/NoSuchMethodException.java     |   33 +
 .../common/bytecode/NoSuchPropertyException.java   |   33 +
 .../org/apache/dubbo/common/bytecode/Proxy.java    |  277 ++
 .../org/apache/dubbo/common/bytecode/Wrapper.java  |  453 ++
 .../org/apache/dubbo/common/compiler/Compiler.java |   36 +
 .../common/compiler/support/AbstractCompiler.java  |   69 +
 .../common/compiler/support/AdaptiveCompiler.java  |   48 +
 .../dubbo/common/compiler/support/ClassUtils.java  |  447 ++
 .../common/compiler/support/CtClassBuilder.java    |  174 +
 .../common/compiler/support/JavassistCompiler.java |   85 +
 .../dubbo/common/compiler/support/JdkCompiler.java |  286 ++
 .../common/config/CompositeConfiguration.java      |  116 +
 .../apache/dubbo/common/config/Configuration.java  |  179 +
 .../dubbo/common/config/ConfigurationUtils.java    |  117 +
 .../apache/dubbo/common/config/Environment.java    |  216 +
 .../common/config/EnvironmentConfiguration.java    |   35 +
 .../dubbo/common/config/InmemoryConfiguration.java |   64 +
 .../common/config/OrderedPropertiesProvider.java   |   44 +
 .../common/config/PropertiesConfiguration.java     |   64 +
 .../dubbo/common/config/SystemConfiguration.java   |   33 +
 .../configcenter/AbstractDynamicConfiguration.java |  219 +
 .../AbstractDynamicConfigurationFactory.java       |   43 +
 .../config/configcenter/ConfigChangeType.java      |   37 +
 .../config/configcenter/ConfigChangedEvent.java    |   90 +
 .../config/configcenter/ConfigurationListener.java |   33 +
 .../common/config/configcenter/Constants.java      |   24 +
 .../config/configcenter/DynamicConfiguration.java  |  235 +
 .../configcenter/DynamicConfigurationFactory.java  |   46 +
 .../file/FileSystemDynamicConfiguration.java       |  597 +++
 .../FileSystemDynamicConfigurationFactory.java     |   35 +
 .../configcenter/nop/NopDynamicConfiguration.java  |   72 +
 .../nop/NopDynamicConfigurationFactory.java        |   33 +
 .../wrapper/CompositeDynamicConfiguration.java     |  101 +
 .../dubbo/common/constants/CommonConstants.java    |  317 ++
 .../dubbo/common/constants/FilterConstants.java    |   24 +
 .../dubbo/common/constants/QosConstants.java       |   32 +
 .../dubbo/common/constants/RegistryConstants.java  |  105 +
 .../dubbo/common/constants/RemotingConstants.java  |   26 +
 .../apache/dubbo/common/context/FrameworkExt.java  |   24 +
 .../org/apache/dubbo/common/context/Lifecycle.java |   48 +
 .../dubbo/common/context/LifecycleAdapter.java     |   35 +
 .../org/apache/dubbo/common/convert/Converter.java |   91 +
 .../dubbo/common/convert/StringConverter.java      |   27 +
 .../common/convert/StringToBooleanConverter.java   |   38 +
 .../common/convert/StringToCharArrayConverter.java |   39 +
 .../common/convert/StringToCharacterConverter.java |   44 +
 .../common/convert/StringToDoubleConverter.java    |   39 +
 .../common/convert/StringToFloatConverter.java     |   38 +
 .../common/convert/StringToIntegerConverter.java   |   38 +
 .../common/convert/StringToLongConverter.java      |   39 +
 .../common/convert/StringToOptionalConverter.java  |   40 +
 .../common/convert/StringToShortConverter.java     |   39 +
 .../common/convert/StringToStringConverter.java    |   30 +
 .../convert/multiple/MultiValueConverter.java      |   64 +
 .../convert/multiple/StringToArrayConverter.java   |   60 +
 .../multiple/StringToBlockingDequeConverter.java   |   33 +
 .../multiple/StringToBlockingQueueConverter.java   |   34 +
 .../multiple/StringToCollectionConverter.java      |   33 +
 .../convert/multiple/StringToDequeConverter.java   |   33 +
 .../multiple/StringToIterableConverter.java        |   80 +
 .../convert/multiple/StringToListConverter.java    |   33 +
 .../multiple/StringToMultiValueConverter.java      |   61 +
 .../multiple/StringToNavigableSetConverter.java    |   34 +
 .../convert/multiple/StringToQueueConverter.java   |   34 +
 .../convert/multiple/StringToSetConverter.java     |   33 +
 .../multiple/StringToSortedSetConverter.java       |   33 +
 .../multiple/StringToTransferQueueConverter.java   |   33 +
 .../apache/dubbo/common/extension/Activate.java    |   92 +
 .../apache/dubbo/common/extension/Adaptive.java    |   60 +
 .../extension/AdaptiveClassCodeGenerator.java      |  396 ++
 .../dubbo/common/extension/DisableInject.java      |   29 +
 .../extension/DubboInternalLoadingStrategy.java    |   35 +
 .../common/extension/DubboLoadingStrategy.java     |   42 +
 .../dubbo/common/extension/ExtensionFactory.java   |   34 +
 .../dubbo/common/extension/ExtensionLoader.java    | 1045 ++++
 .../dubbo/common/extension/LoadingStrategy.java    |   42 +
 .../org/apache/dubbo/common/extension/SPI.java     |   64 +
 .../common/extension/ServicesLoadingStrategy.java  |   41 +
 .../org/apache/dubbo/common/extension/Wrapper.java |   33 +
 .../factory/AdaptiveExtensionFactory.java          |   55 +
 .../extension/factory/SpiExtensionFactory.java     |   39 +
 .../extension/support/ActivateComparator.java      |  137 +
 .../extension/support/WrapperComparator.java       |   95 +
 .../apache/dubbo/common/function/Predicates.java   |   74 +
 .../org/apache/dubbo/common/function/Streams.java  |   71 +
 .../dubbo/common/function/ThrowableAction.java     |   51 +
 .../dubbo/common/function/ThrowableConsumer.java   |   66 +
 .../dubbo/common/function/ThrowableFunction.java   |   71 +
 .../apache/dubbo/common/infra/InfraAdapter.java    |   46 +
 .../dubbo/common/infra/support/CmdbAdapter.java    |   39 +
 .../common/infra/support/EnvironmentAdapter.java   |   72 +
 .../java/org/apache/dubbo/common/io/Bytes.java     |  936 ++++
 .../org/apache/dubbo/common/io/StreamUtils.java    |  231 +
 .../common/io/UnsafeByteArrayInputStream.java      |  118 +
 .../common/io/UnsafeByteArrayOutputStream.java     |  101 +
 .../apache/dubbo/common/io/UnsafeStringReader.java |  118 +
 .../apache/dubbo/common/io/UnsafeStringWriter.java |  107 +
 .../dubbo/common/json/GenericJSONConverter.java    |  528 ++
 .../org/apache/dubbo/common/json/J2oVisitor.java   |  393 ++
 .../java/org/apache/dubbo/common/json/JSON.java    |  711 +++
 .../org/apache/dubbo/common/json/JSONArray.java    |  184 +
 .../apache/dubbo/common/json/JSONConverter.java    |   44 +
 .../org/apache/dubbo/common/json/JSONNode.java     |   34 +
 .../org/apache/dubbo/common/json/JSONObject.java   |  209 +
 .../org/apache/dubbo/common/json/JSONReader.java   |   68 +
 .../org/apache/dubbo/common/json/JSONToken.java    |   72 +
 .../org/apache/dubbo/common/json/JSONVisitor.java  |  107 +
 .../org/apache/dubbo/common/json/JSONWriter.java   |  305 ++
 .../apache/dubbo/common/json/ParseException.java   |   33 +
 .../java/org/apache/dubbo/common/json/Yylex.java   |  847 ++++
 .../org/apache/dubbo/common/lang/Prioritized.java  |   76 +
 .../dubbo/common/lang/ShutdownHookCallback.java    |   35 +
 .../dubbo/common/lang/ShutdownHookCallbacks.java   |   72 +
 .../java/org/apache/dubbo/common/logger/Level.java |   59 +
 .../org/apache/dubbo/common/logger/Logger.java     |  171 +
 .../apache/dubbo/common/logger/LoggerAdapter.java  |   72 +
 .../apache/dubbo/common/logger/LoggerFactory.java  |  151 +
 .../apache/dubbo/common/logger/jcl/JclLogger.java  |  139 +
 .../dubbo/common/logger/jcl/JclLoggerAdapter.java  |   62 +
 .../apache/dubbo/common/logger/jdk/JdkLogger.java  |  131 +
 .../dubbo/common/logger/jdk/JdkLoggerAdapter.java  |  139 +
 .../dubbo/common/logger/log4j/Log4jLogger.java     |  134 +
 .../common/logger/log4j/Log4jLoggerAdapter.java    |  132 +
 .../dubbo/common/logger/log4j2/Log4j2Logger.java   |  128 +
 .../common/logger/log4j2/Log4j2LoggerAdapter.java  |  107 +
 .../dubbo/common/logger/slf4j/Slf4jLogger.java     |  205 +
 .../common/logger/slf4j/Slf4jLoggerAdapter.java    |   60 +
 .../common/logger/support/FailsafeLogger.java      |  208 +
 .../org/apache/dubbo/common/status/Status.java     |   79 +
 .../apache/dubbo/common/status/StatusChecker.java  |   34 +
 .../common/status/support/LoadStatusChecker.java   |   53 +
 .../common/status/support/MemoryStatusChecker.java |   41 +
 .../dubbo/common/status/support/StatusUtils.java   |   55 +
 .../org/apache/dubbo/common/store/DataStore.java   |   38 +
 .../common/store/support/SimpleDataStore.java      |   65 +
 .../dubbo/common/threadlocal/InternalThread.java   |   73 +
 .../common/threadlocal/InternalThreadLocal.java    |  198 +
 .../common/threadlocal/InternalThreadLocalMap.java |  167 +
 .../threadlocal/NamedInternalThreadFactory.java    |   47 +
 .../apache/dubbo/common/threadpool/ThreadPool.java |   42 +
 .../common/threadpool/ThreadlessExecutor.java      |  183 +
 .../concurrent/ScheduledCompletableFuture.java     |   65 +
 .../threadpool/event/ThreadPoolExhaustedEvent.java |   38 +
 .../manager/DefaultExecutorRepository.java         |  166 +
 .../threadpool/manager/ExecutorRepository.java     |   67 +
 .../dubbo/common/threadpool/manager/Ring.java      |   66 +
 .../threadpool/support/AbortPolicyWithReport.java  |  137 +
 .../support/cached/CachedThreadPool.java           |   61 +
 .../threadpool/support/eager/EagerThreadPool.java  |   65 +
 .../support/eager/EagerThreadPoolExecutor.java     |   85 +
 .../common/threadpool/support/eager/TaskQueue.java |   79 +
 .../threadpool/support/fixed/FixedThreadPool.java  |   56 +
 .../support/limited/LimitedThreadPool.java         |   59 +
 .../dubbo/common/timer/HashedWheelTimer.java       |  812 ++++
 .../org/apache/dubbo/common/timer/Timeout.java     |   55 +
 .../java/org/apache/dubbo/common/timer/Timer.java  |   55 +
 .../org/apache/dubbo/common/timer/TimerTask.java   |   34 +
 .../apache/dubbo/common/utils/AnnotationUtils.java |  452 ++
 .../org/apache/dubbo/common/utils/ArrayUtils.java  |   69 +
 .../java/org/apache/dubbo/common/utils/Assert.java |   42 +
 .../dubbo/common/utils/AtomicPositiveInteger.java  |  154 +
 .../org/apache/dubbo/common/utils/CIDRUtils.java   |  140 +
 .../dubbo/common/utils/CharSequenceComparator.java |   37 +
 .../org/apache/dubbo/common/utils/ClassHelper.java |  153 +
 .../org/apache/dubbo/common/utils/ClassUtils.java  |  498 ++
 .../apache/dubbo/common/utils/CollectionUtils.java |  381 ++
 .../dubbo/common/utils/CompatibleTypeUtils.java    |  223 +
 .../dubbo/common/utils/ConcurrentHashSet.java      |  130 +
 .../org/apache/dubbo/common/utils/ConfigUtils.java |  323 ++
 .../org/apache/dubbo/common/utils/DefaultPage.java |   82 +
 .../apache/dubbo/common/utils/DubboAppender.java   |   68 +
 .../apache/dubbo/common/utils/ExecutorUtil.java    |  144 +
 .../org/apache/dubbo/common/utils/FieldUtils.java  |  148 +
 .../java/org/apache/dubbo/common/utils/Holder.java |   34 +
 .../org/apache/dubbo/common/utils/IOUtils.java     |  231 +
 .../org/apache/dubbo/common/utils/JVMUtil.java     |  103 +
 .../org/apache/dubbo/common/utils/LFUCache.java    |  287 ++
 .../org/apache/dubbo/common/utils/LRUCache.java    |  115 +
 .../java/org/apache/dubbo/common/utils/Log.java    |  116 +
 .../org/apache/dubbo/common/utils/LogHelper.java   |  176 +
 .../org/apache/dubbo/common/utils/LogUtil.java     |  131 +
 .../org/apache/dubbo/common/utils/MemberUtils.java |   62 +
 .../dubbo/common/utils/MethodComparator.java       |   71 +
 .../org/apache/dubbo/common/utils/MethodUtils.java |  392 ++
 .../dubbo/common/utils/NamedThreadFactory.java     |   63 +
 .../org/apache/dubbo/common/utils/NetUtils.java    |  654 +++
 .../java/org/apache/dubbo/common/utils/Page.java   |   87 +
 .../org/apache/dubbo/common/utils/PathUtils.java   |   69 +
 .../org/apache/dubbo/common/utils/PojoUtils.java   |  629 +++
 .../apache/dubbo/common/utils/ReflectUtils.java    | 1319 +++++
 .../common/utils/ServiceAnnotationResolver.java    |  119 +
 .../java/org/apache/dubbo/common/utils/Stack.java  |  143 +
 .../org/apache/dubbo/common/utils/StringUtils.java | 1054 ++++
 .../org/apache/dubbo/common/utils/TypeUtils.java   |  224 +
 .../org/apache/dubbo/common/utils/UrlUtils.java    |  556 +++
 .../org/apache/dubbo/common/utils/Utf8Utils.java   |  229 +
 .../org/apache/dubbo/config/AbstractConfig.java    |  608 +++
 .../dubbo/config/AbstractInterfaceConfig.java      |  686 +++
 .../apache/dubbo/config/AbstractMethodConfig.java  |  208 +
 .../dubbo/config/AbstractReferenceConfig.java      |  248 +
 .../apache/dubbo/config/AbstractServiceConfig.java |  291 ++
 .../org/apache/dubbo/config/ApplicationConfig.java |  472 ++
 .../org/apache/dubbo/config/ArgumentConfig.java    |   83 +
 .../apache/dubbo/config/ConfigCenterConfig.java    |  289 ++
 .../java/org/apache/dubbo/config/Constants.java    |  118 +
 .../org/apache/dubbo/config/ConsumerConfig.java    |  135 +
 .../apache/dubbo/config/MetadataReportConfig.java  |  208 +
 .../java/org/apache/dubbo/config/MethodConfig.java |  332 ++
 .../org/apache/dubbo/config/MetricsConfig.java     |   53 +
 .../java/org/apache/dubbo/config/ModuleConfig.java |  153 +
 .../org/apache/dubbo/config/MonitorConfig.java     |  160 +
 .../org/apache/dubbo/config/ProtocolConfig.java    |  543 +++
 .../org/apache/dubbo/config/ProviderConfig.java    |  428 ++
 .../apache/dubbo/config/ReferenceConfigBase.java   |  290 ++
 .../org/apache/dubbo/config/RegistryConfig.java    |  530 ++
 .../org/apache/dubbo/config/ServiceConfigBase.java |  442 ++
 .../java/org/apache/dubbo/config/SslConfig.java    |  188 +
 .../apache/dubbo/config/annotation/Argument.java   |   44 +
 .../dubbo/config/annotation/DubboReference.java    |  282 ++
 .../dubbo/config/annotation/DubboService.java      |  278 ++
 .../org/apache/dubbo/config/annotation/Method.java |   71 +
 .../apache/dubbo/config/annotation/Reference.java  |  282 ++
 .../apache/dubbo/config/annotation/Service.java    |  281 ++
 .../config/context/ConfigConfigurationAdapter.java |   48 +
 .../apache/dubbo/config/context/ConfigManager.java |  516 ++
 .../org/apache/dubbo/config/support/Parameter.java |   62 +
 .../dubbo/event/AbstractEventDispatcher.java       |  168 +
 .../dubbo/event/ConditionalEventListener.java      |   35 +
 .../apache/dubbo/event/DirectEventDispatcher.java  |   30 +
 .../main/java/org/apache/dubbo/event/Event.java    |   49 +
 .../org/apache/dubbo/event/EventDispatcher.java    |   66 +
 .../java/org/apache/dubbo/event/EventListener.java |  119 +
 .../java/org/apache/dubbo/event/GenericEvent.java  |   34 +
 .../apache/dubbo/event/GenericEventListener.java   |  130 +
 .../java/org/apache/dubbo/event/Listenable.java    |  131 +
 .../dubbo/event/ParallelEventDispatcher.java       |   32 +
 .../dubbo/rpc/model/ApplicationInitListener.java   |   27 +
 .../apache/dubbo/rpc/model/ApplicationModel.java   |  128 +
 .../apache/dubbo/rpc/model/AsyncMethodInfo.java    |   87 +
 .../dubbo/rpc/model/BuiltinServiceDetector.java    |   26 +
 .../dubbo/rpc/model/ConsumerMethodModel.java       |  101 +
 .../org/apache/dubbo/rpc/model/ConsumerModel.java  |  208 +
 .../apache/dubbo/rpc/model/MethodDescriptor.java   |   93 +
 .../dubbo/rpc/model/ProviderMethodModel.java       |   80 +
 .../org/apache/dubbo/rpc/model/ProviderModel.java  |  204 +
 .../apache/dubbo/rpc/model/ServiceDescriptor.java  |  118 +
 .../apache/dubbo/rpc/model/ServiceMetadata.java    |  102 +
 .../apache/dubbo/rpc/model/ServiceRepository.java  |  185 +
 .../org/apache/dubbo/rpc/service/Destroyable.java  |   23 +
 .../org/apache/dubbo/rpc/service/EchoService.java  |   33 +
 .../dubbo/rpc/service/EchoServiceDetector.java     |   28 +
 .../apache/dubbo/rpc/service/GenericException.java |   65 +
 .../apache/dubbo/rpc/service/GenericService.java   |   48 +
 .../dubbo/rpc/service/GenericServiceDetector.java  |   28 +
 .../dubbo/rpc/support/GroupServiceKeyCache.java    |   71 +
 .../apache/dubbo/rpc/support/ProtocolUtils.java    |   91 +
 .../org.apache.dubbo.common.compiler.Compiler      |    3 +
 ...config.configcenter.DynamicConfigurationFactory |    2 +
 .../org.apache.dubbo.common.context.FrameworkExt   |    3 +
 .../org.apache.dubbo.common.convert.Converter      |   11 +
 ...bbo.common.convert.multiple.MultiValueConverter |   12 +
 ....apache.dubbo.common.extension.ExtensionFactory |    2 +
 .../org.apache.dubbo.common.infra.InfraAdapter     |    1 +
 .../org.apache.dubbo.common.logger.LoggerAdapter   |    5 +
 .../org.apache.dubbo.common.status.StatusChecker   |    2 +
 .../org.apache.dubbo.common.store.DataStore        |    1 +
 .../org.apache.dubbo.common.threadpool.ThreadPool  |    4 +
 ...bo.common.threadpool.manager.ExecutorRepository |    1 +
 .../org.apache.dubbo.event.EventDispatcher         |    2 +
 ...g.apache.dubbo.rpc.model.BuiltinServiceDetector |    2 +
 ...g.apache.dubbo.common.extension.LoadingStrategy |    3 +
 .../org/apache/dubbo/common/URLBuilderTest.java    |  100 +
 .../org/apache/dubbo/common/URLStrParserTest.java  |   40 +
 .../test/java/org/apache/dubbo/common/URLTest.java |  877 ++++
 .../org/apache/dubbo/common/beanutil/Bean.java     |   87 +
 .../common/beanutil/JavaBeanAccessorTest.java      |   37 +
 .../common/beanutil/JavaBeanSerializeUtilTest.java |  547 +++
 .../dubbo/common/bytecode/ClassGeneratorTest.java  |  108 +
 .../apache/dubbo/common/bytecode/MixinTest.java    |   72 +
 .../apache/dubbo/common/bytecode/ProxyTest.java    |   74 +
 .../apache/dubbo/common/bytecode/WrapperTest.java  |  196 +
 .../compiler/support/AdaptiveCompilerTest.java     |   33 +
 .../common/compiler/support/ClassUtilsTest.java    |  188 +
 .../common/compiler/support/HelloService.java      |   23 +
 .../common/compiler/support/HelloServiceImpl0.java |   24 +
 .../common/compiler/support/JavaCodeTest.java      |  101 +
 .../compiler/support/JavassistCompilerTest.java    |   76 +
 .../common/compiler/support/JdkCompilerTest.java   |   56 +
 .../support/internal/HelloServiceInternalImpl.java |   20 +
 .../concurrent/CompletableFutureTaskTest.java      |   95 +
 .../config/AbstractPrefixConfigurationTest.java    |   23 +
 .../common/config/CompositeConfigurationTest.java  |   23 +
 .../common/config/ConfigurationUtilsTest.java      |   69 +
 .../config/EnvironmentConfigurationTest.java       |  104 +
 .../dubbo/common/config/EnvironmentTest.java       |   23 +
 .../common/config/InmemoryConfigurationTest.java   |  110 +
 .../config/MockOrderedPropertiesProvider1.java     |   33 +
 .../config/MockOrderedPropertiesProvider2.java     |   33 +
 .../common/config/PropertiesConfigurationTest.java |   31 +
 .../common/config/SystemConfigurationTest.java     |  117 +
 .../AbstractDynamicConfigurationFactoryTest.java   |   52 +
 .../AbstractDynamicConfigurationTest.java          |  152 +
 .../config/configcenter/ConfigChangeTypeTest.java  |   38 +
 .../configcenter/ConfigChangedEventTest.java       |   71 +
 .../DynamicConfigurationFactoryTest.java           |   39 +
 .../FileSystemDynamicConfigurationFactoryTest.java |   36 +
 .../file/FileSystemDynamicConfigurationTest.java   |  150 +
 .../extension/AdaptiveClassCodeGeneratorTest.java  |   51 +
 .../extension/DubboExternalLoadingStrategy.java    |   40 +
 .../common/extension/ExtensionLoaderTest.java      |  533 ++
 .../extension/ExtensionLoader_Adaptive_Test.java   |  322 ++
 ...tensionLoader_Adaptive_UseJdkCompiler_Test.java |   34 +
 .../extension/ExtensionLoader_Compatible_Test.java |   34 +
 .../apache/dubbo/common/extension/NoSpiExt.java    |   27 +
 .../common/extension/activate/ActivateExt1.java    |   25 +
 .../extension/activate/impl/ActivateExt1Impl1.java |   28 +
 .../activate/impl/GroupActivateExtImpl.java        |   29 +
 .../activate/impl/OldActivateExt1Impl2.java        |   27 +
 .../activate/impl/OldActivateExt1Impl3.java        |   27 +
 .../activate/impl/OrderActivateExtImpl1.java       |   29 +
 .../activate/impl/OrderActivateExtImpl2.java       |   29 +
 .../activate/impl/ValueActivateExtImpl.java        |   29 +
 .../common/extension/adaptive/HasAdaptiveExt.java  |   28 +
 .../adaptive/impl/HasAdaptiveExtImpl1.java         |   26 +
 .../impl/HasAdaptiveExt_ManualAdaptive.java        |   30 +
 .../common/extension/compatible/CompatibleExt.java |   27 +
 .../compatible/impl/CompatibleExtImpl1.java        |   36 +
 .../compatible/impl/CompatibleExtImpl2.java        |   35 +
 .../extension/convert/String2BooleanConverter.java |   28 +
 .../extension/convert/String2DoubleConverter.java  |   28 +
 .../extension/convert/String2IntegerConverter.java |   28 +
 .../dubbo/common/extension/ext1/SimpleExt.java     |   37 +
 .../common/extension/ext1/impl/SimpleExtImpl1.java |   34 +
 .../common/extension/ext1/impl/SimpleExtImpl2.java |   35 +
 .../common/extension/ext1/impl/SimpleExtImpl3.java |   35 +
 .../ext10_multi_names/Ext10MultiNames.java         |   23 +
 .../impl/Ext10MultiNamesImpl.java                  |   22 +
 .../apache/dubbo/common/extension/ext2/Ext2.java   |   33 +
 .../dubbo/common/extension/ext2/UrlHolder.java     |   61 +
 .../common/extension/ext2/impl/Ext2Impl1.java      |   31 +
 .../common/extension/ext2/impl/Ext2Impl2.java      |   32 +
 .../common/extension/ext2/impl/Ext2Impl3.java      |   32 +
 .../common/extension/ext3/UseProtocolKeyExt.java   |   32 +
 .../ext3/impl/UseProtocolKeyExtImpl1.java          |   30 +
 .../ext3/impl/UseProtocolKeyExtImpl2.java          |   30 +
 .../ext3/impl/UseProtocolKeyExtImpl3.java          |   30 +
 .../dubbo/common/extension/ext4/NoUrlParamExt.java |   29 +
 .../common/extension/ext4/impl/Ext4Impl1.java      |   27 +
 .../common/extension/ext4/impl/Ext4Impl2.java      |   28 +
 .../common/extension/ext5/NoAdaptiveMethodExt.java |   28 +
 .../common/extension/ext5/impl/Ext5Impl1.java      |   26 +
 .../common/extension/ext5/impl/Ext5Impl2.java      |   26 +
 .../dubbo/common/extension/ext6_inject/Dao.java    |   22 +
 .../dubbo/common/extension/ext6_inject/Ext6.java   |   30 +
 .../common/extension/ext6_inject/impl/DaoImpl.java |   26 +
 .../extension/ext6_inject/impl/Ext6Impl1.java      |   44 +
 .../extension/ext6_inject/impl/Ext6Impl2.java      |   39 +
 .../common/extension/ext6_wrap/WrappedExt.java     |   29 +
 .../common/extension/ext6_wrap/impl/Ext5Impl1.java |   26 +
 .../common/extension/ext6_wrap/impl/Ext5Impl2.java |   26 +
 .../extension/ext6_wrap/impl/Ext5Wrapper1.java     |   36 +
 .../extension/ext6_wrap/impl/Ext5Wrapper2.java     |   36 +
 .../dubbo/common/extension/ext7/InitErrorExt.java  |   31 +
 .../dubbo/common/extension/ext7/impl/Ext7Impl.java |   27 +
 .../extension/ext7/impl/Ext7InitErrorImpl.java     |   34 +
 .../dubbo/common/extension/ext8_add/AddExt1.java   |   30 +
 .../dubbo/common/extension/ext8_add/AddExt2.java   |   30 +
 .../dubbo/common/extension/ext8_add/AddExt3.java   |   30 +
 .../dubbo/common/extension/ext8_add/AddExt4.java   |   30 +
 .../extension/ext8_add/impl/AddExt1Impl1.java      |   26 +
 .../ext8_add/impl/AddExt1_ManualAdaptive.java      |   30 +
 .../ext8_add/impl/AddExt1_ManualAdd1.java          |   26 +
 .../ext8_add/impl/AddExt1_ManualAdd2.java          |   26 +
 .../extension/ext8_add/impl/AddExt2Impl1.java      |   26 +
 .../ext8_add/impl/AddExt2_ManualAdaptive.java      |   30 +
 .../ext8_add/impl/AddExt3_ManualAdaptive.java      |   30 +
 .../ext8_add/impl/AddExt4_ManualAdaptive.java      |   30 +
 .../common/extension/ext9_empty/Ext9Empty.java     |   24 +
 .../extension/ext9_empty/impl/Ext9EmptyImpl.java   |   26 +
 .../common/extension/injection/InjectExt.java      |   27 +
 .../extension/injection/impl/InjectExtImpl.java    |   60 +
 .../extension/support/ActivateComparatorTest.java  |   50 +
 .../dubbo/common/extension/support/Filter0.java    |   23 +
 .../dubbo/common/extension/support/Filter1.java    |   23 +
 .../dubbo/common/extension/support/Filter2.java    |   23 +
 .../dubbo/common/extension/support/Filter3.java    |   23 +
 .../dubbo/common/extension/support/Filter4.java    |   23 +
 .../dubbo/common/extension/support/OldFilter0.java |   20 +
 .../dubbo/common/extension/support/OldFilter5.java |   24 +
 .../dubbo/common/function/PredicatesTest.java      |   60 +
 .../apache/dubbo/common/function/StreamsTest.java  |   57 +
 .../dubbo/common/function/ThrowableActionTest.java |   37 +
 .../common/function/ThrowableConsumerTest.java     |   37 +
 .../common/function/ThrowableFunctionTest.java     |   37 +
 .../java/org/apache/dubbo/common/io/BytesTest.java |  164 +
 .../apache/dubbo/common/io/StreamUtilsTest.java    |  180 +
 .../common/io/UnsafeByteArrayInputStreamTest.java  |   94 +
 .../common/io/UnsafeByteArrayOutputStreamTest.java |   79 +
 .../dubbo/common/io/UnsafeStringReaderTest.java    |   75 +
 .../dubbo/common/io/UnsafeStringWriterTest.java    |  101 +
 .../apache/dubbo/common/json/JSONReaderTest.java   |   44 +
 .../org/apache/dubbo/common/json/JSONTest.java     |  227 +
 .../apache/dubbo/common/json/JSONWriterTest.java   |   50 +
 .../org/apache/dubbo/common/json/MyException.java  |   41 +
 .../common/lang/DefaultShutdownHookCallback.java   |   36 +
 .../apache/dubbo/common/lang/PrioritizedTest.java  |  125 +
 .../common/lang/ShutdownHookCallbacksTest.java     |   57 +
 .../dubbo/common/logger/LoggerAdapterTest.java     |   71 +
 .../dubbo/common/logger/LoggerFactoryTest.java     |   69 +
 .../org/apache/dubbo/common/logger/LoggerTest.java |   85 +
 .../dubbo/common/logger/slf4j/Slf4jLoggerTest.java |   62 +
 .../common/logger/support/FailsafeLoggerTest.java  |  106 +
 .../java/org/apache/dubbo/common/model/Person.java |   95 +
 .../dubbo/common/model/SerializablePerson.java     |   97 +
 .../java/org/apache/dubbo/common/model/User.java   |   77 +
 .../org/apache/dubbo/common/model/media/Image.java |  120 +
 .../org/apache/dubbo/common/model/media/Media.java |  205 +
 .../dubbo/common/model/person/BigPerson.java       |  151 +
 .../dubbo/common/model/person/FullAddress.java     |  202 +
 .../dubbo/common/model/person/PersonInfo.java      |  206 +
 .../dubbo/common/model/person/PersonStatus.java    |   22 +
 .../apache/dubbo/common/model/person/Phone.java    |  139 +
 .../org/apache/dubbo/common/status/StatusTest.java |   52 +
 .../status/support/LoadStatusCheckerTest.java      |   39 +
 .../status/support/MemoryStatusCheckerTest.java    |   42 +
 .../common/status/support/StatusUtilsTest.java     |   71 +
 .../common/store/support/SimpleDataStoreTest.java  |   60 +
 .../threadlocal/InternalThreadLocalTest.java       |  217 +
 .../NamedInternalThreadFactoryTest.java            |   36 +
 .../ThreadPoolExhaustedEventListenerTest.java      |   69 +
 .../event/ThreadPoolExhaustedEventTest.java        |   39 +
 .../support/AbortPolicyWithReportTest.java         |   47 +
 .../support/cached/CachedThreadPoolTest.java       |   84 +
 .../support/eager/EagerThreadPoolExecutorTest.java |  104 +
 .../support/eager/EagerThreadPoolTest.java         |   87 +
 .../threadpool/support/eager/TaskQueueTest.java    |   94 +
 .../support/fixed/FixedThreadPoolTest.java         |   84 +
 .../support/limited/LimitedThreadPoolTest.java     |   82 +
 .../dubbo/common/timer/HashedWheelTimerTest.java   |   72 +
 .../dubbo/common/utils/AnnotationUtilsTest.java    |  345 ++
 .../apache/dubbo/common/utils/ArrayUtilsTest.java  |   41 +
 .../org/apache/dubbo/common/utils/AssertTest.java  |   61 +
 .../common/utils/AtomicPositiveIntegerTest.java    |  206 +
 .../apache/dubbo/common/utils/CIDRUtilsTest.java   |   53 +
 .../apache/dubbo/common/utils/ClassUtilsTest.java  |  155 +
 .../dubbo/common/utils/CollectionUtilsTest.java    |  218 +
 .../common/utils/CompatibleTypeUtilsTest.java      |  222 +
 .../apache/dubbo/common/utils/ConfigUtilsTest.java |  270 +
 .../dubbo/common/utils/DefaultCharSequence.java    |   45 +
 .../apache/dubbo/common/utils/DefaultPageTest.java |   37 +
 .../dubbo/common/utils/DubboAppenderTest.java      |   83 +
 .../dubbo/common/utils/ExecutorUtilTest.java       |   84 +
 .../apache/dubbo/common/utils/FieldUtilsTest.java  |   88 +
 .../org/apache/dubbo/common/utils/HolderTest.java  |   33 +
 .../org/apache/dubbo/common/utils/IOUtilsTest.java |  130 +
 .../org/apache/dubbo/common/utils/JVMUtilTest.java |   21 +
 .../apache/dubbo/common/utils/LFUCacheTest.java    |   72 +
 .../apache/dubbo/common/utils/LRUCacheTest.java    |   61 +
 .../apache/dubbo/common/utils/LogHelperTest.java   |   93 +
 .../org/apache/dubbo/common/utils/LogTest.java     |   56 +
 .../org/apache/dubbo/common/utils/LogUtilTest.java |  113 +
 .../apache/dubbo/common/utils/MemberUtilsTest.java |   42 +
 .../apache/dubbo/common/utils/MethodUtilsTest.java |   73 +
 .../java/org/apache/dubbo/common/utils/MyEnum.java |   26 +
 .../dubbo/common/utils/NamedThreadFactoryTest.java |   48 +
 .../apache/dubbo/common/utils/NetUtilsTest.java    |  320 ++
 .../apache/dubbo/common/utils/ParametersTest.java  |   47 +
 .../apache/dubbo/common/utils/PojoUtilsTest.java   |  868 ++++
 .../dubbo/common/utils/ReflectUtilsTest.java       |  521 ++
 .../org/apache/dubbo/common/utils/StackTest.java   |  129 +
 .../apache/dubbo/common/utils/StringUtilsTest.java |  366 ++
 .../apache/dubbo/common/utils/UrlUtilsTest.java    |  379 ++
 .../apache/dubbo/common/version/VersionTest.java   |   81 +
 .../dubbo/config/context/ConfigManagerTest.java    |  226 +
 .../convert/StringToBooleanConverterTest.java      |   58 +
 .../convert/StringToCharArrayConverterTest.java    |   54 +
 .../convert/StringToCharacterConverterTest.java    |   58 +
 .../dubbo/convert/StringToDoubleConverterTest.java |   58 +
 .../dubbo/convert/StringToFloatConverterTest.java  |   58 +
 .../convert/StringToIntegerConverterTest.java      |   58 +
 .../dubbo/convert/StringToLongConverterTest.java   |   58 +
 .../convert/StringToOptionalConverterTest.java     |   55 +
 .../dubbo/convert/StringToShortConverterTest.java  |   58 +
 .../dubbo/convert/StringToStringConverterTest.java |   54 +
 .../multiple/StringToArrayConverterTest.java       |   70 +
 .../StringToBlockingDequeConverterTest.java        |  122 +
 .../StringToBlockingQueueConverterTest.java        |  125 +
 .../multiple/StringToCollectionConverterTest.java  |  119 +
 .../multiple/StringToDequeConverterTest.java       |  120 +
 .../multiple/StringToListConverterTest.java        |  119 +
 .../StringToNavigableSetConverterTest.java         |  119 +
 .../multiple/StringToQueueConverterTest.java       |  119 +
 .../convert/multiple/StringToSetConverterTest.java |  118 +
 .../multiple/StringToSortedSetConverterTest.java   |  119 +
 .../StringToTransferQueueConverterTest.java        |  122 +
 .../apache/dubbo/descriptor/DescriptorService.java |   23 +
 .../dubbo/descriptor/MethodDescritorTest.java      |   36 +
 .../apache/dubbo/event/AbstractEventListener.java  |   40 +
 .../dubbo/event/ConditionalEventListenerTest.java  |   77 +
 .../dubbo/event/DirectEventDispatcherTest.java     |  153 +
 .../java/org/apache/dubbo/event/EchoEvent.java     |   29 +
 .../org/apache/dubbo/event/EchoEventListener.java  |   32 +
 .../org/apache/dubbo/event/EchoEventListener2.java |   60 +
 .../apache/dubbo/event/EventDispatcherTest.java    |   45 +
 .../org/apache/dubbo/event/EventListenerTest.java  |   44 +
 .../dubbo/event/GenericEventListenerTest.java      |   77 +
 .../org/apache/dubbo/event/GenericEventTest.java   |   41 +
 .../dubbo/event/ParallelEventDispatcherTest.java   |   59 +
 .../java/org/apache/dubbo/rpc/model/Person.java    |   95 +
 .../apache/dubbo/rpc/model/SerializablePerson.java |   97 +
 .../test/java/org/apache/dubbo/rpc/model/User.java |   77 +
 .../org/apache/dubbo/rpc/model/media/Image.java    |  120 +
 .../org/apache/dubbo/rpc/model/media/Media.java    |  205 +
 .../apache/dubbo/rpc/model/person/BigPerson.java   |  151 +
 .../apache/dubbo/rpc/model/person/FullAddress.java |  202 +
 .../apache/dubbo/rpc/model/person/PersonInfo.java  |  206 +
 .../dubbo/rpc/model/person/PersonStatus.java       |   22 +
 .../org/apache/dubbo/rpc/model/person/Phone.java   |  139 +
 .../dubbo/rpc/support/ProtocolUtilsTest.java       |   75 +
 .../org.apache.dubbo.common.convert.Converter      |    2 +
 ...e.dubbo.common.config.OrderedPropertiesProvider |    2 +
 ...he.dubbo.common.extension.activate.ActivateExt1 |    6 +
 ....dubbo.common.extension.adaptive.HasAdaptiveExt |    2 +
 ...dubbo.common.extension.compatible.CompatibleExt |    2 +
 ...rg.apache.dubbo.common.extension.ext1.SimpleExt |    4 +
 ...mon.extension.ext10_multi_names.Ext10MultiNames |    1 +
 .../org.apache.dubbo.common.extension.ext2.Ext2    |    3 +
 ...e.dubbo.common.extension.ext3.UseProtocolKeyExt |    3 +
 ...pache.dubbo.common.extension.ext4.NoUrlParamExt |    2 +
 ...dubbo.common.extension.ext5.NoAdaptiveMethodExt |    2 +
 ....apache.dubbo.common.extension.ext6_inject.Ext6 |    2 +
 ...che.dubbo.common.extension.ext6_wrap.WrappedExt |    4 +
 ...apache.dubbo.common.extension.ext7.InitErrorExt |    2 +
 ....apache.dubbo.common.extension.ext8_add.AddExt1 |    1 +
 ...che.dubbo.common.extension.ext9_empty.Ext9Empty |    0
 ...ache.dubbo.common.extension.injection.InjectExt |    1 +
 ...g.apache.dubbo.common.extension.support.Filter0 |    5 +
 ...g.apache.dubbo.common.lang.ShutdownHookCallback |    1 +
 .../org.apache.dubbo.common.logger.LoggerAdapter   |    1 +
 .../org.apache.dubbo.common.status.StatusChecker   |    1 +
 .../internal/org.apache.dubbo.event.EventListener  |    1 +
 .../org.apache.dubbo.common.convert.Converter      |    3 +
 .../META-INF/services/java.lang.CharSequence       |    3 +
 ...g.apache.dubbo.common.extension.LoadingStrategy |    1 +
 ...he.dubbo.common.extension.activate.ActivateExt1 |    1 +
 .../src/test/resources/StreamUtilsTest.txt         |    1 +
 dubbo-common/src/test/resources/dubbo.properties   |   18 +
 dubbo-common/src/test/resources/json.flex          |   68 +
 dubbo-common/src/test/resources/log4j.xml          |   34 +
 dubbo-common/src/test/resources/md5.testfile.txt   |    1 +
 .../extension/adaptive/HasAdaptiveExt$Adaptive     |   28 +
 .../dubbo/common/serialize/dubbo/SimpleDO.fc       |    2 +
 .../src/test/resources/parameters.properties       |    1 +
 dubbo-common/src/test/resources/properties.load    |    3 +
 dubbo-compatible/README.md                         |   30 +
 dubbo-compatible/pom.xml                           |  107 +
 .../main/java/com/alibaba/dubbo/cache/Cache.java   |   22 +
 .../java/com/alibaba/dubbo/cache/CacheFactory.java |   27 +
 .../dubbo/cache/support/AbstractCacheFactory.java  |   53 +
 .../java/com/alibaba/dubbo/common/Constants.java   |   43 +
 .../main/java/com/alibaba/dubbo/common/URL.java    |  631 +++
 .../alibaba/dubbo/common/compiler/Compiler.java    |   22 +
 .../dubbo/common/extension/ExtensionFactory.java   |   22 +
 .../alibaba/dubbo/common/logger/LoggerAdapter.java |   22 +
 .../dubbo/common/serialize/ObjectInput.java        |   22 +
 .../dubbo/common/serialize/ObjectOutput.java       |   22 +
 .../dubbo/common/serialize/Serialization.java      |   42 +
 .../com/alibaba/dubbo/common/status/Status.java    |   34 +
 .../alibaba/dubbo/common/status/StatusChecker.java |   25 +
 .../com/alibaba/dubbo/common/store/DataStore.java  |   22 +
 .../dubbo/common/threadpool/ThreadPool.java        |   33 +
 .../com/alibaba/dubbo/common/utils/UrlUtils.java   |  110 +
 .../alibaba/dubbo/config/ApplicationConfig.java    |   30 +
 .../com/alibaba/dubbo/config/ArgumentConfig.java   |   22 +
 .../com/alibaba/dubbo/config/ConsumerConfig.java   |   22 +
 .../com/alibaba/dubbo/config/MethodConfig.java     |   23 +
 .../com/alibaba/dubbo/config/ModuleConfig.java     |   29 +
 .../com/alibaba/dubbo/config/MonitorConfig.java    |   28 +
 .../com/alibaba/dubbo/config/ProtocolConfig.java   |   33 +
 .../com/alibaba/dubbo/config/ProviderConfig.java   |   22 +
 .../com/alibaba/dubbo/config/ReferenceConfig.java  |   33 +
 .../com/alibaba/dubbo/config/RegistryConfig.java   |   33 +
 .../com/alibaba/dubbo/config/ServiceConfig.java    |   31 +
 .../spring/context/annotation/EnableDubbo.java     |   75 +
 .../com/alibaba/dubbo/container/Container.java     |   22 +
 .../java/com/alibaba/dubbo/monitor/Monitor.java    |   44 +
 .../com/alibaba/dubbo/monitor/MonitorFactory.java  |   32 +
 .../com/alibaba/dubbo/qos/command/BaseCommand.java |   31 +
 .../alibaba/dubbo/qos/command/CommandContext.java  |   36 +
 .../com/alibaba/dubbo/registry/NotifyListener.java |   61 +
 .../java/com/alibaba/dubbo/registry/Registry.java  |   69 +
 .../alibaba/dubbo/registry/RegistryFactory.java    |   32 +
 .../dubbo/registry/support/AbstractRegistry.java   |  147 +
 .../registry/support/AbstractRegistryFactory.java  |   35 +
 .../dubbo/registry/support/FailbackRegistry.java   |  193 +
 .../java/com/alibaba/dubbo/remoting/Channel.java   |   28 +
 .../com/alibaba/dubbo/remoting/ChannelHandler.java |   60 +
 .../java/com/alibaba/dubbo/remoting/Codec.java     |   22 +
 .../java/com/alibaba/dubbo/remoting/Codec2.java    |   22 +
 .../com/alibaba/dubbo/remoting/Dispatcher.java     |   33 +
 .../alibaba/dubbo/remoting/RemotingException.java  |   54 +
 .../java/com/alibaba/dubbo/remoting/Server.java    |   23 +
 .../com/alibaba/dubbo/remoting/Transporter.java    |   82 +
 .../alibaba/dubbo/remoting/exchange/Exchanger.java |   22 +
 .../dubbo/remoting/exchange/ResponseCallback.java  |   39 +
 .../dubbo/remoting/exchange/ResponseFuture.java    |   56 +
 .../alibaba/dubbo/remoting/http/HttpBinder.java    |   22 +
 .../com/alibaba/dubbo/remoting/p2p/Networker.java  |   22 +
 .../dubbo/remoting/telnet/TelnetHandler.java       |   32 +
 .../remoting/zookeeper/ZookeeperTransporter.java   |   22 +
 .../main/java/com/alibaba/dubbo/rpc/Exporter.java  |   44 +
 .../main/java/com/alibaba/dubbo/rpc/Filter.java    |   33 +
 .../java/com/alibaba/dubbo/rpc/Invocation.java     |  175 +
 .../main/java/com/alibaba/dubbo/rpc/Invoker.java   |   78 +
 .../com/alibaba/dubbo/rpc/InvokerListener.java     |   39 +
 .../main/java/com/alibaba/dubbo/rpc/Protocol.java  |   48 +
 .../java/com/alibaba/dubbo/rpc/ProxyFactory.java   |   47 +
 .../main/java/com/alibaba/dubbo/rpc/Result.java    |  176 +
 .../java/com/alibaba/dubbo/rpc/RpcContext.java     |  396 ++
 .../java/com/alibaba/dubbo/rpc/RpcException.java   |   54 +
 .../java/com/alibaba/dubbo/rpc/RpcInvocation.java  |  203 +
 .../com/alibaba/dubbo/rpc/cluster/Cluster.java     |   33 +
 .../dubbo/rpc/cluster/ConfiguratorFactory.java     |   21 +
 .../com/alibaba/dubbo/rpc/cluster/Directory.java   |   42 +
 .../com/alibaba/dubbo/rpc/cluster/LoadBalance.java |   44 +
 .../java/com/alibaba/dubbo/rpc/cluster/Merger.java |   22 +
 .../java/com/alibaba/dubbo/rpc/cluster/Router.java |   75 +
 .../alibaba/dubbo/rpc/cluster/RouterFactory.java   |   32 +
 .../alibaba/dubbo/rpc/cluster/RuleConverter.java   |   35 +
 .../cluster/loadbalance/AbstractLoadBalance.java   |   22 +
 .../dubbo/rpc/protocol/dubbo/FutureAdapter.java    |  147 +
 .../rpc/protocol/rest/support/ContentType.java     |   22 +
 .../rpc/protocol/thrift/ClassNameGenerator.java    |   22 +
 .../com/alibaba/dubbo/rpc/support/RpcUtils.java    |   78 +
 .../com/alibaba/dubbo/validation/Validation.java   |   22 +
 .../com/alibaba/dubbo/validation/Validator.java    |   22 +
 .../java/org/apache/dubbo/cache/CacheTest.java     |  106 +
 .../test/java/org/apache/dubbo/cache/MyCache.java  |   42 +
 .../org/apache/dubbo/cache/MyCacheFactory.java     |   30 +
 .../dubbo/common/extension/ExtensionTest.java      |   42 +
 .../dubbo/common/extension/MockDispatcher.java     |   29 +
 .../dubbo/common/extension/MyExtensionFactory.java |   27 +
 .../apache/dubbo/config/ApplicationConfigTest.java |  186 +
 .../apache/dubbo/config/ArgumentConfigTest.java    |   65 +
 .../java/org/apache/dubbo/config/ConfigTest.java   |   72 +
 .../apache/dubbo/config/ConsumerConfigTest.java    |   55 +
 .../org/apache/dubbo/config/MethodConfigTest.java  |  204 +
 .../org/apache/dubbo/config/ModuleConfigTest.java  |  106 +
 .../apache/dubbo/config/ProtocolConfigTest.java    |  156 +
 .../apache/dubbo/config/ProviderConfigTest.java    |  187 +
 .../apache/dubbo/config/ReferenceConfigTest.java   |   84 +
 .../apache/dubbo/config/RegistryConfigTest.java    |  175 +
 .../org/apache/dubbo/echo/EchoServiceTest.java     |   54 +
 .../java/org/apache/dubbo/filter/FilterTest.java   |   60 +
 .../org/apache/dubbo/filter/LegacyInvocation.java  |   98 +
 .../org/apache/dubbo/filter/LegacyInvoker.java     |   74 +
 .../java/org/apache/dubbo/filter/MyFilter.java     |   42 +
 .../apache/dubbo/generic/GenericServiceTest.java   |  251 +
 .../java/org/apache/dubbo/rpc/RpcContextTest.java  |   48 +
 .../apache/dubbo/rpc/cluster/CompatibleRouter.java |   46 +
 .../dubbo/rpc/cluster/CompatibleRouter2.java       |   45 +
 .../org/apache/dubbo/rpc/cluster/NewRouter.java    |   54 +
 .../org/apache/dubbo/rpc/cluster/RouterTest.java   |   53 +
 .../apache/dubbo/serialization/MyObjectInput.java  |   95 +
 .../apache/dubbo/serialization/MyObjectOutput.java |   95 +
 .../dubbo/serialization/MySerialization.java       |   50 +
 .../dubbo/serialization/SerializationTest.java     |   94 +
 .../org/apache/dubbo/service/ComplexObject.java    |  295 ++
 .../org/apache/dubbo/service/CustomArgument.java   |   50 +
 .../java/org/apache/dubbo/service/DemoService.java |   48 +
 .../org/apache/dubbo/service/DemoServiceImpl.java  |   97 +
 .../org/apache/dubbo/service/MockInvocation.java   |  155 +
 .../test/java/org/apache/dubbo/service/Person.java |   45 +
 .../test/java/org/apache/dubbo/service/Type.java   |   21 +
 ...alibaba.dubbo.common.extension.ExtensionFactory |    1 +
 .../services/org.apache.dubbo.remoting.Dispatcher  |   18 +
 dubbo-config/dubbo-config-api/pom.xml              |  205 +
 .../org/apache/dubbo/config/ConfigInitializer.java |   36 +
 .../apache/dubbo/config/ConfigPostProcessor.java   |   35 +
 .../org/apache/dubbo/config/DubboShutdownHook.java |  149 +
 .../org/apache/dubbo/config/ReferenceConfig.java   |  481 ++
 .../org/apache/dubbo/config/ServiceConfig.java     |  731 +++
 .../dubbo/config/bootstrap/DubboBootstrap.java     | 1217 +++++
 .../config/bootstrap/builders/AbstractBuilder.java |   82 +
 .../builders/AbstractInterfaceBuilder.java         |  345 ++
 .../bootstrap/builders/AbstractMethodBuilder.java  |  213 +
 .../builders/AbstractReferenceBuilder.java         |  161 +
 .../bootstrap/builders/AbstractServiceBuilder.java |  272 ++
 .../bootstrap/builders/ApplicationBuilder.java     |  207 +
 .../config/bootstrap/builders/ArgumentBuilder.java |   63 +
 .../bootstrap/builders/ConfigCenterBuilder.java    |  141 +
 .../config/bootstrap/builders/ConsumerBuilder.java |  118 +
 .../bootstrap/builders/MetadataReportBuilder.java  |  144 +
 .../config/bootstrap/builders/MethodBuilder.java   |  237 +
 .../config/bootstrap/builders/ModuleBuilder.java   |  132 +
 .../config/bootstrap/builders/MonitorBuilder.java  |  137 +
 .../config/bootstrap/builders/ProtocolBuilder.java |  427 ++
 .../config/bootstrap/builders/ProviderBuilder.java |  293 ++
 .../bootstrap/builders/ReferenceBuilder.java       |  143 +
 .../config/bootstrap/builders/RegistryBuilder.java |  373 ++
 .../config/bootstrap/builders/ServiceBuilder.java  |  161 +
 .../config/bootstrap/builders/package-info.java    |   21 +
 .../config/event/DubboServiceDestroyedEvent.java   |   32 +
 .../event/DubboShutdownHookRegisteredEvent.java    |   46 +
 .../event/DubboShutdownHookUnregisteredEvent.java  |   45 +
 .../event/ReferenceConfigDestroyedEvent.java       |   41 +
 .../event/ReferenceConfigInitializedEvent.java     |   48 +
 .../config/event/ServiceConfigExportedEvent.java   |   36 +
 .../config/event/ServiceConfigUnexportedEvent.java |   36 +
 .../event/listener/LoggingEventListener.java       |   51 +
 .../event/listener/ServiceNameMappingListener.java |   55 +
 .../invoker/DelegateProviderMetaDataInvoker.java   |   67 +
 .../ConfigurableMetadataServiceExporter.java       |  129 +
 .../metadata/ServiceInstancePortCustomizer.java    |   64 +
 .../dubbo/config/utils/ConfigValidationUtils.java  |  596 +++
 .../dubbo/config/utils/ReferenceConfigCache.java   |  252 +
 .../internal/org.apache.dubbo.event.EventListener  |    2 +
 ...dubbo.registry.client.ServiceInstanceCustomizer |    1 +
 .../apache/dubbo/config/AbstractConfigTest.java    |  927 ++++
 .../dubbo/config/AbstractInterfaceConfigTest.java  |  354 ++
 .../dubbo/config/AbstractMethodConfigTest.java     |  126 +
 .../dubbo/config/AbstractReferenceConfigTest.java  |  212 +
 .../dubbo/config/AbstractServiceConfigTest.java    |  184 +
 .../apache/dubbo/config/ApplicationConfigTest.java |  217 +
 .../apache/dubbo/config/ArgumentConfigTest.java    |   63 +
 .../dubbo/config/ConfigCenterConfigTest.java       |   44 +
 .../apache/dubbo/config/ConsumerConfigTest.java    |   81 +
 .../org/apache/dubbo/config/MethodConfigTest.java  |  240 +
 .../org/apache/dubbo/config/ModuleConfigTest.java  |  104 +
 .../org/apache/dubbo/config/MonitorConfigTest.java |  107 +
 .../apache/dubbo/config/ProtocolConfigTest.java    |  204 +
 .../apache/dubbo/config/ProviderConfigTest.java    |  219 +
 .../apache/dubbo/config/ReferenceConfigTest.java   |  158 +
 .../apache/dubbo/config/RegistryConfigTest.java    |  190 +
 .../org/apache/dubbo/config/ServiceConfigTest.java |  264 +
 .../test/java/org/apache/dubbo/config/api/Box.java |   23 +
 .../org/apache/dubbo/config/api/DemoException.java |   42 +
 .../org/apache/dubbo/config/api/DemoService.java   |   37 +
 .../java/org/apache/dubbo/config/api/Greeting.java |   24 +
 .../java/org/apache/dubbo/config/api/User.java     |   65 +
 .../dubbo/config/bootstrap/DubboBootstrapTest.java |  154 +
 .../bootstrap/DubboServiceConsumerBootstrap.java   |   58 +
 .../bootstrap/DubboServiceProviderBootstrap.java   |   95 +
 .../DubboServiceProviderMinimumBootstrap.java      |   38 +
 .../apache/dubbo/config/bootstrap/EchoService.java |   31 +
 .../dubbo/config/bootstrap/EchoServiceImpl.java    |   36 +
 .../EtcdDubboServiceConsumerBootstrap.java         |   51 +
 .../EtcdDubboServiceProviderBootstrap.java         |   94 +
 .../NacosDubboServiceConsumerBootstrap.java        |   51 +
 .../NacosDubboServiceProviderBootstrap.java        |   49 +
 .../ZookeeperDubboServiceConsumerBootstrap.java    |   48 +
 .../ZookeeperDubboServiceProviderBootstrap.java    |   38 +
 .../bootstrap/builders/AbstractBuilderTest.java    |  126 +
 .../builders/AbstractInterfaceBuilderTest.java     |  311 ++
 .../builders/AbstractMethodBuilderTest.java        |  196 +
 .../builders/AbstractReferenceBuilderTest.java     |  151 +
 .../builders/AbstractServiceBuilderTest.java       |  245 +
 .../bootstrap/builders/ApplicationBuilderTest.java |  255 +
 .../bootstrap/builders/ArgumentBuilderTest.java    |   63 +
 .../builders/ConfigCenterBuilderTest.java          |  169 +
 .../bootstrap/builders/ConsumerBuilderTest.java    |   95 +
 .../builders/MetadataReportBuilderTest.java        |  151 +
 .../bootstrap/builders/MethodBuilderTest.java      |  189 +
 .../bootstrap/builders/ModuleBuilderTest.java      |  112 +
 .../bootstrap/builders/MonitorBuilderTest.java     |  135 +
 .../bootstrap/builders/ProtocolBuilderTest.java    |  338 ++
 .../bootstrap/builders/ProviderBuilderTest.java    |  227 +
 .../bootstrap/builders/ReferenceBuilderTest.java   |  114 +
 .../bootstrap/builders/RegistryBuilderTest.java    |  256 +
 .../bootstrap/builders/ServiceBuilderTest.java     |  131 +
 .../DubboInterfaceConsumerBootstrap.java           |   57 +
 .../apache/dubbo/config/bootstrap/rest/User.java   |   77 +
 .../dubbo/config/bootstrap/rest/UserService.java   |   45 +
 .../config/bootstrap/rest/UserServiceImpl.java     |   32 +
 .../apache/dubbo/config/cache/CacheService.java    |   26 +
 .../dubbo/config/cache/CacheServiceImpl.java       |   32 +
 .../org/apache/dubbo/config/cache/CacheTest.java   |  140 +
 .../config/consumer/DemoActionByAnnotation.java    |   35 +
 .../dubbo/config/consumer/DemoActionBySetter.java  |   36 +
 .../dubbo/config/consumer/DemoInterceptor.java     |   31 +
 .../DelegateProviderMetaDataInvokerTest.java       |   60 +
 .../apache/dubbo/config/mock/GreetingLocal1.java   |   21 +
 .../apache/dubbo/config/mock/GreetingLocal2.java   |   26 +
 .../apache/dubbo/config/mock/GreetingLocal3.java   |   32 +
 .../apache/dubbo/config/mock/GreetingMock1.java    |   20 +
 .../apache/dubbo/config/mock/GreetingMock2.java    |   29 +
 .../org/apache/dubbo/config/mock/MockCluster.java  |   29 +
 .../org/apache/dubbo/config/mock/MockCodec.java    |   37 +
 .../apache/dubbo/config/mock/MockDispatcher.java   |   29 +
 .../apache/dubbo/config/mock/MockExchanger.java    |   37 +
 .../dubbo/config/mock/MockExporterListener.java    |   34 +
 .../org/apache/dubbo/config/mock/MockFilter.java   |   30 +
 .../dubbo/config/mock/MockInvokerListener.java     |   33 +
 .../apache/dubbo/config/mock/MockLoadBalance.java  |   32 +
 .../org/apache/dubbo/config/mock/MockProtocol.java |   89 +
 .../apache/dubbo/config/mock/MockProtocol2.java    |   48 +
 .../apache/dubbo/config/mock/MockProxyFactory.java |   39 +
 .../org/apache/dubbo/config/mock/MockRegistry.java |  110 +
 .../dubbo/config/mock/MockRegistryFactory.java     |   37 +
 .../dubbo/config/mock/MockRegistryFactory2.java    |   31 +
 .../dubbo/config/mock/MockStatusChecker.java       |   28 +
 .../dubbo/config/mock/MockTelnetHandler.java       |   29 +
 .../apache/dubbo/config/mock/MockThreadPool.java   |   30 +
 .../apache/dubbo/config/mock/MockTransporter.java  |   42 +
 .../apache/dubbo/config/mock/TestProxyFactory.java |   33 +
 .../config/provider/impl/DemoServiceImpl.java      |   51 +
 .../config/url/ExporterSideConfigUrlTest.java      |  101 +
 .../dubbo/config/url/InvokerSideConfigUrlTest.java |  217 +
 .../dubbo/config/url/RpcConfigGetSetProxy.java     |  166 +
 .../org/apache/dubbo/config/url/UrlTestBase.java   |  202 +
 .../dubbo/config/utils/MockReferenceConfig.java    |   59 +
 .../config/utils/ReferenceConfigCacheTest.java     |  151 +
 .../dubbo/config/utils/XxxMockReferenceConfig.java |   59 +
 .../dubbo/config/utils/service/FooService.java     |   23 +
 .../dubbo/config/utils/service/FooServiceImpl.java |   23 +
 .../dubbo/config/utils/service/XxxService.java     |   23 +
 .../dubbo/config/utils/service/XxxServiceImpl.java |   23 +
 .../org.apache.dubbo.common.status.StatusChecker   |   18 +
 .../org.apache.dubbo.common.threadpool.ThreadPool  |   18 +
 .../org.apache.dubbo.registry.RegistryFactory      |    2 +
 .../services/org.apache.dubbo.remoting.Codec       |   18 +
 .../services/org.apache.dubbo.remoting.Dispatcher  |   18 +
 .../services/org.apache.dubbo.remoting.Transporter |   18 +
 .../org.apache.dubbo.remoting.exchange.Exchanger   |   18 +
 .../org.apache.dubbo.remoting.telnet.TelnetHandler |   18 +
 .../services/org.apache.dubbo.rpc.ExporterListener |   18 +
 .../META-INF/services/org.apache.dubbo.rpc.Filter  |    1 +
 .../services/org.apache.dubbo.rpc.InvokerListener  |    1 +
 .../services/org.apache.dubbo.rpc.Protocol         |    2 +
 .../services/org.apache.dubbo.rpc.ProxyFactory     |    2 +
 .../services/org.apache.dubbo.rpc.cluster.Cluster  |    1 +
 .../org.apache.dubbo.rpc.cluster.LoadBalance       |    1 +
 .../src/test/resources/dubbo.properties            |    2 +
 .../dubbo-config-api/src/test/resources/log4j.xml  |   28 +
 dubbo-config/dubbo-config-spring/pom.xml           |  165 +
 .../dubbo/config/spring/ConfigCenterBean.java      |  107 +
 .../apache/dubbo/config/spring/ReferenceBean.java  |  121 +
 .../apache/dubbo/config/spring/ServiceBean.java    |  145 +
 .../AbstractAnnotationConfigBeanBuilder.java       |  215 +
 .../AnnotatedInterfaceConfigBeanBuilder.java       |  215 +
 .../AnnotationPropertyValuesAdapter.java           |   84 +
 .../annotation/DubboConfigAliasPostProcessor.java  |   74 +
 .../ReferenceAnnotationBeanPostProcessor.java      |  409 ++
 .../factory/annotation/ReferenceBeanBuilder.java   |  178 +
 .../ServiceAnnotationBeanPostProcessor.java        |   50 +
 .../factory/annotation/ServiceBeanNameBuilder.java |  121 +
 .../annotation/ServiceClassPostProcessor.java      |  539 ++
 .../ConfigurableSourceBeanMetadataElement.java     |   39 +
 ...onfigDefaultPropertyValueBeanPostProcessor.java |  106 +
 .../context/DubboBootstrapApplicationListener.java |   70 +
 ...DubboLifecycleComponentApplicationListener.java |   90 +
 ...meExecutionApplicationContextEventListener.java |   71 +
 .../DubboClassPathBeanDefinitionScanner.java       |   70 +
 .../context/annotation/DubboComponentScan.java     |   74 +
 .../annotation/DubboComponentScanRegistrar.java    |   99 +
 .../annotation/DubboConfigConfiguration.java       |   93 +
 .../DubboConfigConfigurationRegistrar.java         |   58 +
 .../DubboLifecycleComponentRegistrar.java          |   44 +
 .../spring/context/annotation/EnableDubbo.java     |   81 +
 .../context/annotation/EnableDubboConfig.java      |   80 +
 .../context/annotation/EnableDubboLifecycle.java   |   42 +
 .../context/config/DubboConfigBeanCustomizer.java  |   53 +
 ...pertyDefaultValueDubboConfigBeanCustomizer.java |   86 +
 .../context/event/ServiceBeanExportedEvent.java    |   51 +
 .../properties/AbstractDubboConfigBinder.java      |   69 +
 .../properties/DefaultDubboConfigBinder.java       |   48 +
 .../context/properties/DubboConfigBinder.java      |   59 +
 .../spring/extension/SpringExtensionFactory.java   |   79 +
 .../schema/AnnotationBeanDefinitionParser.java     |   75 +
 .../spring/schema/DubboBeanDefinitionParser.java   |  419 ++
 .../spring/schema/DubboNamespaceHandler.java       |  118 +
 .../spring/status/DataSourceStatusChecker.java     |   89 +
 .../config/spring/status/SpringStatusChecker.java  |  101 +
 .../config/spring/util/DubboAnnotationUtils.java   |  150 +
 .../dubbo/config/spring/util/DubboBeanUtils.java   |   68 +
 .../src/main/resources/META-INF/compat/dubbo.xsd   | 1619 ++++++
 .../src/main/resources/META-INF/dubbo.xsd          | 1644 +++++++
 ....apache.dubbo.common.extension.ExtensionFactory |    1 +
 .../org.apache.dubbo.common.status.StatusChecker   |    2 +
 .../src/main/resources/META-INF/spring.handlers    |    2 +
 .../src/main/resources/META-INF/spring.schemas     |    2 +
 .../config/spring/AbstractRegistryService.java     |  237 +
 .../org/apache/dubbo/config/spring/ConfigTest.java | 1057 ++++
 .../dubbo/config/spring/GenericDemoService.java    |   27 +
 .../dubbo/config/spring/ServiceBeanTest.java       |   41 +
 .../config/spring/SimpleRegistryExporter.java      |   70 +
 .../dubbo/config/spring/SimpleRegistryService.java |  142 +
 .../spring/action/DemoActionByAnnotation.java      |   35 +
 .../config/spring/action/DemoActionBySetter.java   |   36 +
 .../config/spring/action/DemoInterceptor.java      |   31 +
 .../annotation/consumer/AnnotationAction.java      |   38 +
 .../spring/annotation/merged/MergedReference.java  |   41 +
 .../spring/annotation/merged/MergedService.java    |   41 +
 .../annotation/provider/AnnotationServiceImpl.java |   37 +
 .../org/apache/dubbo/config/spring/api/Box.java    |   23 +
 .../dubbo/config/spring/api/DemoService.java       |   28 +
 .../dubbo/config/spring/api/DemoServiceSon.java    |   24 +
 .../dubbo/config/spring/api/HelloService.java      |   22 +
 .../AnnotationPropertyValuesAdapterTest.java       |  155 +
 .../factory/annotation/MergedAnnotationTest.java   |   76 +
 .../ReferenceAnnotationBeanPostProcessorTest.java  |  308 ++
 .../annotation/ReferenceBeanBuilderTest.java       |  126 +
 .../ServiceAnnotationBeanPostProcessorTest.java    |   95 +
 .../ServiceAnnotationTestConfiguration.java        |  116 +
 .../ServiceAnnotationTestConfiguration2.java       |  115 +
 .../annotation/ServiceBeanNameBuilderTest.java     |   78 +
 .../annotation/ServiceClassPostProcessorTest.java  |   95 +
 .../factory/config/YamlPropertySourceFactory.java  |   70 +
 .../config/YamlPropertySourceFactoryTest.java      |   71 +
 .../DubboComponentScanRegistrarTest.java           |  128 +
 .../annotation/DubboConfigConfigurationTest.java   |   98 +
 .../context/annotation/EnableDubboConfigTest.java  |  131 +
 .../spring/context/annotation/EnableDubboTest.java |  178 +
 .../annotation/consumer/ConsumerConfiguration.java |  140 +
 .../consumer/test/TestConsumerConfiguration.java   |  107 +
 .../annotation/provider/DefaultHelloService.java   |   39 +
 .../annotation/provider/DemoServiceImpl.java       |   52 +
 .../annotation/provider/HelloServiceImpl.java      |   35 +
 .../annotation/provider/ProviderConfiguration.java |  107 +
 .../properties/DefaultDubboConfigBinderTest.java   |   57 +
 .../config/spring/extension/BeanForContext2.java   |   31 +
 .../extension/SpringExtensionFactoryTest.java      |   88 +
 .../apache/dubbo/config/spring/filter/MockDao.java |   24 +
 .../dubbo/config/spring/filter/MockDaoImpl.java    |   24 +
 .../dubbo/config/spring/filter/MockFilter.java     |   66 +
 .../dubbo/config/spring/impl/DemoServiceImpl.java  |   45 +
 .../spring/impl/DemoServiceImpl_LongWaiting.java   |   39 +
 .../config/spring/impl/DemoServiceSonImpl.java     |   42 +
 .../dubbo/config/spring/impl/HelloServiceImpl.java |   26 +
 .../config/spring/impl/UnserializableBox.java      |   47 +
 .../impl/UnserializableBoxDemoServiceImpl.java     |   35 +
 .../dubbo/config/spring/registry/MockRegistry.java |   87 +
 .../spring/registry/MockRegistryFactory.java       |   45 +
 .../consumer/DemoServiceConsumerBootstrap.java     |   55 +
 .../consumer/DemoServiceConsumerXmlBootstrap.java  |   46 +
 .../provider/DemoServiceProviderBootstrap.java     |   40 +
 .../provider/DemoServiceProviderXmlBootstrap.java  |   35 +
 .../nacos/demo/service/DefaultService.java         |   46 +
 .../registry/nacos/demo/service/DemoService.java   |   28 +
 .../registry/nacos/nacos/NacosServiceNameTest.java |  125 +
 .../spring/schema/DubboNamespaceHandlerTest.java   |  209 +
 .../config/spring/schema/GenericServiceTest.java   |   50 +
 .../config/spring/schema/MyGenericService.java     |   30 +
 .../spring/status/DataSourceStatusCheckerTest.java |  110 +
 .../spring/status/SpringStatusCheckerTest.java     |  104 +
 .../src/test/resources/META-INF/config.properties  |   35 +
 .../src/test/resources/META-INF/default.properties |    4 +
 .../resources/META-INF/demo-provider.properties    |   12 +
 .../resources/META-INF/dubbb-consumer.properties   |   12 +
 .../resources/META-INF/dubbb-provider.properties   |   24 +
 .../resources/META-INF/dubbo-consumer.properties   |   13 +
 .../resources/META-INF/dubbo-provider.properties   |   24 +
 .../src/test/resources/META-INF/dubbo.yml          |    8 +
 .../org.apache.dubbo.registry.RegistryFactory      |    1 +
 .../dubbo/internal/org.apache.dubbo.rpc.Filter     |    1 +
 .../META-INF/spring/dubbo-annotation-consumer.xml  |   33 +
 .../META-INF/spring/dubbo-annotation-provider.xml  |   40 +
 .../resources/META-INF/spring/dubbo-consumer.xml   |   30 +
 .../META-INF/spring/dubbo-generic-consumer.xml     |   36 +
 .../spring/dubbo-nacos-consumer-context.xml        |   27 +
 .../spring/dubbo-nacos-provider-context.xml        |   19 +
 .../resources/META-INF/spring/dubbo-provider.xml   |   48 +
 .../src/test/resources/applicationContext.xml      |   22 +
 .../src/test/resources/dubbo-binder.properties     |    6 +
 .../src/test/resources/log4j.xml                   |   35 +
 .../resources/nacos-consumer-config.properties     |    6 +
 .../resources/nacos-provider-config.properties     |   11 +
 .../dubbo/config/spring/annotation-consumer.xml    |   28 +
 .../dubbo/config/spring/annotation-provider.xml    |   28 +
 .../config/spring/annotation-version-consumer.xml  |   28 +
 .../config/spring/annotation-version-provider.xml  |   28 +
 .../dubbo/config/spring/aop-autowire-byname.xml    |   64 +
 .../dubbo/config/spring/aop-autowire-bytype.xml    |   63 +
 .../dubbo/config/spring/consumer-notification.xml  |   32 +
 .../dubbo/config/spring/customize-parameter.xml    |   36 +
 .../dubbo/config/spring/delay-fixed-time.xml       |   34 +
 .../dubbo/config/spring/delay-on-initialized.xml   |   38 +
 .../spring/demo-provider-UnserializableBox.xml     |   38 +
 .../config/spring/demo-provider-long-waiting.xml   |   39 +
 .../spring/demo-provider-no-methods-interface.xml  |   35 +
 .../config/spring/demo-provider-properties.xml     |   25 +
 .../apache/dubbo/config/spring/demo-provider.xml   |   37 +
 .../apache/dubbo/config/spring/generic-export.xml  |   39 +
 .../dubbo/config/spring/init-reference-getUrls.xml |   33 +
 .../config/spring/init-reference-retry-false.xml   |   34 +
 .../apache/dubbo/config/spring/init-reference.xml  |   31 +
 .../apache/dubbo/config/spring/multi-monitor.xml   |   39 +
 .../dubbo/config/spring/multi-protocol-default.xml |   40 +
 .../dubbo/config/spring/multi-protocol-error.xml   |   40 +
 .../config/spring/multi-protocol-register.xml      |   40 +
 .../apache/dubbo/config/spring/multi-protocol.xml  |   40 +
 .../apache/dubbo/config/spring/multi-registry.xml  |   42 +
 .../config/spring/override-multi-protocol.xml      |   42 +
 .../dubbo/config/spring/override-protocol.xml      |   38 +
 .../apache/dubbo/config/spring/provider-multi.xml  |   44 +
 .../config/spring/provider-nested-service.xml      |   42 +
 .../dubbo/config/spring/provider-with-module.xml   |   43 +
 .../dubbo/config/spring/provider-with-monitor.xml  |   37 +
 .../apache/dubbo/config/spring/service-class.xml   |   36 +
 .../config/spring/spring-extension-inject.xml      |   38 +
 .../spring/system-properties-override-default.xml  |   30 +
 .../config/spring/system-properties-override.xml   |   39 +
 .../config/spring/xml-override-properties.xml      |   39 +
 .../test/resources/webapps/test/WEB-INF/web.xml    |   30 +
 .../test/resources/webapps/test2/WEB-INF/web.xml   |   26 +
 .../test/resources/webapps/test3/WEB-INF/web.xml   |   26 +
 dubbo-config/pom.xml                               |   36 +
 .../dubbo-configcenter-apollo/pom.xml              |   51 +
 .../support/apollo/ApolloDynamicConfiguration.java |  258 +
 .../apollo/ApolloDynamicConfigurationFactory.java  |   31 +
 ...config.configcenter.DynamicConfigurationFactory |    1 +
 .../apollo/ApolloDynamicConfigurationTest.java     |  191 +
 .../src/test/resources/META-INF/app.properties     |    1 +
 .../src/test/resources/mockdata-dubbo.properties   |    2 +
 .../dubbo-configcenter-consul/pom.xml              |   47 +
 .../consul/ConsulDynamicConfiguration.java         |  218 +
 .../consul/ConsulDynamicConfigurationFactory.java  |   32 +
 ...config.configcenter.DynamicConfigurationFactory |    1 +
 .../consul/ConsulDynamicConfigurationTest.java     |  109 +
 dubbo-configcenter/dubbo-configcenter-etcd/pom.xml |   74 +
 .../support/etcd/EtcdDynamicConfiguration.java     |  197 +
 .../etcd/EtcdDynamicConfigurationFactory.java      |   33 +
 ...config.configcenter.DynamicConfigurationFactory |    1 +
 .../support/etcd/EtcdDynamicConfigurationTest.java |  154 +
 .../dubbo-configcenter-nacos/pom.xml               |   46 +
 .../support/nacos/NacosDynamicConfiguration.java   |  381 ++
 .../nacos/NacosDynamicConfigurationFactory.java    |   41 +
 ...config.configcenter.DynamicConfigurationFactory |    1 +
 .../nacos/NacosDynamicConfigurationTest.java       |  188 +
 .../dubbo-configcenter-zookeeper/pom.xml           |   47 +
 .../support/zookeeper/CacheListener.java           |  134 +
 .../zookeeper/ZookeeperDynamicConfiguration.java   |  138 +
 .../ZookeeperDynamicConfigurationFactory.java      |   39 +
 ...config.configcenter.DynamicConfigurationFactory |    1 +
 .../ZookeeperDynamicConfigurationTest.java         |  185 +
 dubbo-configcenter/pom.xml                         |   40 +
 dubbo-container/dubbo-container-api/pom.xml        |   55 +
 .../java/org/apache/dubbo/container/Container.java |   37 +
 .../main/java/org/apache/dubbo/container/Main.java |  108 +
 .../main/resources/META-INF/assembly/bin/dump.sh   |  108 +
 .../resources/META-INF/assembly/bin/restart.sh     |   20 +
 .../main/resources/META-INF/assembly/bin/server.sh |   40 +
 .../main/resources/META-INF/assembly/bin/start.bat |   44 +
 .../main/resources/META-INF/assembly/bin/start.sh  |  132 +
 .../main/resources/META-INF/assembly/bin/stop.sh   |   60 +
 dubbo-container/dubbo-container-log4j/pom.xml      |   39 +
 .../dubbo/container/log4j/Log4jContainer.java      |  103 +
 .../internal/org.apache.dubbo.container.Container  |    1 +
 .../dubbo/container/log4j/Log4jContainerTest.java  |   36 +
 dubbo-container/dubbo-container-logback/pom.xml    |   43 +
 .../dubbo/container/logback/LogbackContainer.java  |  108 +
 .../internal/org.apache.dubbo.container.Container  |    1 +
 .../container/logback/LogbackContainerTest.java    |   47 +
 dubbo-container/dubbo-container-spring/pom.xml     |   43 +
 .../dubbo/container/spring/SpringContainer.java    |   67 +
 .../internal/org.apache.dubbo.container.Container  |    1 +
 .../container/spring/SpringContainerTest.java      |   38 +
 .../src/test/resources/META-INF/spring/test.xml    |   24 +
 .../src/test/resources/log4j.xml                   |   29 +
 dubbo-container/pom.xml                            |   38 +
 dubbo-demo/README.md                               |   29 +
 .../dubbo-demo-annotation-consumer/pom.xml         |   88 +
 .../apache/dubbo/demo/consumer/Application.java    |   48 +
 .../demo/consumer/comp/DemoServiceComponent.java   |   40 +
 .../src/main/resources/log4j.properties            |    7 +
 .../resources/spring/dubbo-consumer.properties     |   21 +
 .../dubbo-demo-annotation-provider/pom.xml         |  102 +
 .../apache/dubbo/demo/provider/Application.java    |   45 +
 .../dubbo/demo/provider/DemoServiceImpl.java       |   43 +
 .../src/main/resources/log4j.properties            |    7 +
 .../resources/spring/dubbo-provider.properties     |   22 +
 dubbo-demo/dubbo-demo-annotation/pom.xml           |   57 +
 .../dubbo-demo-api/dubbo-demo-api-consumer/pom.xml |   72 +
 .../apache/dubbo/demo/consumer/Application.java    |   71 +
 .../src/main/resources/log4j.properties            |    7 +
 .../dubbo-demo-api/dubbo-demo-api-provider/pom.xml |   83 +
 .../apache/dubbo/demo/provider/Application.java    |   64 +
 .../dubbo/demo/provider/DemoServiceImpl.java       |   41 +
 .../apache/dubbo/demo/provider/ExportListner.java  |   21 +
 .../dubbo/org.apache.dubbo.rpc.ExporterListener    |    1 +
 .../src/main/resources/log4j.properties            |    7 +
 dubbo-demo/dubbo-demo-api/pom.xml                  |   61 +
 dubbo-demo/dubbo-demo-interface/pom.xml            |   32 +
 .../java/org/apache/dubbo/demo/DemoService.java    |   29 +
 .../org/apache/dubbo/demo/GreetingService.java     |   24 +
 .../dubbo-demo-xml/dubbo-demo-xml-consumer/pom.xml |   87 +
 .../apache/dubbo/demo/consumer/Application.java    |   37 +
 .../src/main/resources/dubbo.properties            |    1 +
 .../src/main/resources/log4j.properties            |    7 +
 .../src/main/resources/spring/dubbo-consumer.xml   |   30 +
 .../dubbo-demo-xml/dubbo-demo-xml-provider/pom.xml |  107 +
 .../apache/dubbo/demo/provider/Application.java    |   27 +
 .../dubbo/demo/provider/DemoServiceImpl.java       |   53 +
 .../src/main/resources/dubbo.properties            |    1 +
 .../src/main/resources/log4j.properties            |    7 +
 .../src/main/resources/spring/dubbo-provider.xml   |   35 +
 dubbo-demo/dubbo-demo-xml/pom.xml                  |   68 +
 dubbo-demo/pom.xml                                 |   52 +
 dubbo-dependencies-bom/pom.xml                     |  761 +++
 .../dubbo-dependencies-zookeeper/pom.xml           |  113 +
 dubbo-dependencies/pom.xml                         |   34 +
 dubbo-distribution/pom.xml                         |   99 +
 dubbo-distribution/src/assembly/bin-release.xml    |   53 +
 dubbo-distribution/src/assembly/source-release.xml |   57 +
 dubbo-filter/dubbo-filter-cache/pom.xml            |   49 +
 .../main/java/org/apache/dubbo/cache/Cache.java    |   43 +
 .../java/org/apache/dubbo/cache/CacheFactory.java  |   43 +
 .../org/apache/dubbo/cache/filter/CacheFilter.java |  133 +
 .../dubbo/cache/support/AbstractCacheFactory.java  |   72 +
 .../cache/support/expiring/ExpiringCache.java      |   77 +
 .../support/expiring/ExpiringCacheFactory.java     |   44 +
 .../dubbo/cache/support/expiring/ExpiringMap.java  |  374 ++
 .../apache/dubbo/cache/support/jcache/JCache.java  |   87 +
 .../dubbo/cache/support/jcache/JCacheFactory.java  |   48 +
 .../apache/dubbo/cache/support/lfu/LfuCache.java   |   80 +
 .../dubbo/cache/support/lfu/LfuCacheFactory.java   |   43 +
 .../apache/dubbo/cache/support/lru/LruCache.java   |   80 +
 .../dubbo/cache/support/lru/LruCacheFactory.java   |   43 +
 .../support/threadlocal/ThreadLocalCache.java      |   77 +
 .../threadlocal/ThreadLocalCacheFactory.java       |   43 +
 .../internal/org.apache.dubbo.cache.CacheFactory   |    4 +
 .../dubbo/internal/org.apache.dubbo.rpc.Filter     |    1 +
 .../apache/dubbo/cache/filter/CacheFilterTest.java |  137 +
 .../cache/support/AbstractCacheFactoryTest.java    |   33 +
 .../support/expiring/ExpiringCacheFactoryTest.java |   38 +
 .../cache/support/jcache/JCacheFactoryTest.java    |   55 +
 .../cache/support/lru/LruCacheFactoryTest.java     |   38 +
 .../threadlocal/ThreadLocalCacheFactoryTest.java   |   38 +
 dubbo-filter/dubbo-filter-validation/pom.xml       |   73 +
 .../apache/dubbo/validation/MethodValidated.java   |   40 +
 .../org/apache/dubbo/validation/Validation.java    |   39 +
 .../org/apache/dubbo/validation/Validator.java     |   27 +
 .../dubbo/validation/filter/ValidationFilter.java  |  104 +
 .../validation/support/AbstractValidation.java     |   51 +
 .../support/jvalidation/JValidation.java           |   40 +
 .../validation/support/jvalidation/JValidator.java |  330 ++
 .../dubbo/internal/org.apache.dubbo.rpc.Filter     |    1 +
 .../org.apache.dubbo.validation.Validation         |    1 +
 .../validation/filter/ValidationFilterTest.java    |  137 +
 .../support/jvalidation/JValidationTest.java       |   50 +
 .../support/jvalidation/JValidatorTest.java        |   86 +
 .../jvalidation/mock/JValidatorTestTarget.java     |   41 +
 .../jvalidation/mock/ValidationParameter.java      |   31 +
 dubbo-filter/pom.xml                               |   36 +
 dubbo-metadata/dubbo-metadata-api/pom.xml          |   83 +
 .../DynamicConfigurationServiceNameMapping.java    |   99 +
 .../apache/dubbo/metadata/MetadataConstants.java   |   26 +
 .../org/apache/dubbo/metadata/MetadataService.java |  223 +
 .../dubbo/metadata/MetadataServiceExporter.java    |   61 +
 .../org/apache/dubbo/metadata/MetadataUtil.java    |   49 +
 .../apache/dubbo/metadata/ServiceNameMapping.java  |   64 +
 .../dubbo/metadata/WritableMetadataService.java    |  102 +
 .../definition/MethodDefinitionBuilder.java        |   78 +
 .../definition/ServiceDefinitionBuilder.java       |  107 +
 .../metadata/definition/TypeDefinitionBuilder.java |   90 +
 .../definition/builder/ArrayTypeBuilder.java       |   48 +
 .../definition/builder/CollectionTypeBuilder.java  |   70 +
 .../definition/builder/DefaultTypeBuilder.java     |   70 +
 .../definition/builder/EnumTypeBuilder.java        |   58 +
 .../definition/builder/MapTypeBuilder.java         |   87 +
 .../metadata/definition/builder/TypeBuilder.java   |   41 +
 .../definition/model/FullServiceDefinition.java    |   43 +
 .../definition/model/MethodDefinition.java         |   97 +
 .../definition/model/ServiceDefinition.java        |  101 +
 .../metadata/definition/model/TypeDefinition.java  |  141 +
 .../dubbo/metadata/definition/util/ClassUtils.java |  111 +
 .../definition/util/JaketConfigurationUtils.java   |  102 +
 .../dubbo/metadata/report/MetadataReport.java      |   50 +
 .../metadata/report/MetadataReportFactory.java     |   30 +
 .../metadata/report/MetadataReportInstance.java    |   69 +
 .../BaseApplicationMetadataIdentifier.java         |   66 +
 .../report/identifier/BaseMetadataIdentifier.java  |   25 +
 .../identifier/BaseServiceMetadataIdentifier.java  |   88 +
 .../metadata/report/identifier/KeyTypeEnum.java    |   24 +
 .../report/identifier/MetadataIdentifier.java      |  105 +
 .../identifier/ServiceMetadataIdentifier.java      |   85 +
 .../identifier/SubscriberMetadataIdentifier.java   |   70 +
 .../report/support/AbstractMetadataReport.java     |  468 ++
 .../support/AbstractMetadataReportFactory.java     |   62 +
 .../dubbo/metadata/report/support/Constants.java   |   36 +
 .../AbstractAnnotatedMethodParameterProcessor.java |   51 +
 .../rest/AbstractServiceRestMetadataResolver.java  |  341 ++
 .../rest/AnnotatedMethodParameterProcessor.java    |   66 +
 .../rest/ClassPathServiceRestMetadataReader.java   |   82 +
 .../rest/DefaultServiceRestMetadataResolver.java   |   59 +
 .../dubbo/metadata/rest/RequestMetadata.java       |  226 +
 .../dubbo/metadata/rest/RestMetadataConstants.java |  112 +
 .../dubbo/metadata/rest/RestMethodMetadata.java    |  195 +
 .../dubbo/metadata/rest/ServiceRestMetadata.java   |  103 +
 .../metadata/rest/ServiceRestMetadataReader.java   |   39 +
 .../metadata/rest/ServiceRestMetadataResolver.java |   43 +
 .../rest/jaxrs/DefaultValueParameterProcessor.java |   74 +
 .../rest/jaxrs/FormParamParameterProcessor.java    |   34 +
 .../rest/jaxrs/HeaderParamParameterProcessor.java  |   49 +
 .../jaxrs/JAXRSServiceRestMetadataResolver.java    |   99 +
 .../rest/jaxrs/MatrixParamParameterProcessor.java  |   34 +
 .../jaxrs/ParamAnnotationParameterProcessor.java   |   38 +
 .../rest/jaxrs/QueryParamParameterProcessor.java   |   34 +
 ...bstractRequestAnnotationParameterProcessor.java |   62 +
 .../springmvc/RequestHeaderParameterProcessor.java |   43 +
 .../springmvc/RequestParamParameterProcessor.java  |   43 +
 .../SpringMvcServiceRestMetadataResolver.java      |  128 +
 .../store/BaseWritableMetadataService.java         |   73 +
 .../store/InMemoryWritableMetadataService.java     |  237 +
 .../store/RemoteWritableMetadataService.java       |  233 +
 .../RemoteWritableMetadataServiceDelegate.java     |  100 +
 .../org.apache.dubbo.metadata.ServiceNameMapping   |    1 +
 ...g.apache.dubbo.metadata.WritableMetadataService |    2 +
 ...e.dubbo.metadata.definition.builder.TypeBuilder |    4 +
 ...metadata.rest.AnnotatedMethodParameterProcessor |   10 +
 ...dubbo.metadata.rest.ServiceRestMetadataResolver |    3 +
 ...DynamicConfigurationServiceNameMappingTest.java |   90 +
 .../InMemoryWritableMetadataServiceTest.java       |  149 +
 .../dubbo/metadata/LocalMetadataServiceTest.java   |   36 +
 .../dubbo/metadata/definition/MetadataTest.java    |  151 +
 .../dubbo/metadata/definition/MetadataUtils.java   |   75 +
 .../definition/ServiceDefinitionBuilderTest.java   |   98 +
 .../definition/common/ClassExtendsMap.java         |   32 +
 .../metadata/definition/common/ColorEnum.java      |   22 +
 .../metadata/definition/common/OuterClass.java     |   40 +
 .../common/ResultWithRawCollections.java           |   54 +
 .../metadata/definition/common/TestService.java    |   55 +
 .../metadata/definition/service/ComplexObject.java |  296 ++
 .../metadata/definition/service/DemoService.java   |   30 +
 .../report/identifier/MetadataIdentifierTest.java  |   51 +
 .../support/AbstractMetadataReportFactoryTest.java |  130 +
 .../report/support/AbstractMetadataReportTest.java |  389 ++
 .../dubbo/metadata/rest/DefaultRestService.java    |   69 +
 .../apache/dubbo/metadata/rest/RestService.java    |   42 +
 .../dubbo/metadata/rest/SpringRestService.java     |   97 +
 .../dubbo/metadata/rest/StandardRestService.java   |  107 +
 .../java/org/apache/dubbo/metadata/rest/User.java  |   62 +
 .../JAXRSServiceRestMetadataResolverTest.java      |   82 +
 .../store/InMemoryWritableMetadataServiceTest.java |  111 +
 .../metadata/store/InterfaceNameTestService.java   |   25 +
 .../metadata/store/InterfaceNameTestService2.java  |   25 +
 .../store/RemoteWritableMeatadataServiceTest.java  |  190 +
 .../RemoteWritableMetadataServiceDelegateTest.java |  216 +
 .../dubbo/metadata/store/RetryTestService.java     |   27 +
 .../metadata/test/JTestMetadataReport4Test.java    |  103 +
 .../test/JTestMetadataReportFactory4Test.java      |   33 +
 ...che.dubbo.metadata.report.MetadataReportFactory |    1 +
 .../dubbo/jax-rs-service-rest-metadata.json        |  349 ++
 .../dubbo-metadata-definition-protobuf/pom.xml     |   43 +
 .../definition/protobuf/ProtobufTypeBuilder.java   |  284 ++
 ...e.dubbo.metadata.definition.builder.TypeBuilder |    1 +
 .../protobuf/ProtobufTypeBuilderTest.java          |   73 +
 .../definition/protobuf/model/GooglePB.java        | 3880 +++++++++++++++
 .../protobuf/model/ServiceInterface.java           |   21 +
 dubbo-metadata/dubbo-metadata-processor/pom.xml    |  177 +
 .../AbstractServiceAnnotationProcessor.java        |  108 +
 .../processing/ClassPathMetadataStorage.java       |  105 +
 ...rviceDefinitionMetadataAnnotationProcessor.java |   60 +
 .../builder/ArrayTypeDefinitionBuilder.java        |   50 +
 .../builder/CollectionTypeDefinitionBuilder.java   |   61 +
 .../builder/DeclaredTypeDefinitionBuilder.java     |   49 +
 .../builder/EnumTypeDefinitionBuilder.java         |   55 +
 .../builder/GeneralTypeDefinitionBuilder.java      |   65 +
 .../builder/MapTypeDefinitionBuilder.java          |   62 +
 .../builder/MethodDefinitionBuilder.java           |   53 +
 .../builder/PrimitiveTypeDefinitionBuilder.java    |   48 +
 .../builder/ServiceDefinitionBuilder.java          |   56 +
 .../builder/SimpleTypeDefinitionBuilder.java       |   49 +
 .../processing/builder/TypeDefinitionBuilder.java  |   96 +
 .../AbstractAnnotatedMethodParameterProcessor.java |   52 +
 .../rest/AbstractServiceRestMetadataResolver.java  |  291 ++
 .../rest/AnnotatedMethodParameterProcessor.java    |   64 +
 .../rest/DefaultServiceRestMetadataResolver.java   |  186 +
 .../ServiceRestMetadataAnnotationProcessor.java    |   86 +
 .../rest/ServiceRestMetadataResolver.java          |   55 +
 .../rest/ServiceRestMetadataStorage.java           |   61 +
 .../rest/jaxrs/DefaultValueParameterProcessor.java |   75 +
 .../rest/jaxrs/FormParamParameterProcessor.java    |   34 +
 .../rest/jaxrs/HeaderParamParameterProcessor.java  |   51 +
 .../jaxrs/JAXRSServiceRestMetadataResolver.java    |  108 +
 .../rest/jaxrs/MatrixParamParameterProcessor.java  |   34 +
 .../jaxrs/ParamAnnotationParameterProcessor.java   |   38 +
 .../rest/jaxrs/QueryParamParameterProcessor.java   |   34 +
 ...bstractRequestAnnotationParameterProcessor.java |   69 +
 .../springmvc/RequestHeaderParameterProcessor.java |   43 +
 .../springmvc/RequestParamParameterProcessor.java  |   44 +
 .../SpringMvcServiceRestMetadataResolver.java      |  165 +
 .../processing/util/AnnotationUtils.java           |  233 +
 .../util/ExecutableElementComparator.java          |   72 +
 .../annotation/processing/util/FieldUtils.java     |  146 +
 .../annotation/processing/util/LoggerUtils.java    |   45 +
 .../annotation/processing/util/MemberUtils.java    |   94 +
 .../annotation/processing/util/MethodUtils.java    |  156 +
 .../processing/util/ServiceAnnotationUtils.java    |  121 +
 .../annotation/processing/util/TypeUtils.java      |  400 ++
 ...tation.processing.builder.TypeDefinitionBuilder |    7 +
 ...ocessing.rest.AnnotatedMethodParameterProcessor |   10 +
 ...ion.processing.rest.ServiceRestMetadataResolver |    3 +
 .../services/javax.annotation.processing.Processor |    2 +
 .../AbstractAnnotationProcessingTest.java          |   66 +
 .../AnnotationProcessingTestProcessor.java         |   76 +
 .../processing/CompilerInvocationInterceptor.java  |   45 +
 .../builder/ArrayTypeDefinitionBuilderTest.java    |  121 +
 .../CollectionTypeDefinitionBuilderTest.java       |  105 +
 .../builder/EnumTypeDefinitionBuilderTest.java     |   67 +
 .../builder/GeneralTypeDefinitionBuilderTest.java  |   67 +
 .../builder/MapTypeDefinitionBuilderTest.java      |  134 +
 .../PrimitiveTypeDefinitionBuilderTest.java        |  130 +
 .../builder/ServiceDefinitionBuilderTest.java      |   64 +
 .../builder/SimpleTypeDefinitionBuilderTest.java   |  146 +
 .../processing/model/ArrayTypeModel.java           |   36 +
 .../processing/model/CollectionTypeModel.java      |   42 +
 .../annotation/processing/model/Color.java         |   46 +
 .../annotation/processing/model/MapTypeModel.java  |   41 +
 .../annotation/processing/model/Model.java         |   89 +
 .../processing/model/PrimitiveTypeModel.java       |   73 +
 .../processing/model/SimpleTypeModel.java          |  161 +
 .../AnnotatedMethodParameterProcessorTest.java     |   59 +
 .../processing/util/AnnotationUtilsTest.java       |  231 +
 .../annotation/processing/util/FieldUtilsTest.java |  259 +
 .../processing/util/LoggerUtilsTest.java           |   50 +
 .../processing/util/MemberUtilsTest.java           |  113 +
 .../processing/util/MethodUtilsTest.java           |  195 +
 .../util/ServiceAnnotationUtilsTest.java           |  136 +
 .../annotation/processing/util/TypeUtilsTest.java  |  468 ++
 .../dubbo/metadata/rest/DefaultRestService.java    |   69 +
 .../apache/dubbo/metadata/rest/RestService.java    |   42 +
 .../dubbo/metadata/rest/SpringRestService.java     |   97 +
 .../dubbo/metadata/rest/StandardRestService.java   |  107 +
 .../java/org/apache/dubbo/metadata/rest/User.java  |   62 +
 .../org/apache/dubbo/metadata/tools/Ancestor.java  |   35 +
 .../org/apache/dubbo/metadata/tools/Compiler.java  |  120 +
 .../apache/dubbo/metadata/tools/CompilerTest.java  |   37 +
 .../metadata/tools/DefaultRestServiceTest.java     |   45 +
 .../dubbo/metadata/tools/DefaultTestService.java   |   63 +
 .../dubbo/metadata/tools/GenericTestService.java   |   38 +
 .../org/apache/dubbo/metadata/tools/Parent.java    |   63 +
 .../dubbo/metadata/tools/RestServiceTest.java      |   42 +
 .../metadata/tools/SpringRestServiceTest.java      |   39 +
 .../metadata/tools/StandardRestServiceTest.java    |   39 +
 .../apache/dubbo/metadata/tools/TestProcessor.java |   50 +
 .../apache/dubbo/metadata/tools/TestService.java   |   54 +
 .../dubbo/metadata/tools/TestServiceImpl.java      |   51 +
 .../dubbo-metadata-report-consul/pom.xml           |   42 +
 .../store/consul/ConsulMetadataReport.java         |  135 +
 .../store/consul/ConsulMetadataReportFactory.java  |   32 +
 ...che.dubbo.metadata.report.MetadataReportFactory |    1 +
 dubbo-metadata/dubbo-metadata-report-etcd/pom.xml  |   70 +
 .../metadata/store/etcd/EtcdMetadataReport.java    |  150 +
 .../store/etcd/EtcdMetadataReportFactory.java      |   50 +
 ...che.dubbo.metadata.report.MetadataReportFactory |    1 +
 .../store/etcd/EtcdMetadata4TstService.java        |   28 +
 .../store/etcd/EtcdMetadataReportTest.java         |  259 +
 dubbo-metadata/dubbo-metadata-report-nacos/pom.xml |   42 +
 .../metadata/store/nacos/NacosMetadataReport.java  |  234 +
 .../store/nacos/NacosMetadataReportFactory.java    |   32 +
 ...che.dubbo.metadata.report.MetadataReportFactory |    1 +
 .../store/nacos/NacosMetadata4TstService.java      |   28 +
 .../store/nacos/NacosMetadataReportTest.java       |  247 +
 dubbo-metadata/dubbo-metadata-report-redis/pom.xml |   58 +
 .../metadata/store/redis/RedisMetadataReport.java  |  201 +
 .../store/redis/RedisMetadataReportFactory.java    |   34 +
 ...che.dubbo.metadata.report.MetadataReportFactory |    1 +
 .../store/redis/RedisMetadata4TstService.java      |   28 +
 .../store/redis/RedisMetadataReportTest.java       |  220 +
 .../dubbo-metadata-report-zookeeper/pom.xml        |   46 +
 .../store/zookeeper/ZookeeperMetadataReport.java   |  123 +
 .../zookeeper/ZookeeperMetadataReportFactory.java  |   40 +
 ...che.dubbo.metadata.report.MetadataReportFactory |    1 +
 .../ZookeeperMetadataReport4TstService.java        |   27 +
 .../zookeeper/ZookeeperMetadataReportTest.java     |  277 ++
 dubbo-metadata/pom.xml                             |   41 +
 dubbo-monitor/dubbo-monitor-api/pom.xml            |   53 +
 .../java/org/apache/dubbo/monitor/Constants.java   |   30 +
 .../org/apache/dubbo/monitor/MetricsService.java   |   22 +
 .../java/org/apache/dubbo/monitor/Monitor.java     |   28 +
 .../org/apache/dubbo/monitor/MonitorFactory.java   |   38 +
 .../org/apache/dubbo/monitor/MonitorService.java   |   91 +
 .../monitor/support/AbstractMonitorFactory.java    |  125 +
 .../monitor/support/MetricsServiceDetector.java    |   29 +
 .../dubbo/monitor/support/MonitorFilter.java       |  184 +
 .../monitor/support/MonitorServiceDetector.java    |   29 +
 .../dubbo/internal/org.apache.dubbo.rpc.Filter     |    1 +
 ...g.apache.dubbo.rpc.model.BuiltinServiceDetector |    2 +
 .../support/AbstractMonitorFactoryTest.java        |  103 +
 .../dubbo/monitor/support/MonitorFilterTest.java   |  203 +
 dubbo-monitor/dubbo-monitor-default/pom.xml        |   76 +
 .../apache/dubbo/monitor/dubbo/DubboMonitor.java   |  216 +
 .../dubbo/monitor/dubbo/DubboMonitorFactory.java   |   71 +
 .../apache/dubbo/monitor/dubbo/MetricsFilter.java  |  261 +
 .../org/apache/dubbo/monitor/dubbo/Statistics.java |  210 +
 .../org.apache.dubbo.monitor.MonitorFactory        |    1 +
 .../dubbo/internal/org.apache.dubbo.rpc.Filter     |    1 +
 .../dubbo/monitor/dubbo/AppResponseBuilder.java    |   55 +
 .../monitor/dubbo/DubboMonitorFactoryTest.java     |   68 +
 .../dubbo/monitor/dubbo/DubboMonitorTest.java      |  249 +
 .../dubbo/monitor/dubbo/MetricsFilterTest.java     |  323 ++
 .../dubbo/monitor/dubbo/MockMonitorService.java    |   44 +
 .../apache/dubbo/monitor/dubbo/StatisticsTest.java |   98 +
 .../dubbo/monitor/dubbo/service/DemoService.java   |   30 +
 dubbo-monitor/pom.xml                              |   36 +
 dubbo-plugin/dubbo-auth/pom.xml                    |   46 +
 .../apache/dubbo/auth/AccessKeyAuthenticator.java  |   97 +
 .../main/java/org/apache/dubbo/auth/Constants.java |   45 +
 .../apache/dubbo/auth/DefaultAccessKeyStorage.java |   38 +
 .../auth/exception/AccessKeyNotFoundException.java |   36 +
 .../auth/exception/RpcAuthenticationException.java |   31 +
 .../dubbo/auth/filter/ConsumerSignFilter.java      |   50 +
 .../dubbo/auth/filter/ProviderAuthFilter.java      |   52 +
 .../org/apache/dubbo/auth/model/AccessKeyPair.java |   89 +
 .../apache/dubbo/auth/spi/AccessKeyStorage.java    |   40 +
 .../org/apache/dubbo/auth/spi/Authenticator.java   |   44 +
 .../apache/dubbo/auth/utils/SignatureUtils.java    |   97 +
 .../org.apache.dubbo.auth.spi.AccessKeyStorage     |    1 +
 .../org.apache.dubbo.auth.spi.Authenticator        |    1 +
 .../dubbo/internal/org.apache.dubbo.rpc.Filter     |    2 +
 .../dubbo/auth/AccessKeyAuthenticatorTest.java     |  136 +
 .../dubbo/auth/DefaultAccessKeyStorageTest.java    |   42 +
 .../dubbo/auth/filter/ConsumerSignFilterTest.java  |   62 +
 .../dubbo/auth/filter/ProviderAuthFilterTest.java  |  188 +
 .../dubbo/auth/utils/SignatureUtilsTest.java       |   58 +
 dubbo-plugin/dubbo-qos/pom.xml                     |   72 +
 .../org/apache/dubbo/qos/command/BaseCommand.java  |   24 +
 .../apache/dubbo/qos/command/CommandContext.java   |   78 +
 .../dubbo/qos/command/CommandContextFactory.java   |   27 +
 .../apache/dubbo/qos/command/CommandExecutor.java  |   28 +
 .../dubbo/qos/command/DefaultCommandExecutor.java  |   35 +
 .../dubbo/qos/command/NoSuchCommandException.java  |   23 +
 .../apache/dubbo/qos/command/annotation/Cmd.java   |   58 +
 .../qos/command/decoder/HttpCommandDecoder.java    |   80 +
 .../qos/command/decoder/TelnetCommandDecoder.java  |   41 +
 .../org/apache/dubbo/qos/command/impl/Help.java    |  109 +
 .../java/org/apache/dubbo/qos/command/impl/Ls.java |   88 +
 .../org/apache/dubbo/qos/command/impl/Offline.java |   80 +
 .../org/apache/dubbo/qos/command/impl/Online.java  |   80 +
 .../org/apache/dubbo/qos/command/impl/Quit.java    |   30 +
 .../org/apache/dubbo/qos/command/impl/Ready.java   |   32 +
 .../org/apache/dubbo/qos/command/impl/Version.java |   37 +
 .../dubbo/qos/command/util/CommandHelper.java      |   64 +
 .../dubbo/qos/command/util/ServiceCheckUtils.java  |   62 +
 .../org/apache/dubbo/qos/common/QosConstants.java  |   26 +
 .../dubbo/qos/legacy/ChangeTelnetHandler.java      |   65 +
 .../dubbo/qos/legacy/CountTelnetHandler.java       |  163 +
 .../dubbo/qos/legacy/CurrentTelnetHandler.java     |   46 +
 .../dubbo/qos/legacy/InvokeTelnetHandler.java      |  261 +
 .../apache/dubbo/qos/legacy/ListTelnetHandler.java |  165 +
 .../apache/dubbo/qos/legacy/LogTelnetHandler.java  |   91 +
 .../apache/dubbo/qos/legacy/PortTelnetHandler.java |   96 +
 .../dubbo/qos/legacy/SelectTelnetHandler.java      |   60 +
 .../dubbo/qos/legacy/ShutdownTelnetHandler.java    |   63 +
 .../dubbo/qos/legacy/TraceTelnetHandler.java       |   93 +
 .../dubbo/qos/protocol/QosProtocolWrapper.java     |  123 +
 .../org/apache/dubbo/qos/server/DubboLogo.java     |   25 +
 .../java/org/apache/dubbo/qos/server/Server.java   |  156 +
 .../qos/server/handler/HttpProcessHandler.java     |  107 +
 .../qos/server/handler/LocalHostPermitHandler.java |   48 +
 .../qos/server/handler/QosProcessHandler.java      |  110 +
 .../qos/server/handler/TelnetProcessHandler.java   |   73 +
 .../org/apache/dubbo/qos/textui/TComponent.java    |   29 +
 .../main/java/org/apache/dubbo/qos/textui/TKv.java |   78 +
 .../java/org/apache/dubbo/qos/textui/TLadder.java  |   77 +
 .../java/org/apache/dubbo/qos/textui/TTable.java   |  566 +++
 .../java/org/apache/dubbo/qos/textui/TTree.java    |  266 +
 .../org.apache.dubbo.qos.command.BaseCommand       |    7 +
 .../org.apache.dubbo.remoting.telnet.TelnetHandler |    9 +
 .../dubbo/internal/org.apache.dubbo.rpc.Protocol   |    1 +
 .../qos/command/CommandContextFactoryTest.java     |   37 +
 .../dubbo/qos/command/CommandContextTest.java      |   56 +
 .../qos/command/DefaultCommandExecutorTest.java    |   41 +
 .../apache/dubbo/qos/command/GreetingCommand.java  |   30 +
 .../command/decoder/HttpCommandDecoderTest.java    |   64 +
 .../command/decoder/TelnetCommandDecoderTest.java  |   35 +
 .../apache/dubbo/qos/command/impl/HelpTest.java    |   48 +
 .../org/apache/dubbo/qos/command/impl/LsTest.java  |   75 +
 .../apache/dubbo/qos/command/impl/OfflineTest.java |   68 +
 .../apache/dubbo/qos/command/impl/OnlineTest.java  |   60 +
 .../apache/dubbo/qos/command/impl/QuitTest.java    |   34 +
 .../dubbo/qos/command/impl/TestInterface.java      |   22 +
 .../dubbo/qos/command/impl/TestInterface2.java     |   22 +
 .../qos/command/impl/TestRegistryFactory.java      |   30 +
 .../dubbo/qos/command/util/CommandHelperTest.java  |   58 +
 .../dubbo/qos/legacy/ChangeTelnetHandlerTest.java  |  124 +
 .../dubbo/qos/legacy/CurrentTelnetHandlerTest.java |   63 +
 .../dubbo/qos/legacy/InvokerTelnetHandlerTest.java |  285 ++
 .../dubbo/qos/legacy/ListTelnetHandlerTest.java    |  152 +
 .../dubbo/qos/legacy/LogTelnetHandlerTest.java     |   54 +
 .../dubbo/qos/legacy/PortTelnetHandlerTest.java    |  105 +
 .../org/apache/dubbo/qos/legacy/ProtocolUtils.java |   60 +
 .../dubbo/qos/legacy/SelectTelnetHandlerTest.java  |  126 +
 .../qos/legacy/ShutdownTelnetHandlerTest.java      |   57 +
 .../dubbo/qos/legacy/service/CustomArgument.java   |   52 +
 .../dubbo/qos/legacy/service/DemoService.java      |   69 +
 .../dubbo/qos/legacy/service/DemoServiceImpl.java  |  129 +
 .../org/apache/dubbo/qos/legacy/service/Man.java   |   46 +
 .../dubbo/qos/legacy/service/NonSerialized.java    |   24 +
 .../apache/dubbo/qos/legacy/service/Person.java    |   45 +
 .../org/apache/dubbo/qos/legacy/service/Type.java  |   21 +
 .../qos/legacy/service/generic/DemoException.java  |   42 +
 .../qos/legacy/service/generic/DemoService.java    |   35 +
 .../legacy/service/generic/DemoServiceImpl.java    |   43 +
 .../legacy/service/generic/GenericServiceTest.java |  336 ++
 .../dubbo/qos/legacy/service/generic/User.java     |   65 +
 .../dubbo/qos/protocol/QosProtocolWrapperTest.java |   84 +
 .../qos/server/handler/HttpProcessHandlerTest.java |   86 +
 .../server/handler/LocalHostPermitHandlerTest.java |   56 +
 .../qos/server/handler/QosProcessHandlerTest.java  |   67 +
 .../server/handler/TelnetProcessHandlerTest.java   |   72 +
 .../java/org/apache/dubbo/qos/textui/TKvTest.java  |   60 +
 .../org/apache/dubbo/qos/textui/TLadderTest.java   |   41 +
 .../org/apache/dubbo/qos/textui/TTableTest.java    |   55 +
 .../org/apache/dubbo/qos/textui/TTreeTest.java     |   42 +
 .../org.apache.dubbo.qos.command.BaseCommand       |   18 +
 .../org.apache.dubbo.registry.RegistryFactory      |    1 +
 dubbo-plugin/pom.xml                               |   39 +
 dubbo-registry/dubbo-registry-api/pom.xml          |   84 +
 .../org/apache/dubbo/registry/AddressListener.java |   37 +
 .../java/org/apache/dubbo/registry/Constants.java  |   96 +
 .../dubbo/registry/ListenerRegistryWrapper.java    |  158 +
 .../org/apache/dubbo/registry/NotifyListener.java  |   44 +
 .../java/org/apache/dubbo/registry/Registry.java   |   36 +
 .../org/apache/dubbo/registry/RegistryFactory.java |   48 +
 .../dubbo/registry/RegistryFactoryWrapper.java     |   38 +
 .../org/apache/dubbo/registry/RegistryService.java |   94 +
 .../dubbo/registry/RegistryServiceListener.java    |   41 +
 .../client/AbstractServiceDiscoveryFactory.java    |   42 +
 .../client/DefaultServiceDiscoveryFactory.java     |   49 +
 .../registry/client/DefaultServiceInstance.java    |  159 +
 .../client/EventPublishingServiceDiscovery.java    |  305 ++
 .../client/FileSystemServiceDiscovery.java         |  215 +
 .../dubbo/registry/client/ServiceDiscovery.java    |  271 ++
 .../registry/client/ServiceDiscoveryFactory.java   |   53 +
 .../registry/client/ServiceDiscoveryRegistry.java  |  903 ++++
 .../client/ServiceDiscoveryRegistryFactory.java    |   38 +
 .../client/ServiceDiscoveryRegistryProtocol.java   |   47 +
 .../dubbo/registry/client/ServiceInstance.java     |   96 +
 .../registry/client/ServiceInstanceCustomizer.java |   41 +
 .../client/ServiceInstanceMetadataCustomizer.java  |   73 +
 .../event/ServiceDiscoveryDestroyedEvent.java      |   33 +
 .../event/ServiceDiscoveryDestroyingEvent.java     |   33 +
 .../client/event/ServiceDiscoveryEvent.java        |   67 +
 .../event/ServiceDiscoveryExceptionEvent.java      |   48 +
 .../event/ServiceDiscoveryInitializedEvent.java    |   33 +
 .../event/ServiceDiscoveryInitializingEvent.java   |   33 +
 .../client/event/ServiceInstanceEvent.java         |   47 +
 .../event/ServiceInstancePreRegisteredEvent.java   |   34 +
 .../event/ServiceInstancePreUnregisteredEvent.java |   34 +
 .../event/ServiceInstanceRegisteredEvent.java      |   34 +
 .../event/ServiceInstanceUnregisteredEvent.java    |   35 +
 .../client/event/ServiceInstancesChangedEvent.java |   65 +
 .../CustomizableServiceInstanceListener.java       |   42 +
 .../event/listener/LoggingEventListener.java       |   85 +
 .../listener/ServiceInstancesChangedListener.java  |   75 +
 ...ExportedServicesRevisionMetadataCustomizer.java |   56 +
 .../client/metadata/MetadataServiceURLBuilder.java |   40 +
 ...MetadataServiceURLParamsMetadataCustomizer.java |   64 +
 .../metadata/ProtocolPortsMetadataCustomizer.java  |   60 +
 .../metadata/RefreshServiceMetadataCustomizer.java |   47 +
 .../RestProtocolSubscribedURLsSynthesizer.java     |   67 +
 .../metadata/ServiceInstanceMetadataUtils.java     |  283 ++
 .../SpringCloudMetadataServiceURLBuilder.java      |   51 +
 .../StandardMetadataServiceURLBuilder.java         |   80 +
 ...bscribedServicesRevisionMetadataCustomizer.java |   57 +
 .../client/metadata/SubscribedURLsSynthesizer.java |   55 +
 .../client/metadata/URLRevisionResolver.java       |  111 +
 .../proxy/BaseMetadataServiceProxyFactory.java     |   38 +
 .../proxy/DefaultMetadataServiceProxyFactory.java  |   85 +
 .../proxy/MetadataServiceProxyFactory.java         |   57 +
 .../metadata/proxy/RemoteMetadataServiceProxy.java |   95 +
 .../proxy/RemoteMetadataServiceProxyFactory.java   |   34 +
 .../apache/dubbo/registry/client/package-info.java |   23 +
 .../selector/RandomServiceInstanceSelector.java    |   47 +
 .../client/selector/ServiceInstanceSelector.java   |   43 +
 .../integration/AbstractConfiguratorListener.java  |   97 +
 .../registry/integration/RegistryDirectory.java    |  776 +++
 .../integration/RegistryInvokerWrapper.java        |   79 +
 .../registry/integration/RegistryProtocol.java     |  825 ++++
 .../integration/RegistryProtocolListener.java      |   52 +
 .../dubbo/registry/retry/AbstractRetryTask.java    |  133 +
 .../dubbo/registry/retry/FailedNotifiedTask.java   |   67 +
 .../dubbo/registry/retry/FailedRegisteredTask.java |   40 +
 .../dubbo/registry/retry/FailedSubscribedTask.java |   47 +
 .../registry/retry/FailedUnregisteredTask.java     |   40 +
 .../registry/retry/FailedUnsubscribedTask.java     |   47 +
 .../apache/dubbo/registry/retry/ReExportTask.java  |   41 +
 .../registry/status/RegistryStatusChecker.java     |   57 +
 .../dubbo/registry/support/AbstractRegistry.java   |  530 ++
 .../registry/support/AbstractRegistryFactory.java  |  204 +
 .../dubbo/registry/support/FailbackRegistry.java   |  482 ++
 .../support/SkipFailbackWrapperException.java      |   36 +
 .../org.apache.dubbo.common.status.StatusChecker   |    1 +
 .../internal/org.apache.dubbo.event.EventListener  |    2 +
 .../org.apache.dubbo.registry.RegistryFactory      |    2 +
 ...g.apache.dubbo.registry.client.ServiceDiscovery |    1 +
 ...e.dubbo.registry.client.ServiceDiscoveryFactory |    1 +
 ...dubbo.registry.client.ServiceInstanceCustomizer |    6 +
 ...istry.client.metadata.MetadataServiceURLBuilder |    2 +
 ...istry.client.metadata.SubscribedURLsSynthesizer |    1 +
 ...ient.metadata.proxy.MetadataServiceProxyFactory |    2 +
 ...egistry.client.selector.ServiceInstanceSelector |    1 +
 .../dubbo/internal/org.apache.dubbo.rpc.Protocol   |    2 +
 .../dubbo/registry/PerformanceRegistryTest.java    |   67 +
 .../apache/dubbo/registry/PerformanceUtils.java    |  127 +
 .../dubbo/registry/RegistryFactoryWrapperTest.java |   55 +
 .../dubbo/registry/RegistryServiceListener1.java   |   46 +
 .../dubbo/registry/RegistryServiceListener2.java   |   46 +
 .../dubbo/registry/SimpleRegistryFactory.java      |   28 +
 .../java/org/apache/dubbo/registry/ZKTools.java    |  308 ++
 .../client/DefaultServiceInstanceTest.java         |   67 +
 .../EventPublishingServiceDiscoveryTest.java       |  163 +
 .../client/FileSystemServiceDiscoveryTest.java     |   60 +
 .../registry/client/InMemoryServiceDiscovery.java  |  105 +
 .../registry/client/ServiceDiscoveryTest.java      |  264 +
 .../client/ServieDiscoveryRegistryTest.java        |   24 +
 .../CustomizableServiceInstanceListenerTest.java   |   39 +
 .../event/listener/LoggingEventListenerTest.java   |   88 +
 .../ServiceInstancesChangedListenerTest.java       |   59 +
 .../DefaultServiceInstanceDeserializerTest.java    |   58 +
 .../metadata/MetadataServiceURLBuilderTest.java    |   42 +
 .../metadata/ServiceInstanceMetadataUtilsTest.java |   88 +
 .../SpringCloudMetadataServiceURLBuilderTest.java  |   51 +
 .../client/metadata/URLRevisionResolverTest.java   |   47 +
 .../support/AbstractRegistryFactoryTest.java       |  126 +
 .../registry/support/AbstractRegistryTest.java     |  558 +++
 .../registry/support/FailbackRegistryTest.java     |  274 ++
 .../support/ServiceOrientedRegistryTest.java       |  179 +
 .../org.apache.dubbo.registry.RegistryFactory      |    1 +
 ...g.apache.dubbo.registry.RegistryServiceListener |    2 +
 ...g.apache.dubbo.registry.client.ServiceDiscovery |    1 +
 .../src/test/resources/log4j.xml                   |   29 +
 dubbo-registry/dubbo-registry-consul/pom.xml       |   63 +
 .../registry/consul/AbstractConsulRegistry.java    |   39 +
 .../dubbo/registry/consul/ConsulRegistry.java      |  360 ++
 .../registry/consul/ConsulRegistryFactory.java     |   32 +
 .../registry/consul/ConsulServiceDiscovery.java    |  394 ++
 .../org.apache.dubbo.registry.RegistryFactory      |    1 +
 ...g.apache.dubbo.registry.client.ServiceDiscovery |    1 +
 .../dubbo/registry/consul/ConsulRegistryTest.java  |  135 +
 .../consul/ConsulServiceDiscoveryTest.java         |  108 +
 dubbo-registry/dubbo-registry-default/pom.xml      |   69 +
 .../apache/dubbo/registry/dubbo/DubboRegistry.java |  161 +
 .../dubbo/registry/dubbo/DubboRegistryFactory.java |  118 +
 .../org.apache.dubbo.registry.RegistryFactory      |    1 +
 .../registry/dubbo/AbstractRegistryService.java    |  237 +
 .../apache/dubbo/registry/dubbo/DemoService.java   |   27 +
 .../dubbo/registry/dubbo/DemoServiceImpl.java      |   32 +
 .../dubbo/registry/dubbo/DubboRegistryTest.java    |  155 +
 .../apache/dubbo/registry/dubbo/MockChannel.java   |  141 +
 .../apache/dubbo/registry/dubbo/MockedClient.java  |  298 ++
 .../registry/dubbo/RegistryDirectoryTest.java      | 1143 +++++
 .../dubbo/registry/dubbo/RegistryProtocolTest.java |  233 +
 .../registry/dubbo/RegistryStatusCheckerTest.java  |   69 +
 .../registry/dubbo/SimpleRegistryExporter.java     |   87 +
 .../registry/dubbo/SimpleRegistryService.java      |  146 +
 .../src/test/resources/log4j.xml                   |   38 +
 dubbo-registry/dubbo-registry-etcd3/pom.xml        |   52 +
 .../apache/dubbo/registry/etcd/EtcdRegistry.java   |  359 ++
 .../dubbo/registry/etcd/EtcdRegistryFactory.java   |   36 +
 .../dubbo/registry/etcd/EtcdServiceDiscovery.java  |  208 +
 .../org.apache.dubbo.registry.RegistryFactory      |    1 +
 ...g.apache.dubbo.registry.client.ServiceDiscovery |    1 +
 .../dubbo/registry/etcd/EtcdRegistryTest.java      |  327 ++
 .../registry/etcd/EtcdServiceDiscoveryTest.java    |  124 +
 dubbo-registry/dubbo-registry-eureka/pom.xml       |   86 +
 .../eureka/ConfigurableEurekaInstanceConfig.java   |  369 ++
 .../registry/eureka/EurekaServiceDiscovery.java    |  279 ++
 .../apache/dubbo/registry/eureka/package-info.java |   22 +
 ...g.apache.dubbo.registry.client.ServiceDiscovery |    1 +
 .../eureka/EurekaServiceDiscoveryTest.java         |   67 +
 dubbo-registry/dubbo-registry-multicast/pom.xml    |   39 +
 .../registry/multicast/MulticastRegistry.java      |  435 ++
 .../multicast/MulticastRegistryFactory.java        |   34 +
 .../org.apache.dubbo.registry.RegistryFactory      |    1 +
 .../multicast/MulticastRegistryFactoryTest.java    |   35 +
 .../registry/multicast/MulticastRegistryTest.java  |  263 +
 dubbo-registry/dubbo-registry-multiple/pom.xml     |   66 +
 .../dubbo/registry/multiple/MultipleRegistry.java  |  337 ++
 .../registry/multiple/MultipleRegistryFactory.java |   33 +
 .../org.apache.dubbo.registry.RegistryFactory      |    1 +
 .../multiple/MultipleRegistry2S2RTest.java         |  213 +
 .../multiple/MultipleRegistryTestUtil.java         |  145 +
 dubbo-registry/dubbo-registry-nacos/pom.xml        |   84 +
 .../apache/dubbo/registry/nacos/NacosRegistry.java |  629 +++
 .../dubbo/registry/nacos/NacosRegistryFactory.java |   42 +
 .../registry/nacos/NacosServiceDiscovery.java      |  130 +
 .../dubbo/registry/nacos/NacosServiceName.java     |  234 +
 .../nacos/util/NacosInstanceManageUtil.java        |   67 +
 .../nacos/util/NacosNamingServiceUtils.java        |  192 +
 .../org.apache.dubbo.registry.RegistryFactory      |    1 +
 ...g.apache.dubbo.registry.client.ServiceDiscovery |    1 +
 dubbo-registry/dubbo-registry-redis/pom.xml        |   53 +
 .../apache/dubbo/registry/redis/RedisRegistry.java |  661 +++
 .../dubbo/registry/redis/RedisRegistryFactory.java |   34 +
 .../org.apache.dubbo.registry.RegistryFactory      |    1 +
 .../dubbo/registry/redis/RedisRegistryTest.java    |  130 +
 dubbo-registry/dubbo-registry-sofa/pom.xml         |  134 +
 .../apache/dubbo/registry/sofa/SofaRegistry.java   |  300 ++
 .../dubbo/registry/sofa/SofaRegistryConstants.java |   43 +
 .../dubbo/registry/sofa/SofaRegistryFactory.java   |   41 +
 .../org.apache.dubbo.registry.RegistryFactory      |    1 +
 .../apache/dubbo/registry/sofa/HelloService.java   |   24 +
 .../dubbo/registry/sofa/HelloServiceImpl.java      |   44 +
 .../src/test/resources/log4j.properties            |    7 +
 dubbo-registry/dubbo-registry-zookeeper/pom.xml    |   53 +
 .../registry/zookeeper/ZookeeperInstance.java      |   77 +
 .../registry/zookeeper/ZookeeperRegistry.java      |  315 ++
 .../zookeeper/ZookeeperRegistryFactory.java        |   45 +
 .../zookeeper/ZookeeperServiceDiscovery.java       |  189 +
 .../ZookeeperServiceDiscoveryChangeWatcher.java    |   57 +
 .../zookeeper/util/CuratorFrameworkParams.java     |  102 +
 .../zookeeper/util/CuratorFrameworkUtils.java      |  117 +
 .../org.apache.dubbo.registry.RegistryFactory      |    1 +
 ...g.apache.dubbo.registry.client.ServiceDiscovery |    1 +
 .../registry/zookeeper/ZookeeperRegistryTest.java  |  157 +
 .../zookeeper/ZookeeperServiceDiscoveryTest.java   |  206 +
 dubbo-registry/pom.xml                             |   45 +
 dubbo-remoting/dubbo-remoting-api/pom.xml          |   50 +
 .../java/org/apache/dubbo/remoting/Channel.java    |   74 +
 .../org/apache/dubbo/remoting/ChannelHandler.java  |   69 +
 .../java/org/apache/dubbo/remoting/Client.java     |   38 +
 .../main/java/org/apache/dubbo/remoting/Codec.java |   61 +
 .../java/org/apache/dubbo/remoting/Codec2.java     |   40 +
 .../java/org/apache/dubbo/remoting/Constants.java  |  138 +
 .../java/org/apache/dubbo/remoting/Decodeable.java |   24 +
 .../java/org/apache/dubbo/remoting/Dispatcher.java |   41 +
 .../java/org/apache/dubbo/remoting/Endpoint.java   |   89 +
 .../apache/dubbo/remoting/ExecutionException.java  |   68 +
 .../org/apache/dubbo/remoting/IdleSensible.java    |   34 +
 .../apache/dubbo/remoting/RemotingException.java   |   84 +
 .../org/apache/dubbo/remoting/RemotingServer.java  |   58 +
 .../apache/dubbo/remoting/TimeoutException.java    |   57 +
 .../org/apache/dubbo/remoting/Transporter.java     |   58 +
 .../org/apache/dubbo/remoting/Transporters.java    |   82 +
 .../remoting/buffer/AbstractChannelBuffer.java     |  341 ++
 .../buffer/ByteBufferBackedChannelBuffer.java      |  259 +
 .../dubbo/remoting/buffer/ChannelBuffer.java       |  951 ++++
 .../remoting/buffer/ChannelBufferFactory.java      |   29 +
 .../remoting/buffer/ChannelBufferInputStream.java  |  109 +
 .../remoting/buffer/ChannelBufferOutputStream.java |   62 +
 .../dubbo/remoting/buffer/ChannelBuffers.java      |  156 +
 .../buffer/DirectChannelBufferFactory.java         |   78 +
 .../remoting/buffer/DynamicChannelBuffer.java      |  208 +
 .../dubbo/remoting/buffer/HeapChannelBuffer.java   |  218 +
 .../remoting/buffer/HeapChannelBufferFactory.java  |   57 +
 .../dubbo/remoting/exchange/ExchangeChannel.java   |   84 +
 .../dubbo/remoting/exchange/ExchangeClient.java    |   28 +
 .../dubbo/remoting/exchange/ExchangeHandler.java   |   40 +
 .../dubbo/remoting/exchange/ExchangeServer.java    |   44 +
 .../apache/dubbo/remoting/exchange/Exchanger.java  |   55 +
 .../apache/dubbo/remoting/exchange/Exchangers.java |  121 +
 .../apache/dubbo/remoting/exchange/Request.java    |  135 +
 .../apache/dubbo/remoting/exchange/Response.java   |  174 +
 .../remoting/exchange/codec/ExchangeCodec.java     |  454 ++
 .../remoting/exchange/support/DefaultFuture.java   |  301 ++
 .../exchange/support/ExchangeHandlerAdapter.java   |   36 +
 .../support/ExchangeHandlerDispatcher.java         |  121 +
 .../exchange/support/ExchangeServerDelegate.java   |  132 +
 .../remoting/exchange/support/MultiMessage.java    |   86 +
 .../dubbo/remoting/exchange/support/Replier.java   |   37 +
 .../exchange/support/ReplierDispatcher.java        |   77 +
 .../exchange/support/header/AbstractTimerTask.java |   97 +
 .../exchange/support/header/CloseTimerTask.java    |   55 +
 .../support/header/HeaderExchangeChannel.java      |  270 +
 .../support/header/HeaderExchangeClient.java       |  238 +
 .../support/header/HeaderExchangeHandler.java      |  229 +
 .../support/header/HeaderExchangeServer.java       |  273 ++
 .../exchange/support/header/HeaderExchanger.java   |   47 +
 .../exchange/support/header/HeartbeatHandler.java  |  116 +
 .../support/header/HeartbeatTimerTask.java         |   64 +
 .../support/header/ReconnectTimerTask.java         |   67 +
 .../dubbo/remoting/telnet/TelnetHandler.java       |   37 +
 .../dubbo/remoting/telnet/codec/TelnetCodec.java   |  298 ++
 .../apache/dubbo/remoting/telnet/support/Help.java |   39 +
 .../telnet/support/TelnetHandlerAdapter.java       |  100 +
 .../dubbo/remoting/telnet/support/TelnetUtils.java |  159 +
 .../telnet/support/command/ClearTelnetHandler.java |   48 +
 .../telnet/support/command/ExitTelnetHandler.java  |   37 +
 .../telnet/support/command/HelpTelnetHandler.java  |   73 +
 .../telnet/support/command/LogTelnetHandler.java   |   95 +
 .../support/command/StatusTelnetHandler.java       |  101 +
 .../dubbo/remoting/transport/AbstractChannel.java  |   47 +
 .../transport/AbstractChannelHandlerDelegate.java  |   65 +
 .../dubbo/remoting/transport/AbstractClient.java   |  330 ++
 .../dubbo/remoting/transport/AbstractCodec.java    |   84 +
 .../dubbo/remoting/transport/AbstractEndpoint.java |  115 +
 .../dubbo/remoting/transport/AbstractPeer.java     |  154 +
 .../dubbo/remoting/transport/AbstractServer.java   |  193 +
 .../dubbo/remoting/transport/ChannelDelegate.java  |  126 +
 .../remoting/transport/ChannelHandlerAdapter.java  |   48 +
 .../remoting/transport/ChannelHandlerDelegate.java |   23 +
 .../transport/ChannelHandlerDispatcher.java        |  120 +
 .../dubbo/remoting/transport/ClientDelegate.java   |  142 +
 .../dubbo/remoting/transport/CodecSupport.java     |   95 +
 .../dubbo/remoting/transport/DecodeHandler.java    |   69 +
 .../transport/ExceedPayloadLimitException.java     |   27 +
 .../remoting/transport/MultiMessageHandler.java    |   46 +
 .../dubbo/remoting/transport/ServerDelegate.java   |  122 +
 .../remoting/transport/codec/CodecAdapter.java     |   61 +
 .../remoting/transport/codec/TransportCodec.java   |   81 +
 .../transport/dispatcher/ChannelEventRunnable.java |  134 +
 .../transport/dispatcher/ChannelHandlers.java      |   49 +
 .../dispatcher/WrappedChannelHandler.java          |  149 +
 .../dispatcher/all/AllChannelHandler.java          |   81 +
 .../transport/dispatcher/all/AllDispatcher.java    |   35 +
 .../ConnectionOrderedChannelHandler.java           |  109 +
 .../connection/ConnectionOrderedDispatcher.java    |   35 +
 .../dispatcher/direct/DirectChannelHandler.java    |   51 +
 .../dispatcher/direct/DirectDispatcher.java        |   35 +
 .../execution/ExecutionChannelHandler.java         |   65 +
 .../dispatcher/execution/ExecutionDispatcher.java  |   35 +
 .../message/MessageOnlyChannelHandler.java         |   52 +
 .../dispatcher/message/MessageOnlyDispatcher.java  |   35 +
 .../dubbo/remoting/utils/PayloadDropper.java       |   48 +
 .../org/apache/dubbo/remoting/utils/UrlUtils.java  |   37 +
 .../internal/org.apache.dubbo.remoting.Codec2      |    3 +
 .../internal/org.apache.dubbo.remoting.Dispatcher  |    5 +
 .../org.apache.dubbo.remoting.exchange.Exchanger   |    1 +
 .../org.apache.dubbo.remoting.telnet.TelnetHandler |    5 +
 .../apache/dubbo/remoting/ChanelHandlerTest.java   |  125 +
 .../dubbo/remoting/PerformanceClientCloseTest.java |  105 +
 .../dubbo/remoting/PerformanceClientFixedTest.java |  138 +
 .../dubbo/remoting/PerformanceClientMain.java      |   29 +
 .../dubbo/remoting/PerformanceClientTest.java      |  230 +
 .../dubbo/remoting/PerformanceServerMain.java      |   28 +
 .../dubbo/remoting/PerformanceServerTest.java      |  171 +
 .../apache/dubbo/remoting/PerformanceUtils.java    |  126 +
 .../org/apache/dubbo/remoting/TelnetServer.java    |   50 +
 .../remoting/buffer/AbstractChannelBufferTest.java |  890 ++++
 .../buffer/ByteBufferBackedChannelBufferTest.java  |   35 +
 .../remoting/buffer/ChannelBufferStreamTest.java   |  104 +
 .../remoting/buffer/DirectChannelBufferTest.java   |   36 +
 .../remoting/buffer/DynamicChannelBufferTest.java  |   60 +
 .../remoting/buffer/HeapChannelBufferTest.java     |   56 +
 .../dubbo/remoting/codec/AbstractMockChannel.java  |  139 +
 .../dubbo/remoting/codec/ExchangeCodecTest.java    |  463 ++
 .../dubbo/remoting/codec/TelnetCodecTest.java      |  382 ++
 .../exchange/support/DefaultFutureTest.java        |  128 +
 .../support/header/HeaderExchangeChannelTest.java  |  293 ++
 .../exchange/support/header/HeartBeatTaskTest.java |   81 +
 .../exchange/support/header/MockChannel.java       |  122 +
 .../handler/ConnectChannelHandlerTest.java         |  146 +
 .../handler/HeaderExchangeHandlerTest.java         |  225 +
 .../dubbo/remoting/handler/MockedChannel.java      |  115 +
 .../remoting/handler/MockedChannelHandler.java     |   61 +
 .../handler/WrappedChannelHandlerTest.java         |  146 +
 .../remoting/transport/AbstractCodecTest.java      |   61 +
 .../remoting/transport/codec/CodecAdapterTest.java |   30 +
 .../transport/codec/DeprecatedExchangeCodec.java   |  409 ++
 .../transport/codec/DeprecatedTelnetCodec.java     |  330 ++
 .../src/test/resources/log4j.xml                   |   29 +
 dubbo-remoting/dubbo-remoting-etcd3/pom.xml        |  107 +
 .../dubbo/remoting/etcd/AbstractRetryPolicy.java   |   45 +
 .../apache/dubbo/remoting/etcd/ChildListener.java  |   25 +
 .../org/apache/dubbo/remoting/etcd/Constants.java  |   55 +
 .../org/apache/dubbo/remoting/etcd/EtcdClient.java |  191 +
 .../dubbo/remoting/etcd/EtcdTransporter.java       |   47 +
 .../apache/dubbo/remoting/etcd/RetryPolicy.java    |   31 +
 .../apache/dubbo/remoting/etcd/StateListener.java  |   27 +
 .../etcd/jetcd/ConnectionStateListener.java        |   31 +
 .../dubbo/remoting/etcd/jetcd/JEtcdClient.java     |  473 ++
 .../remoting/etcd/jetcd/JEtcdClientWrapper.java    |  754 +++
 .../remoting/etcd/jetcd/JEtcdTransporter.java      |   30 +
 .../dubbo/remoting/etcd/jetcd/RetryLoops.java      |   99 +
 .../dubbo/remoting/etcd/jetcd/RetryNTimes.java     |   36 +
 .../dubbo/remoting/etcd/option/OptionUtil.java     |   78 +
 .../remoting/etcd/support/AbstractEtcdClient.java  |  194 +
 .../org.apache.dubbo.remoting.etcd.EtcdTransporter |    1 +
 .../dubbo/remoting/etcd/jetcd/JEtcdClientTest.java |  427 ++
 .../etcd/jetcd/JEtcdClientWrapperTest.java         |  187 +
 .../dubbo/remoting/etcd/jetcd/LeaseTest.java       |  154 +
 dubbo-remoting/dubbo-remoting-grizzly/pom.xml      |   43 +
 .../remoting/transport/grizzly/GrizzlyChannel.java |  198 +
 .../remoting/transport/grizzly/GrizzlyClient.java  |  112 +
 .../transport/grizzly/GrizzlyCodecAdapter.java     |  145 +
 .../remoting/transport/grizzly/GrizzlyHandler.java |  118 +
 .../remoting/transport/grizzly/GrizzlyServer.java  |  127 +
 .../transport/grizzly/GrizzlyTransporter.java      |   43 +
 .../internal/org.apache.dubbo.remoting.Transporter |    1 +
 .../transport/grizzly/GrizzlyTransporterTest.java  |   41 +
 dubbo-remoting/dubbo-remoting-http/pom.xml         |   62 +
 .../org/apache/dubbo/remoting/http/HttpBinder.java |   39 +
 .../apache/dubbo/remoting/http/HttpHandler.java    |   39 +
 .../org/apache/dubbo/remoting/http/HttpServer.java |   72 +
 .../dubbo/remoting/http/jetty/JettyHttpBinder.java |   34 +
 .../dubbo/remoting/http/jetty/JettyHttpServer.java |  112 +
 .../remoting/http/servlet/BootstrapListener.java   |   37 +
 .../remoting/http/servlet/DispatcherServlet.java   |   65 +
 .../remoting/http/servlet/ServletHttpBinder.java   |   34 +
 .../remoting/http/servlet/ServletHttpServer.java   |   31 +
 .../remoting/http/servlet/ServletManager.java      |   50 +
 .../remoting/http/support/AbstractHttpServer.java  |  134 +
 .../remoting/http/tomcat/TomcatHttpBinder.java     |   31 +
 .../remoting/http/tomcat/TomcatHttpServer.java     |   93 +
 .../org.apache.dubbo.remoting.http.HttpBinder      |    3 +
 .../remoting/http/jetty/JettyHttpBinderTest.java   |   53 +
 .../remoting/http/tomcat/TomcatHttpBinderTest.java |   55 +
 dubbo-remoting/dubbo-remoting-mina/pom.xml         |   53 +
 .../dubbo/remoting/transport/mina/MinaChannel.java |  191 +
 .../dubbo/remoting/transport/mina/MinaClient.java  |  174 +
 .../remoting/transport/mina/MinaCodecAdapter.java  |  167 +
 .../dubbo/remoting/transport/mina/MinaHandler.java |   95 +
 .../dubbo/remoting/transport/mina/MinaServer.java  |  112 +
 .../remoting/transport/mina/MinaTransporter.java   |   40 +
 .../internal/org.apache.dubbo.remoting.Transporter |    1 +
 .../transport/mina/ClientToServerTest.java         |   92 +
 .../remoting/transport/mina/ClientsTest.java       |   65 +
 .../org/apache/remoting/transport/mina/Hello.java  |   45 +
 .../transport/mina/MinaClientToServerTest.java     |   41 +
 .../org/apache/remoting/transport/mina/World.java  |   45 +
 .../remoting/transport/mina/WorldHandler.java      |   36 +
 dubbo-remoting/dubbo-remoting-netty/pom.xml        |   49 +
 .../transport/netty/NettyBackedChannelBuffer.java  |  448 ++
 .../netty/NettyBackedChannelBufferFactory.java     |   56 +
 .../remoting/transport/netty/NettyChannel.java     |  215 +
 .../remoting/transport/netty/NettyClient.java      |  170 +
 .../transport/netty/NettyCodecAdapter.java         |  171 +
 .../remoting/transport/netty/NettyHandler.java     |  129 +
 .../remoting/transport/netty/NettyHelper.java      |  117 +
 .../remoting/transport/netty/NettyServer.java      |  166 +
 .../remoting/transport/netty/NettyTransporter.java |   40 +
 .../internal/org.apache.dubbo.remoting.Transporter |    1 +
 .../support/header/HeartbeatHandlerTest.java       |  154 +
 .../transport/dispatcher/FakeChannelHandlers.java  |   44 +
 .../transport/netty/ClientReconnectTest.java       |   95 +
 .../transport/netty/ClientToServerTest.java        |   91 +
 .../remoting/transport/netty/ClientsTest.java      |   64 +
 .../dubbo/remoting/transport/netty/Hello.java      |   45 +
 .../remoting/transport/netty/NettyClientTest.java  |   81 +
 .../transport/netty/NettyClientToServerTest.java   |   46 +
 .../remoting/transport/netty/NettyStringTest.java  |   66 +
 .../transport/netty/TelnetClientHandler.java       |   36 +
 .../transport/netty/TelnetServerHandler.java       |   46 +
 .../remoting/transport/netty/ThreadNameTest.java   |  136 +
 .../dubbo/remoting/transport/netty/World.java      |   45 +
 .../remoting/transport/netty/WorldHandler.java     |   36 +
 .../src/test/resources/log4j.xml                   |   38 +
 dubbo-remoting/dubbo-remoting-netty4/pom.xml       |   54 +
 .../transport/netty4/NettyBackedChannelBuffer.java |  448 ++
 .../remoting/transport/netty4/NettyChannel.java    |  276 ++
 .../remoting/transport/netty4/NettyClient.java     |  217 +
 .../transport/netty4/NettyClientHandler.java       |  161 +
 .../transport/netty4/NettyCodecAdapter.java        |  101 +
 .../transport/netty4/NettyEventLoopFactory.java    |   60 +
 .../remoting/transport/netty4/NettyServer.java     |  195 +
 .../transport/netty4/NettyServerHandler.java       |  138 +
 .../transport/netty4/NettyTransporter.java         |   43 +
 .../remoting/transport/netty4/SslContexts.java     |  121 +
 .../transport/netty4/SslHandlerInitializer.java    |  141 +
 .../transport/netty4/logging/FormattingTuple.java  |   68 +
 .../transport/netty4/logging/MessageFormatter.java |  410 ++
 .../internal/org.apache.dubbo.remoting.Transporter |    2 +
 .../transport/netty4/ClientReconnectTest.java      |   98 +
 .../transport/netty4/ClientToServerTest.java       |   73 +
 .../remoting/transport/netty4/ClientsTest.java     |   64 +
 .../remoting/transport/netty4/DemoService.java     |   27 +
 .../remoting/transport/netty4/DemoServiceImpl.java |   31 +
 .../dubbo/remoting/transport/netty4/Hello.java     |   45 +
 .../remoting/transport/netty4/MockResult.java      |   37 +
 .../transport/netty4/NettyClientToServerTest.java  |   46 +
 .../transport/netty4/NettyTransporterTest.java     |   71 +
 .../transport/netty4/ReplierDispatcherTest.java    |  153 +
 .../remoting/transport/netty4/RpcMessage.java      |   59 +
 .../transport/netty4/RpcMessageHandler.java        |   77 +
 .../dubbo/remoting/transport/netty4/World.java     |   45 +
 .../remoting/transport/netty4/WorldHandler.java    |   36 +
 dubbo-remoting/dubbo-remoting-p2p/pom.xml          |   45 +
 .../java/org/apache/dubbo/remoting/p2p/Group.java  |   57 +
 .../org/apache/dubbo/remoting/p2p/Networker.java   |   39 +
 .../org/apache/dubbo/remoting/p2p/Networkers.java  |   47 +
 .../java/org/apache/dubbo/remoting/p2p/Peer.java   |   36 +
 .../dubbo/remoting/p2p/exchange/ExchangeGroup.java |   36 +
 .../remoting/p2p/exchange/ExchangeNetworker.java   |   35 +
 .../remoting/p2p/exchange/ExchangeNetworkers.java  |   45 +
 .../dubbo/remoting/p2p/exchange/ExchangePeer.java  |   26 +
 .../exchange/support/AbstractExchangeGroup.java    |  128 +
 .../p2p/exchange/support/ExchangeServerPeer.java   |  137 +
 .../p2p/exchange/support/FileExchangeGroup.java    |  135 +
 .../exchange/support/FileExchangeNetworker.java    |   34 +
 .../exchange/support/MulticastExchangeGroup.java   |  108 +
 .../support/MulticastExchangeNetworker.java        |   34 +
 .../dubbo/remoting/p2p/support/AbstractGroup.java  |  119 +
 .../dubbo/remoting/p2p/support/FileGroup.java      |  133 +
 .../dubbo/remoting/p2p/support/FileNetworker.java  |   34 +
 .../dubbo/remoting/p2p/support/MulticastGroup.java |  108 +
 .../remoting/p2p/support/MulticastNetworker.java   |   34 +
 .../dubbo/remoting/p2p/support/ServerPeer.java     |  124 +
 .../org.apache.dubbo.remoting.p2p.Networker        |    2 +
 .../support/MulticastExchangeNetworkerTest.java    |   81 +
 .../remoting/p2p/support/FileNetworkerTest.java    |   83 +
 .../p2p/support/MulticastNetworkerTest.java        |   70 +
 dubbo-remoting/dubbo-remoting-zookeeper/pom.xml    |   57 +
 .../dubbo/remoting/zookeeper/ChildListener.java    |   25 +
 .../dubbo/remoting/zookeeper/DataListener.java     |   25 +
 .../apache/dubbo/remoting/zookeeper/EventType.java |   65 +
 .../dubbo/remoting/zookeeper/StateListener.java    |   33 +
 .../dubbo/remoting/zookeeper/ZookeeperClient.java  |   65 +
 .../remoting/zookeeper/ZookeeperTransporter.java   |   30 +
 .../zookeeper/curator/CuratorZookeeperClient.java  |  398 ++
 .../curator/CuratorZookeeperTransporter.java       |   30 +
 .../zookeeper/support/AbstractZookeeperClient.java |  226 +
 .../support/AbstractZookeeperTransporter.java      |  182 +
 ...e.dubbo.remoting.zookeeper.ZookeeperTransporter |    1 +
 .../curator/CuratorZookeeperClientTest.java        |  195 +
 .../curator/CuratorZookeeperTransporterTest.java   |   57 +
 .../support/AbstractZookeeperTransporterTest.java  |  225 +
 dubbo-remoting/pom.xml                             |   44 +
 dubbo-rpc/dubbo-rpc-api/pom.xml                    |   54 +
 .../com/alibaba/dubbo/rpc/service/EchoService.java |   22 +
 .../dubbo/rpc/service/GenericException.java        |   62 +
 .../alibaba/dubbo/rpc/service/GenericService.java  |   26 +
 .../java/org/apache/dubbo/rpc/AppResponse.java     |  245 +
 .../java/org/apache/dubbo/rpc/AsyncContext.java    |   77 +
 .../org/apache/dubbo/rpc/AsyncContextImpl.java     |   78 +
 .../java/org/apache/dubbo/rpc/AsyncRpcResult.java  |  337 ++
 .../org/apache/dubbo/rpc/AttachmentsAdapter.java   |   72 +
 .../main/java/org/apache/dubbo/rpc/Constants.java  |   92 +
 .../main/java/org/apache/dubbo/rpc/Exporter.java   |   44 +
 .../org/apache/dubbo/rpc/ExporterListener.java     |   45 +
 .../src/main/java/org/apache/dubbo/rpc/Filter.java |   57 +
 .../java/org/apache/dubbo/rpc/FutureContext.java   |  108 +
 .../main/java/org/apache/dubbo/rpc/Invocation.java |  139 +
 .../main/java/org/apache/dubbo/rpc/InvokeMode.java |   23 +
 .../main/java/org/apache/dubbo/rpc/Invoker.java    |   46 +
 .../java/org/apache/dubbo/rpc/InvokerListener.java |   44 +
 .../org/apache/dubbo/rpc/ListenableFilter.java     |   53 +
 .../main/java/org/apache/dubbo/rpc/Protocol.java   |   90 +
 .../java/org/apache/dubbo/rpc/ProtocolServer.java  |   47 +
 .../java/org/apache/dubbo/rpc/ProxyFactory.java    |   61 +
 .../src/main/java/org/apache/dubbo/rpc/Result.java |  189 +
 .../java/org/apache/dubbo/rpc/RpcConstants.java    |   37 +
 .../main/java/org/apache/dubbo/rpc/RpcContext.java |  798 +++
 .../java/org/apache/dubbo/rpc/RpcException.java    |  117 +
 .../java/org/apache/dubbo/rpc/RpcInvocation.java   |  433 ++
 .../main/java/org/apache/dubbo/rpc/RpcStatus.java  |  309 ++
 .../org/apache/dubbo/rpc/TimeoutCountDown.java     |   90 +
 .../java/org/apache/dubbo/rpc/ZoneDetector.java    |   32 +
 .../apache/dubbo/rpc/filter/AccessLogFilter.java   |  207 +
 .../apache/dubbo/rpc/filter/ActiveLimitFilter.java |  122 +
 .../apache/dubbo/rpc/filter/ClassLoaderFilter.java |   44 +
 .../apache/dubbo/rpc/filter/CompatibleFilter.java  |   92 +
 .../dubbo/rpc/filter/ConsumerContextFilter.java    |   72 +
 .../org/apache/dubbo/rpc/filter/ContextFilter.java |  148 +
 .../apache/dubbo/rpc/filter/DeprecatedFilter.java  |   78 +
 .../org/apache/dubbo/rpc/filter/EchoFilter.java    |   44 +
 .../apache/dubbo/rpc/filter/ExceptionFilter.java   |  115 +
 .../dubbo/rpc/filter/ExecuteLimitFilter.java       |   86 +
 .../org/apache/dubbo/rpc/filter/GenericFilter.java |  215 +
 .../apache/dubbo/rpc/filter/GenericImplFilter.java |  230 +
 .../org/apache/dubbo/rpc/filter/TimeoutFilter.java |   69 +
 .../org/apache/dubbo/rpc/filter/TokenFilter.java   |   57 +
 .../apache/dubbo/rpc/filter/TpsLimitFilter.java    |   59 +
 .../dubbo/rpc/filter/tps/DefaultTPSLimiter.java    |   67 +
 .../org/apache/dubbo/rpc/filter/tps/StatItem.java  |   92 +
 .../apache/dubbo/rpc/filter/tps/TPSLimiter.java    |   41 +
 .../rpc/listener/DeprecatedInvokerListener.java    |   42 +
 .../rpc/listener/ExporterListenerAdapter.java      |   36 +
 .../dubbo/rpc/listener/InvokerListenerAdapter.java |   36 +
 .../rpc/listener/ListenerExporterWrapper.java      |   92 +
 .../dubbo/rpc/listener/ListenerInvokerWrapper.java |  105 +
 .../dubbo/rpc/protocol/AbstractExporter.java       |   67 +
 .../apache/dubbo/rpc/protocol/AbstractInvoker.java |  198 +
 .../dubbo/rpc/protocol/AbstractProtocol.java       |  116 +
 .../dubbo/rpc/protocol/AbstractProxyProtocol.java  |  275 ++
 .../dubbo/rpc/protocol/AsyncToSyncInvoker.java     |  102 +
 .../apache/dubbo/rpc/protocol/InvokerWrapper.java  |   64 +
 .../dubbo/rpc/protocol/ProtocolFilterWrapper.java  |  176 +
 .../rpc/protocol/ProtocolListenerWrapper.java      |   90 +
 .../dubbo/rpc/protocol/dubbo/FutureAdapter.java    |   99 +
 .../dubbo/rpc/protocol/dubbo/package-info.java     |   22 +
 .../dubbo/rpc/proxy/AbstractProxyFactory.java      |   84 +
 .../dubbo/rpc/proxy/AbstractProxyInvoker.java      |  127 +
 .../dubbo/rpc/proxy/InvokerInvocationHandler.java  |   76 +
 .../rpc/proxy/javassist/JavassistProxyFactory.java |   52 +
 .../dubbo/rpc/proxy/jdk/JdkProxyFactory.java       |   52 +
 .../rpc/proxy/wrapper/StubProxyFactoryWrapper.java |  126 +
 .../apache/dubbo/rpc/support/AccessLogData.java    |  266 +
 .../org/apache/dubbo/rpc/support/MockInvoker.java  |  285 ++
 .../org/apache/dubbo/rpc/support/MockProtocol.java |   44 +
 .../org/apache/dubbo/rpc/support/RpcUtils.java     |  253 +
 .../dubbo/internal/org.apache.dubbo.rpc.Filter     |   14 +
 .../internal/org.apache.dubbo.rpc.InvokerListener  |    1 +
 .../dubbo/internal/org.apache.dubbo.rpc.Protocol   |    3 +
 .../internal/org.apache.dubbo.rpc.ProxyFactory     |    3 +
 .../java/org/apache/dubbo/rpc/AppResponseTest.java |  127 +
 .../java/org/apache/dubbo/rpc/CustomArgument.java  |   52 +
 .../java/org/apache/dubbo/rpc/DemoRequest.java     |   58 +
 .../org/apache/dubbo/rpc/FutureContextTest.java    |   53 +
 .../java/org/apache/dubbo/rpc/RpcContextTest.java  |  205 +
 .../org/apache/dubbo/rpc/RpcInvocationTest.java    |   46 +
 .../dubbo/rpc/filter/AccessLogFilterTest.java      |   85 +
 .../dubbo/rpc/filter/ActiveLimitFilterTest.java    |  226 +
 .../dubbo/rpc/filter/ClassLoaderFilterTest.java    |   70 +
 .../rpc/filter/CompatibleFilterFilterTest.java     |  174 +
 .../apache/dubbo/rpc/filter/ContextFilterTest.java |   76 +
 .../dubbo/rpc/filter/DeprecatedFilterTest.java     |   49 +
 .../apache/dubbo/rpc/filter/EchoFilterTest.java    |   80 +
 .../dubbo/rpc/filter/ExceptionFilterTest.java      |  139 +
 .../dubbo/rpc/filter/ExecuteLimitFilterTest.java   |  132 +
 .../apache/dubbo/rpc/filter/GenericFilterTest.java |  148 +
 .../dubbo/rpc/filter/GenericImplFilterTest.java    |  120 +
 .../apache/dubbo/rpc/filter/TimeoutFilterTest.java |   66 +
 .../apache/dubbo/rpc/filter/TokenFilterTest.java   |   94 +
 .../rpc/filter/tps/DefaultTPSLimiterTest.java      |   78 +
 .../apache/dubbo/rpc/filter/tps/StatItemTest.java  |   45 +
 .../dubbo/rpc/filter/tps/TpsLimitFilterTest.java   |   67 +
 .../apache/dubbo/rpc/proxy/AbstractProxyTest.java  |   73 +
 .../org/apache/dubbo/rpc/proxy/DemoRequest.java    |   58 +
 .../org/apache/dubbo/rpc/proxy/DemoService.java    |   37 +
 .../apache/dubbo/rpc/proxy/DemoServiceImpl.java    |   72 +
 .../rpc/proxy/InvokerInvocationHandlerTest.java    |   54 +
 .../org/apache/dubbo/rpc/proxy/RemoteService.java  |   26 +
 .../apache/dubbo/rpc/proxy/RemoteServiceImpl.java  |   32 +
 .../test/java/org/apache/dubbo/rpc/proxy/Type.java |   21 +
 .../proxy/javassist/JavassistProxyFactoryTest.java |   27 +
 .../dubbo/rpc/proxy/jdk/JdkProxyFactoryTest.java   |   27 +
 .../apache/dubbo/rpc/support/BlockMyInvoker.java   |   63 +
 .../org/apache/dubbo/rpc/support/DemoService.java  |   66 +
 .../apache/dubbo/rpc/support/DemoServiceImpl.java  |  128 +
 .../java/org/apache/dubbo/rpc/support/IEcho.java   |   21 +
 .../apache/dubbo/rpc/support/LocalException.java   |   26 +
 .../apache/dubbo/rpc/support/MockInvocation.java   |  152 +
 .../apache/dubbo/rpc/support/MockInvokerTest.java  |  140 +
 .../org/apache/dubbo/rpc/support/MyInvoker.java    |   84 +
 .../java/org/apache/dubbo/rpc/support/Person.java  |   52 +
 .../org/apache/dubbo/rpc/support/RpcUtilsTest.java |  316 ++
 .../dubbo/rpc/support/RuntimeExceptionInvoker.java |   35 +
 .../java/org/apache/dubbo/rpc/support/Type.java    |   21 +
 .../dubbo-rpc-api/src/test/resources/log4j.xml     |   38 +
 dubbo-rpc/dubbo-rpc-dubbo/pom.xml                  |  105 +
 .../rpc/protocol/dubbo/CallbackServiceCodec.java   |  315 ++
 .../rpc/protocol/dubbo/ChannelWrappedInvoker.java  |  183 +
 .../apache/dubbo/rpc/protocol/dubbo/Constants.java |   71 +
 .../protocol/dubbo/DecodeableRpcInvocation.java    |  183 +
 .../rpc/protocol/dubbo/DecodeableRpcResult.java    |  172 +
 .../dubbo/rpc/protocol/dubbo/DubboCodec.java       |  216 +
 .../dubbo/rpc/protocol/dubbo/DubboCountCodec.java  |   86 +
 .../dubbo/rpc/protocol/dubbo/DubboExporter.java    |   46 +
 .../dubbo/rpc/protocol/dubbo/DubboInvoker.java     |  180 +
 .../dubbo/rpc/protocol/dubbo/DubboProtocol.java    |  685 +++
 .../rpc/protocol/dubbo/DubboProtocolServer.java    |   62 +
 .../protocol/dubbo/LazyConnectExchangeClient.java  |  269 +
 .../dubbo/ReferenceCountExchangeClient.java        |  213 +
 .../rpc/protocol/dubbo/filter/FutureFilter.java    |  208 +
 .../rpc/protocol/dubbo/filter/TraceFilter.java     |  127 +
 .../protocol/dubbo/status/ServerStatusChecker.java |   61 +
 .../dubbo/status/ThreadPoolStatusChecker.java      |   67 +
 .../org.apache.dubbo.common.status.StatusChecker   |    2 +
 .../internal/org.apache.dubbo.remoting.Codec2      |    1 +
 .../dubbo/internal/org.apache.dubbo.rpc.Filter     |    2 +
 .../dubbo/internal/org.apache.dubbo.rpc.Protocol   |    1 +
 .../rpc/protocol/dubbo/ArgumentCallbackTest.java   |  362 ++
 .../protocol/dubbo/DubboInvokerAvilableTest.java   |  175 +
 .../rpc/protocol/dubbo/DubboLazyConnectTest.java   |   93 +
 .../rpc/protocol/dubbo/DubboProtocolTest.java      |  231 +
 .../dubbo/rpc/protocol/dubbo/FutureFilterTest.java |   85 +
 .../dubbo/rpc/protocol/dubbo/IDemoService.java     |   21 +
 .../rpc/protocol/dubbo/ImplicitCallBackTest.java   |  406 ++
 .../dubbo/rpc/protocol/dubbo/MultiThreadTest.java  |   81 +
 .../dubbo/ReferenceCountExchangeClientTest.java    |  320 ++
 .../dubbo/rpc/protocol/dubbo/RpcFilterTest.java    |   59 +
 .../dubbo/decode/DubboTelnetDecodeTest.java        |  503 ++
 .../dubbo/decode/LocalEmbeddedChannel.java         |   35 +
 .../rpc/protocol/dubbo/decode/MockChannel.java     |  115 +
 .../protocol/dubbo/decode/MockChannelHandler.java  |   61 +
 .../rpc/protocol/dubbo/decode/MockHandler.java     |   40 +
 .../dubbo/decode/telnet/TestTelnetHandler.java     |   35 +
 .../rpc/protocol/dubbo/support/CustomArgument.java |   51 +
 .../rpc/protocol/dubbo/support/DemoRequest.java    |   58 +
 .../rpc/protocol/dubbo/support/DemoService.java    |   69 +
 .../protocol/dubbo/support/DemoServiceImpl.java    |  129 +
 .../dubbo/rpc/protocol/dubbo/support/EnumBak.java  |  201 +
 .../dubbo/rpc/protocol/dubbo/support/Man.java      |   46 +
 .../rpc/protocol/dubbo/support/NonSerialized.java  |   24 +
 .../dubbo/rpc/protocol/dubbo/support/Person.java   |   45 +
 .../rpc/protocol/dubbo/support/ProtocolUtils.java  |   65 +
 .../rpc/protocol/dubbo/support/RemoteService.java  |   26 +
 .../protocol/dubbo/support/RemoteServiceImpl.java  |   32 +
 .../dubbo/rpc/protocol/dubbo/support/Type.java     |   21 +
 .../org.apache.dubbo.remoting.telnet.TelnetHandler |    1 +
 .../dubbo-rpc-dubbo/src/test/resources/log4j.xml   |   38 +
 dubbo-rpc/dubbo-rpc-grpc/pom.xml                   |   68 +
 .../rpc/protocol/grpc/DubboHandlerRegistry.java    |   70 +
 .../apache/dubbo/rpc/protocol/grpc/GrpcConfig.java |   21 +
 .../dubbo/rpc/protocol/grpc/GrpcConstants.java     |   41 +
 .../dubbo/rpc/protocol/grpc/GrpcInvoker.java       |  118 +
 .../dubbo/rpc/protocol/grpc/GrpcOptionsUtils.java  |  225 +
 .../dubbo/rpc/protocol/grpc/GrpcProtocol.java      |  239 +
 .../grpc/ReferenceCountManagedChannel.java         |   85 +
 .../grpc/interceptors/ClientInterceptor.java       |   26 +
 .../grpc/interceptors/GrpcConfigurator.java        |   41 +
 .../grpc/interceptors/RpcContextInterceptor.java   |  100 +
 .../grpc/interceptors/ServerInterceptor.java       |   26 +
 .../grpc/interceptors/ServerTransportFilter.java   |   27 +
 .../dubbo/internal/org.apache.dubbo.rpc.Protocol   |    1 +
 ...pc.protocol.grpc.interceptors.ClientInterceptor |    1 +
 ...pc.protocol.grpc.interceptors.ServerInterceptor |    1 +
 dubbo-rpc/dubbo-rpc-hessian/pom.xml                |   63 +
 .../dubbo/rpc/protocol/hessian/Constants.java      |   35 +
 .../hessian/DubboHessianURLConnectionFactory.java  |   41 +
 .../rpc/protocol/hessian/HessianProtocol.java      |  202 +
 .../rpc/protocol/hessian/HttpClientConnection.java |   99 +
 .../hessian/HttpClientConnectionFactory.java       |   58 +
 .../dubbo/internal/org.apache.dubbo.rpc.Protocol   |    1 +
 .../rpc/protocol/hessian/HessianProtocolTest.java  |  250 +
 .../dubbo/rpc/protocol/hessian/HessianService.java |   37 +
 .../rpc/protocol/hessian/HessianServiceImpl.java   |   75 +
 dubbo-rpc/dubbo-rpc-http/pom.xml                   |   62 +
 .../dubbo/rpc/protocol/http/HttpProtocol.java      |  191 +
 .../rpc/protocol/http/HttpProtocolErrorCode.java   |   29 +
 .../rpc/protocol/http/JsonRemoteInvocation.java    |   61 +
 .../rpc/protocol/http/JsonRpcProxyFactoryBean.java |   86 +
 .../dubbo/internal/org.apache.dubbo.rpc.Protocol   |    1 +
 .../dubbo/rpc/protocol/http/HttpProtocolTest.java  |   92 +
 .../dubbo/rpc/protocol/http/HttpService.java       |   27 +
 .../dubbo/rpc/protocol/http/HttpServiceImpl.java   |   58 +
 dubbo-rpc/dubbo-rpc-injvm/pom.xml                  |   39 +
 .../dubbo/rpc/protocol/injvm/InjvmExporter.java    |   47 +
 .../dubbo/rpc/protocol/injvm/InjvmInvoker.java     |   65 +
 .../dubbo/rpc/protocol/injvm/InjvmProtocol.java    |  120 +
 .../dubbo/internal/org.apache.dubbo.rpc.Protocol   |    1 +
 .../dubbo/rpc/protocol/injvm/DemoRequest.java      |   58 +
 .../dubbo/rpc/protocol/injvm/DemoService.java      |   44 +
 .../dubbo/rpc/protocol/injvm/DemoServiceImpl.java  |   78 +
 .../org/apache/dubbo/rpc/protocol/injvm/IEcho.java |   21 +
 .../rpc/protocol/injvm/InjvmProtocolTest.java      |  126 +
 .../dubbo/rpc/protocol/injvm/ProtocolTest.java     |   72 +
 .../org/apache/dubbo/rpc/protocol/injvm/Type.java  |   21 +
 dubbo-rpc/dubbo-rpc-memcached/pom.xml              |   43 +
 .../rpc/protocol/memcached/MemcachedProtocol.java  |  122 +
 .../dubbo/internal/org.apache.dubbo.rpc.Protocol   |    1 +
 .../protocol/memcached/MemcachedProtocolTest.java  |   21 +
 dubbo-rpc/dubbo-rpc-native-thrift/pom.xml          |   50 +
 .../rpc/protocol/nativethrift/ThriftProtocol.java  |  189 +
 .../dubbo/internal/org.apache.dubbo.rpc.Protocol   |    1 +
 .../src/test/idls/DemoService.thrift               |   17 +
 .../src/test/idls/UserService.thrift               |    6 +
 .../rpc/protocol/nativethrift/DemoService.java     | 5141 ++++++++++++++++++++
 .../rpc/protocol/nativethrift/DemoServiceImpl.java |   78 +
 .../protocol/nativethrift/ThriftProtocolTest.java  |   84 +
 .../rpc/protocol/nativethrift/UserService.java     |  952 ++++
 .../rpc/protocol/nativethrift/UserServiceImpl.java |   24 +
 dubbo-rpc/dubbo-rpc-redis/pom.xml                  |   59 +
 .../dubbo/rpc/protocol/redis/RedisProtocol.java    |  187 +
 .../dubbo/internal/org.apache.dubbo.rpc.Protocol   |    1 +
 .../dubbo/rpc/protocol/redis/IDemoService.java     |   29 +
 .../rpc/protocol/redis/RedisProtocolTest.java      |  230 +
 ...org.apache.dubbo.common.serialize.Serialization |    1 +
 dubbo-rpc/dubbo-rpc-rest/pom.xml                   |  116 +
 .../rpc/protocol/rest/BaseRestProtocolServer.java  |   80 +
 .../apache/dubbo/rpc/protocol/rest/Constants.java  |   29 +
 .../rpc/protocol/rest/DubboHttpProtocolServer.java |  131 +
 .../rpc/protocol/rest/DubboResourceFactory.java    |   76 +
 .../rpc/protocol/rest/NettyRestProtocolServer.java |   73 +
 .../rpc/protocol/rest/RestConstraintViolation.java |   66 +
 .../dubbo/rpc/protocol/rest/RestProtocol.java      |  295 ++
 .../rpc/protocol/rest/RestProtocolServer.java      |   33 +
 .../dubbo/rpc/protocol/rest/RestServerFactory.java |   44 +
 .../dubbo/rpc/protocol/rest/RpcContextFilter.java  |  106 +
 .../rpc/protocol/rest/RpcExceptionMapper.java      |   51 +
 .../dubbo/rpc/protocol/rest/ViolationReport.java   |   48 +
 .../swagger/DubboSwaggerApiListingResource.java    |   48 +
 .../integration/swagger/DubboSwaggerService.java   |   43 +
 .../rpc/protocol/rest/support/ContentType.java     |   26 +
 .../rpc/protocol/rest/support/LoggingFilter.java   |  148 +
 .../dubbo/internal/org.apache.dubbo.rpc.Protocol   |    1 +
 .../dubbo/rpc/protocol/rest/DemoService.java       |   45 +
 .../dubbo/rpc/protocol/rest/DemoServiceImpl.java   |   57 +
 .../dubbo/rpc/protocol/rest/RestProtocolTest.java  |  282 ++
 .../rpc/protocol/rest/RpcExceptionMapperTest.java  |   67 +
 .../DubboSwaggerApiListingResourceTest.java        |   62 +
 .../rest/integration/swagger/SwaggerService.java   |   34 +
 dubbo-rpc/dubbo-rpc-rmi/pom.xml                    |   43 +
 .../rpc/protocol/rmi/RmiRemoteInvocation.java      |   39 +
 .../apache/dubbo/rpc/protocol/rmi/RmiProtocol.java |  154 +
 .../rpc/protocol/rmi/RmiRemoteInvocation.java      |   64 +
 .../dubbo/internal/org.apache.dubbo.rpc.Protocol   |    1 +
 .../apache/dubbo/rpc/protocol/rmi/DemoService.java |   47 +
 .../dubbo/rpc/protocol/rmi/DemoServiceImpl.java    |   89 +
 .../dubbo/rpc/protocol/rmi/RemoteService.java      |   26 +
 .../dubbo/rpc/protocol/rmi/RemoteServiceImpl.java  |   32 +
 .../dubbo/rpc/protocol/rmi/RmiProtocolTest.java    |  227 +
 .../org/apache/dubbo/rpc/protocol/rmi/Type.java    |   21 +
 dubbo-rpc/dubbo-rpc-thrift/pom.xml                 |   74 +
 .../rpc/protocol/thrift/ClassNameGenerator.java    |   31 +
 .../protocol/thrift/DubboClassNameGenerator.java   |   36 +
 .../protocol/thrift/ThriftClassNameGenerator.java  |   36 +
 .../dubbo/rpc/protocol/thrift/ThriftCodec.java     |  697 +++
 .../dubbo/rpc/protocol/thrift/ThriftConstants.java |   32 +
 .../dubbo/rpc/protocol/thrift/ThriftInvoker.java   |  171 +
 .../rpc/protocol/thrift/ThriftNativeCodec.java     |   96 +
 .../dubbo/rpc/protocol/thrift/ThriftProtocol.java  |  272 ++
 .../dubbo/rpc/protocol/thrift/ThriftType.java      |   51 +
 .../dubbo/rpc/protocol/thrift/ThriftUtils.java     |  135 +
 .../protocol/thrift/ext/MultiServiceProcessor.java |  121 +
 .../rpc/protocol/thrift/io/InputStreamWrapper.java |   88 +
 .../io/RandomAccessByteArrayOutputStream.java      |  117 +
 .../internal/org.apache.dubbo.remoting.Codec2      |    1 +
 .../dubbo/internal/org.apache.dubbo.rpc.Protocol   |    1 +
 ...he.dubbo.rpc.protocol.thrift.ClassNameGenerator |    2 +
 .../src/test/java/$__ClassNameTestDubboStub.java   |  681 +++
 .../src/test/java/ClassNameTest.java               |   45 +
 .../src/test/java/ClassNameTestDubbo.java          |   29 +
 .../src/test/java/ClassNameTestThrift.java         |  767 +++
 .../apache/dubbo/rpc/gen/dubbo/$__DemoStub.java    | 4347 +++++++++++++++++
 .../java/org/apache/dubbo/rpc/gen/dubbo/Demo.java  |   42 +
 .../java/org/apache/dubbo/rpc/gen/thrift/Demo.java | 4753 ++++++++++++++++++
 .../dubbo/rpc/protocol/thrift/AbstractTest.java    |  150 +
 .../apache/dubbo/rpc/protocol/thrift/DemoImpl.java |   56 +
 .../dubbo/rpc/protocol/thrift/DubboDemoImpl.java   |   23 +
 .../protocol/thrift/FramedTransportFactory.java    |   30 +
 .../dubbo/rpc/protocol/thrift/MockedChannel.java   |  116 +
 .../rpc/protocol/thrift/ServerExceptionTest.java   |  100 +
 .../protocol/thrift/ServiceMethodNotFoundTest.java |  146 +
 .../dubbo/rpc/protocol/thrift/ThriftCodecTest.java |  477 ++
 .../dubbo/rpc/protocol/thrift/ThriftDemoImpl.java  |   22 +
 .../rpc/protocol/thrift/ThriftProtocolTest.java    |   87 +
 .../dubbo/rpc/protocol/thrift/ThriftUtilsTest.java |   88 +
 .../thrift/examples/DubboDemoConsumer.java         |   36 +
 .../thrift/examples/DubboDemoProvider.java         |   31 +
 .../src/test/resources/dubbo-demo-consumer.xml     |   32 +
 .../src/test/resources/dubbo-demo-provider.xml     |   34 +
 .../src/test/thrift/ClassNameTestDubbo.thrift      |    3 +
 .../src/test/thrift/ClassNameTestThrift.thrift     |    3 +
 .../dubbo-rpc-thrift/src/test/thrift/Demo.thrift   |   16 +
 dubbo-rpc/dubbo-rpc-webservice/pom.xml             |   77 +
 .../protocol/webservice/WebServiceProtocol.java    |  204 +
 .../dubbo/internal/org.apache.dubbo.rpc.Protocol   |    1 +
 .../dubbo/rpc/protocol/webservice/DemoService.java |   43 +
 .../rpc/protocol/webservice/DemoServiceImpl.java   |   80 +
 .../apache/dubbo/rpc/protocol/webservice/User.java |   38 +
 .../webservice/WebserviceProtocolTest.java         |   77 +
 dubbo-rpc/dubbo-rpc-xml/README.md                  |   88 +
 dubbo-rpc/dubbo-rpc-xml/pom.xml                    |   67 +
 .../xml/rpc/protocol/xmlrpc/XmlRpcProtocol.java    |  196 +
 .../protocol/xmlrpc/XmlRpcProxyFactoryBean.java    |  142 +
 .../org.apache.dubbo.remoting.http.HttpBinder      |    1 +
 .../dubbo/internal/org.apache.dubbo.rpc.Protocol   |    1 +
 .../rpc/protocol/xmlrpc/XmlRpcProtocolTest.java    |   90 +
 .../xml/rpc/protocol/xmlrpc/XmlRpcService.java     |   25 +
 .../xml/rpc/protocol/xmlrpc/XmlRpcServiceImpl.java |   51 +
 dubbo-rpc/pom.xml                                  |   48 +
 .../dubbo-serialization-api/pom.xml                |   40 +
 .../apache/dubbo/common/serialize/Cleanable.java   |   28 +
 .../apache/dubbo/common/serialize/Constants.java   |   36 +
 .../apache/dubbo/common/serialize/DataInput.java   |   97 +
 .../apache/dubbo/common/serialize/DataOutput.java  |  114 +
 .../apache/dubbo/common/serialize/ObjectInput.java |   89 +
 .../dubbo/common/serialize/ObjectOutput.java       |   60 +
 .../dubbo/common/serialize/Serialization.java      |   76 +
 .../support/SerializableClassRegistry.java         |   61 +
 .../serialize/support/SerializationOptimizer.java  |   32 +
 .../dubbo-serialization-avro/pom.xml               |   45 +
 .../common/serialize/avro/AvroObjectInput.java     |  118 +
 .../common/serialize/avro/AvroObjectOutput.java    |  106 +
 .../common/serialize/avro/AvroSerialization.java   |   52 +
 ...org.apache.dubbo.common.serialize.Serialization |    1 +
 .../dubbo-serialization-fastjson/pom.xml           |   44 +
 .../serialize/fastjson/FastJsonObjectInput.java    |  121 +
 .../serialize/fastjson/FastJsonObjectOutput.java   |  113 +
 .../serialize/fastjson/FastJsonSerialization.java  |   59 +
 ...org.apache.dubbo.common.serialize.Serialization |    1 +
 .../dubbo-serialization-fst/pom.xml                |   43 +
 .../dubbo/common/serialize/fst/FstFactory.java     |   53 +
 .../dubbo/common/serialize/fst/FstObjectInput.java |  117 +
 .../common/serialize/fst/FstObjectOutput.java      |  106 +
 .../common/serialize/fst/FstSerialization.java     |   58 +
 ...org.apache.dubbo.common.serialize.Serialization |    1 +
 .../dubbo-serialization-gson/pom.xml               |   43 +
 .../common/serialize/gson/GsonJsonObjectInput.java |  121 +
 .../serialize/gson/GsonJsonObjectOutput.java       |  108 +
 .../common/serialize/gson/GsonSerialization.java   |   53 +
 ...org.apache.dubbo.common.serialize.Serialization |    1 +
 .../serialize/gson/GsonJsonObjectOutputTest.java   |  143 +
 .../serialize/gson/GsonJsonSerializationTest.java  |   64 +
 .../apache/dubbo/common/serialize/gson/Image.java  |  120 +
 .../dubbo-serialization-hessian2/pom.xml           |   44 +
 .../serialize/hessian2/Hessian2ObjectInput.java    |  111 +
 .../serialize/hessian2/Hessian2ObjectOutput.java   |  108 +
 .../serialize/hessian2/Hessian2Serialization.java  |   59 +
 .../hessian2/Hessian2SerializerFactory.java        |   33 +
 ...org.apache.dubbo.common.serialize.Serialization |    1 +
 .../dubbo-serialization-jdk/pom.xml                |   44 +
 .../serialize/java/CompactedJavaSerialization.java |   59 +
 .../serialize/java/CompactedObjectInputStream.java |   64 +
 .../java/CompactedObjectOutputStream.java          |   43 +
 .../common/serialize/java/JavaObjectInput.java     |   91 +
 .../common/serialize/java/JavaObjectOutput.java    |   61 +
 .../common/serialize/java/JavaSerialization.java   |   59 +
 .../nativejava/NativeJavaObjectInput.java          |  118 +
 .../nativejava/NativeJavaObjectOutput.java         |  115 +
 .../nativejava/NativeJavaSerialization.java        |   60 +
 ...org.apache.dubbo.common.serialize.Serialization |    3 +
 .../dubbo-serialization-kryo/pom.xml               |   48 +
 .../common/serialize/kryo/CompatibleKryo.java      |   54 +
 .../common/serialize/kryo/KryoObjectInput.java     |  162 +
 .../common/serialize/kryo/KryoObjectOutput.java    |  118 +
 .../common/serialize/kryo/KryoSerialization.java   |   58 +
 .../serialize/kryo/optimized/KryoObjectInput2.java |  168 +
 .../kryo/optimized/KryoObjectOutput2.java          |  122 +
 .../kryo/optimized/KryoSerialization2.java         |   57 +
 .../serialize/kryo/utils/AbstractKryoFactory.java  |  158 +
 .../common/serialize/kryo/utils/KryoUtils.java     |   44 +
 .../serialize/kryo/utils/PooledKryoFactory.java    |   40 +
 .../serialize/kryo/utils/PrototypeKryoFactory.java |   32 +
 .../serialize/kryo/utils/ReflectionUtils.java      |   33 +
 .../kryo/utils/ThreadLocalKryoFactory.java         |   39 +
 ...org.apache.dubbo.common.serialize.Serialization |    2 +
 .../dubbo-serialization-native-hession/pom.xml     |   43 +
 .../serialize/hessian/Hessian2ObjectInput.java     |   98 +
 .../serialize/hessian/Hessian2ObjectOutput.java    |   95 +
 .../serialize/hessian/Hessian2Serialization.java   |   53 +
 .../hessian/Hessian2SerializerFactory.java         |   42 +
 .../serialize/hessian/Java8SerializerFactory.java  |   88 +
 .../hessian/serializer/java8/DurationHandle.java   |   53 +
 .../hessian/serializer/java8/InstantHandle.java    |   54 +
 .../serializer/java8/Java8TimeSerializer.java      |   57 +
 .../hessian/serializer/java8/LocalDateHandle.java  |   55 +
 .../serializer/java8/LocalDateTimeHandle.java      |   55 +
 .../hessian/serializer/java8/LocalTimeHandle.java  |   57 +
 .../hessian/serializer/java8/MonthDayHandle.java   |   53 +
 .../serializer/java8/OffsetDateTimeHandle.java     |   55 +
 .../hessian/serializer/java8/OffsetTimeHandle.java |   55 +
 .../hessian/serializer/java8/PeriodHandle.java     |   56 +
 .../hessian/serializer/java8/YearHandle.java       |   52 +
 .../hessian/serializer/java8/YearMonthHandle.java  |   53 +
 .../hessian/serializer/java8/ZoneIdHandle.java     |   52 +
 .../hessian/serializer/java8/ZoneIdSerializer.java |   43 +
 .../hessian/serializer/java8/ZoneOffsetHandle.java |   51 +
 .../serializer/java8/ZonedDateTimeHandle.java      |   62 +
 ...org.apache.dubbo.common.serialize.Serialization |    1 +
 .../serialize/hessian/Java8TimeSerializerTest.java |  150 +
 .../dubbo-serialization-protobuf/pom.xml           |   97 +
 .../support/GenericProtobufJsonObjectInput.java    |  164 +
 .../support/GenericProtobufJsonObjectOutput.java   |  161 +
 .../support/GenericProtobufJsonSerialization.java  |   54 +
 .../support/GenericProtobufObjectInput.java        |  146 +
 .../support/GenericProtobufObjectOutput.java       |  157 +
 .../support/GenericProtobufSerialization.java      |   63 +
 .../serialize/protobuf/support/ProtobufUtils.java  |  206 +
 .../protobuf/support/ProtobufWrappedException.java |   68 +
 .../src/main/proto/MapValue.proto                  |   27 +
 .../src/main/proto/ThrowablePB.proto               |   64 +
 ...org.apache.dubbo.common.serialize.Serialization |    2 +
 .../dubbo-serialization-protostuff/pom.xml         |   54 +
 .../protostuff/ProtostuffObjectInput.java          |  136 +
 .../protostuff/ProtostuffObjectOutput.java         |  130 +
 .../protostuff/ProtostuffSerialization.java        |   58 +
 .../dubbo/common/serialize/protostuff/Wrapper.java |   33 +
 .../protostuff/delegate/SqlDateDelegate.java       |   55 +
 .../protostuff/delegate/TimeDelegate.java          |   57 +
 .../protostuff/delegate/TimestampDelegate.java     |   57 +
 .../serialize/protostuff/utils/WrapperUtils.java   |  115 +
 ...org.apache.dubbo.common.serialize.Serialization |    1 +
 .../dubbo-serialization-test/pom.xml               |   87 +
 .../serialize/avro/AvroObjectInputOutputTest.java  |  196 +
 .../serialize/avro/AvroSerializationTest.java      |   64 +
 .../base/AbstractSerializationPersonFailTest.java  |  141 +
 .../base/AbstractSerializationPersonOkTest.java    |   92 +
 .../serialize/base/AbstractSerializationTest.java  | 1212 +++++
 .../fastjson/FastJsonObjectInputTest.java          |  199 +
 .../fastjson/FastJsonObjectOutputTest.java         |  142 +
 .../fastjson/FastJsonSerializationTest.java        |   62 +
 .../dubbo/common/serialize/fst/FstFactoryTest.java |   32 +
 .../common/serialize/fst/FstObjectInputTest.java   |   51 +
 .../common/serialize/fst/FstObjectOutputTest.java  |  186 +
 .../common/serialize/fst/FstSerializationTest.java |   63 +
 .../serialize/hessian2/Hessian2PersonOkTest.java   |  212 +
 .../hessian2/Hessian2SerializationTest.java        |  210 +
 .../jdk/CompactedJavaSerializationTest.java        |   27 +
 .../serialize/jdk/JavaSerializationTest.java       |   27 +
 .../common/serialize/jdk/JdkPersonOkTest.java      |   30 +
 .../serialize/jdk/NativeJavaSerializationTest.java |   26 +
 .../common/serialize/kryo/KryoPersonOkTest.java    |   29 +
 .../serialize/kryo/KyroSerializationTest.java      |   26 +
 .../common/serialize/kryo/ReflectionUtilsTest.java |   46 +
 .../dubbo/common/serialize/model/AnimalEnum.java   |   21 +
 .../dubbo/common/serialize/model/BizException.java |   29 +
 .../model/BizExceptionNoDefaultConstructor.java    |   26 +
 .../dubbo/common/serialize/model/Organization.java |   30 +
 .../dubbo/common/serialize/model/Person.java       |   95 +
 .../common/serialize/model/SerializablePerson.java |   97 +
 .../dubbo/common/serialize/model/media/Image.java  |  120 +
 .../dubbo/common/serialize/model/media/Media.java  |  205 +
 .../common/serialize/model/media/MediaContent.java |   78 +
 .../common/serialize/model/person/BigPerson.java   |  151 +
 .../common/serialize/model/person/FullAddress.java |  202 +
 .../common/serialize/model/person/PersonInfo.java  |  206 +
 .../serialize/model/person/PersonStatus.java       |   22 +
 .../dubbo/common/serialize/model/person/Phone.java |  139 +
 .../support/AbstractProtobufSerializationTest.java |  372 ++
 .../GenericProtobufJsonObjectOutputTest.java       |  206 +
 .../GenericProtobufJsonSerializationTest.java      |   23 +
 .../support/GenericProtobufSerializationTest.java  |   23 +
 .../serialize/protobuf/support/model/GooglePB.java | 3431 +++++++++++++
 .../protobuf/support/model/ServiceInterface.java   |   21 +
 .../protostuff/ProtostuffObjectOutputTest.java     |  242 +
 .../protostuff/ProtostuffSerializationTest.java    |   27 +
 .../support/SerializableClassRegistryTest.java     |   38 +
 .../src/test/proto/GooglePB.proto                  |   51 +
 .../src/test/resources/log4j.xml                   |   31 +
 .../SimpleDO.fc                                    |    2 +
 dubbo-serialization/pom.xml                        |   46 +
 licenseCheck.sh                                    |  126 +
 mvnw                                               |  227 +
 mvnw.cmd                                           |  143 +
 pom.xml                                            |  691 +++
 2705 files changed, 291814 insertions(+)

diff --git a/.codecov.yml b/.codecov.yml
new file mode 100644
index 0000000..4b49c86
--- /dev/null
+++ b/.codecov.yml
@@ -0,0 +1,11 @@
+coverage:
+  status:
+    # pull-requests only
+    patch:
+      default:
+        threshold: 0.1%
+ignore:
+  - "dubbo-demo/.*"
+  - "dubbo-common/src/main/java/org/apache/dubbo/common/json/*.java" #  internal JSON impl is deprecate, ignore test coverage for them
+  - "dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/AnnotationBean.java" # Deprecated
+  - "dubbo-rpc/dubbo-rpc-thrift/.*"
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/dubbo-issue-report-template.md b/.github/ISSUE_TEMPLATE/dubbo-issue-report-template.md
new file mode 100644
index 0000000..ac82ec8
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/dubbo-issue-report-template.md
@@ -0,0 +1,36 @@
+---
+name: Dubbo issue report template
+about: If you would like to report a issue to Dubbo, please use this template.
+
+---
+
+- [ ] I have searched the [issues](https://github.com/apache/dubbo/issues) of this repository and believe that this is not a duplicate.
+- [ ] I have checked the [FAQ](https://github.com/apache/dubbo/blob/master/FAQ.md) of this repository and believe that this is not a duplicate.
+
+### Environment
+
+* Dubbo version: xxx
+* Operating System version: xxx
+* Java version: xxx
+
+### Steps to reproduce this issue
+
+1. xxx
+2. xxx
+3. xxx
+
+Pls. provide [GitHub address] to reproduce this issue.
+
+### Expected Result
+
+What do you expected from the above steps?
+
+### Actual Result
+
+What actually happens?
+
+If there is an exception, please attach the exception trace:
+
+```
+Just put your stack trace here!
+```
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..15002c4
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,43 @@
+# maven ignore
+target/
+*.jar
+!.mvn/wrapper/*
+*.war
+*.zip
+*.tar
+*.tar.gz
+.flattened-pom.xml
+
+# eclipse ignore
+.settings/
+.project
+.classpath
+
+# idea ignore
+.idea/
+*.ipr
+*.iml
+*.iws
+
+# temp ignore
+*.log
+*.cache
+*.diff
+*.patch
+*.tmp
+
+# system ignore
+.DS_Store
+Thumbs.db
+*.orig
+
+# license check result
+license-list
+
+# grpc compiler
+compiler/gradle.properties
+compiler/build/*
+compiler/.gradle/*
+
+# protobuf
+dubbo-serialization/dubbo-serialization-protobuf/build/*
diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar
new file mode 100755
index 0000000..41c70a7
Binary files /dev/null and b/.mvn/wrapper/maven-wrapper.jar differ
diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties
new file mode 100755
index 0000000..a3ba20e
--- /dev/null
+++ b/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1 @@
+distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.6.1/apache-maven-3.6.1-bin.zip
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..f13d3e6
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,22 @@
+language: java
+sudo: false # faster builds
+
+jdk:
+  - openjdk11
+  - openjdk8
+
+cache:
+  directories:
+    - $HOME/.m2
+
+install: true
+
+script:
+  - rm -rf $HOME/.m2/repository/org/glassfish/javax.el/3.0.1-b08
+  - travis_wait 30 ./mvnw --batch-mode --no-transfer-progress clean install -DskipTests=false -DskipIntegrationTests=false -Dcheckstyle.skip=false -Drat.skip=false -Dmaven.javadoc.skip=true
+
+after_success:
+  - bash <(curl -s https://codecov.io/bash)
+
+after_failure:
+  - echo "build failed!"
diff --git a/CHANGES.md b/CHANGES.md
new file mode 100644
index 0000000..075116b
--- /dev/null
+++ b/CHANGES.md
@@ -0,0 +1,511 @@
+# Release Notes
+
+## 2.7.6 
+
+### Features
+* Support Service Authentication https://github.com/apache/dubbo/issues/5461
+
+### Enhancement
+* Removing the internal JDK API from FileSystemDynamicConfiguration
+* Refactor the APT test-cases implementation of dubbo-metadata-processor in Java 9+
+* Remove feature envy
+* JsonRpcProtocol support Generalization 
+* Reduce object allocation for ProtocolUtils.serviceKey
+* Reduce object allocation for ContextFilter.invoke
+
+### Bugfixes
+* Fixed bugs reported from 2.7.5 or lower versions, check [2.7.6 milestone](https://github.com/apache/dubbo/milestone/30) for details.
+
+### Compatibility
+1. Filter refactor, the callback method `onResponse` annotated as @Deprecated has been removed, users of lower versions that 
+have extended Filter implementations and enabled Filter callbacks should be careful of this change.
+2. RpcContext added some experimental APIs to support generic Object transmission.
+
+## 2.7.5
+
+### Features
+* Support HTTP/2 through gRPC, offers all features supported by HTTP/2 and gRPC
+    * Stream communication: client stream, server stream and bi-stream.
+    * Reactive stream style RPC call.
+    * Back pressure based on HTTP/2 flow-control mechanism.
+    * TLS secure transport layer.
+    * Define service using IDL
+* Protobuf support for native Dubbo
+    * Define service using IDL
+    * Protobuf serialization
+* TLS for netty4 server
+* New SPI for dynamically adding extra parameters into provider URL, especially env parameters.
+* **[BETA]** Brand new Service Discovery mechanism: Service Reflection - instance (application) level service discovery.
+* **[BETA]** Brand new API for bootstraping Dubbo projects
+
+### Performance Tuning
+* Overall performance improved by nearly 30% compared to v2.7.3 (by QPS in certain circumstances)
+* Improved consumer side thread model to avoid thread allocation and context switch, especially useful for services serving big traffic.
+
+### Enhancement
+* Load balance strategy among multiple registries:
+    * Preferred
+    * Same zone first
+    * Weighted LB
+    * The first one available
+* New callback SPI for receiving address change notifications
+* Refactoring of config module
+
+### Bugfixes
+check 2.7.5 milestone for details.
+
+## 2.7.4.1
+
+### Enhancement
+
+* Enhance ProtobufTypeBuilder support generate type definition which contains Bytes List or Bytes Map. #5083
+* Using the ID of Dubbo Config as the alias of Bean. #5094
+* tag router supports anyhost. #4431
+* optimize generic invoke. #4076
+* dubbo zookeeper registry too slow #4828
+* use consul with group and version. #4755
+* qos support host config. #4720
+* migrate http protocol #4781
+* Some unit test optimization. #5026 #4803 #4687
+
+### Bugfixes
+
+* Apollo namespace optimization.  #5105
+* Simplify dubbo-common transitive dependencies. #5107 
+* Delete 'config.' prefix for url generated from ConfigCenterConfig. #5001
+* fix set generic method error. #5079
+* Add support for overriding Map properties in AbstractConfig.refresh. #4882
+* Fix travis javax.ex dependency issue. (unit test)
+* Fix: ExtensionLoader load duplicate filter,no log or exception. #4340 
+* When the provider interrupts abnormally, the consumer cannot return quickly and still waits for the timeout to end. #4694
+* Fix register config not take effect because of url simplified。 #4397
+* Don't support metadata for generic service. #4641 
+* Avoid resize in ClassUtils.java. #5009 
+* default attribute in <dubbo:registry> doesn't work as expected. #4412
+* make RegistryDirectory can refresh the invokers when providers number become 0 when using nacos registry. #4793
+* Multiple @Reference annotations only have one effect #4674
+* Fix RpcContext.getContext().getRemoteApplicationName() returns null #4351
+* Security issue: upgrade fastjson version to 1.2.60. #5018
+* nacos-registry:serviceName split error #4974
+* AbstractConfig.java-getMetaData set default depend on getmethod sequence #4678
+* fix protocol register set false not work. #4776 
+* Fix: In Rest protocol, the limitation of Dubbo-Attachments. #4898
+* The logic of org.apache.dubbo.config.MonitorConfig#isValid is incorrect #4892
+* protostuff return stackoverflow and other error msg #4861
+* fix method parameter bean generation. #3796 
+* replace hardcode with regex pattern #4810
+* Fix warm up issue when provider's timestamp is bigger than local machine's timestamp. #4870
+* Fix use generic invocation via API , lost #4238 ion" value #4784
+* In consumer side the app cannot catch the exception from provider that is configured serialization="kryo". #4238
+* fix StringUtils#isBlank #4725
+* when the interfaceName of the Reference annotation has duplicated,the exception is puzzled #4160
+* when anonymity  bean is defined in spirng context,dubbo throw npe #
+* add Thread ContextClassLoader #4712
+* Fix judgment ipv4 address #4729
+* The compilation of static methods should be excluded when generating the proxy. #4647
+* check EOF of inputstream in IOUtils.write #4648
+
+
+## 2.7.3
+
+### Change List
+
+1. Asynchronous support
+    * Unified asynchronous and synchronous callback process, exception scenario triggers onError callback, #4401
+    * Performance degradation caused by CompletableFuture.get() in JDK1.8 environment, #4279
+
+2. Configuration Center
+    * ConfigCenter custom namespace does not take effect, #4411
+    * Unify the models implemented by several configuration centers such as Zookeeper, Nacos, and Etcd. Please refer to the description for possible incompatibility issues, #4388
+    * Adjust Override Coverage Rule Center Priority: Service Level > Application Level, #4175
+
+3. 2.6.x compatibility
+    * Support Zipkin tracing feature provided by Zipkin officially, #3728, #4471
+    * DubboComponentScan supports simultaneous scanning of annotations under the `com.alibaba.*` and `org.apache.*` packages, #4330
+
+4. The Nacos Registration Center only subscribes to the address list and no longer subscribes to configuration information, #4454.
+
+5. Support to read the environment configuration from the specified location, which can be specified by -D or OS VARIABLE. Please refer to [automatically loading environment variables](http://dubbo.apache.org/en-us/docs/user/configuration/environment-variables.html)
+
+6. Fix consumer cannot downgrade to providers with no tags when there's no tagged providers can match, #4525
+
+7. Some other bugfixes, #4346 #4338 #4349 #4377
+
+### Change List
+
+1. 异步支持相关
+
+    - 统一异步和同步的回调流程,异常场景触发onError回调 #4401
+    - CompletableFuture.get()在JDK1.8环境下带来的性能下降问题 #4279
+
+2. 配置中心相关
+
+    - ConfigCenter自定义namespace不生效的问题 #4411
+    - 统一Zookeeper、Nacos、Etcd等几个配置中心实现的模型,可能带来的不兼容性问题请参见说明。相关修改:#4388
+    - 调整Override覆盖规则中心优先级:服务级别 > 应用级别 #4175
+
+3. 2.6.x兼容性
+
+    - 兼容zipkin官方提供的基于Dubbo-2.6 API的集成 #3728, #4471
+    - DubboComponentScan支持同时扫描 `com.alibaba.*` 和 `org.apache.*` 两个包下的注解 #4330
+
+4. Nacos注册中心只订阅地址列表,不再订阅配置信息 #4454
+
+5. 支持从指定位置读取环境配置,可通过-D或OS VARIABLE指定,具体请参见[使用说明](http://dubbo.apache.org/zh-cn/docs/user/configuration/environment-variables.html)
+
+6. 标签路由在消费端使用静态打标方式时,无法实现自动降级以消费无标签提供者 #4525
+
+7. 其他一些bugfix,#4346 #4338 #4349 #4377 
+
+## 2.7.2
+
+### New Features
+
+- nacos config center / metadata center support. [#3846](https://github.com/apache/dubbo/issues/3846)
+- Etcd support as config center and metadata center [#3653](https://github.com/apache/dubbo/issues/3653)
+- Support Redis cluster in Metadata Report. [#3817](https://github.com/apache/dubbo/issues/3817)
+- add new module for Dubbo Event. [#4096](https://github.com/apache/dubbo/issues/4096)
+- Support multiple registry that including some effective registry, such as zk, redis [#3599](https://github.com/apache/dubbo/issues/3599)
+- support nacos metadata [#4025](https://github.com/apache/dubbo/issues/4025)
+- Dubbo support Google Protobuf generic reference [#3829](https://github.com/apache/dubbo/issues/3829)
+- Merge serialization-native-hessian-for-apache-dubbo into incubator-dubbo [#3961](https://github.com/apache/dubbo/issues/3961)
+- Merge rpc-native-thrift-for-apache-dubbo into incubator-dubbo [#3960](https://github.com/apache/dubbo/issues/3960)
+- add socks5 proxy support [#3624](https://github.com/apache/dubbo/issues/3624)
+- Integrate with SOFARegistry [#3874](https://github.com/apache/dubbo/issues/3874)
+- Introduce CompletableFuture $invokeAsync for GenericService, now, for generic call, you can use:  
+  $invoke for sync method call with normal return type.
+  $invokeAsync for async method call with CompletableFuture<T> signature. [#3163](https://github.com/apache/dubbo/issues/3163)
+
+### Enhancement
+
+- Performance tuning for TimeoutTask in DefaultFuture. [#4129](https://github.com/apache/dubbo/issues/4129)
+- Add a script to check dependencies license. [#3840](https://github.com/apache/dubbo/issues/3840)
+- Change DynamicConfiguration definition to better adapt to Apollo's namespace storage model.[#3266](https://github.com/apache/dubbo/issues/3266)
+- use equal explicit class to replace anonymous class [#4027](https://github.com/apache/dubbo/issues/4027)
+- Seperate Constants.java into some SubConstants Class [#3137](https://github.com/apache/dubbo/issues/3137)
+- Need to enhance DecodeableRpcResult error message [#3994](https://github.com/apache/dubbo/issues/3994)
+- Provide more meaningful binary releases. [#2491](https://github.com/apache/dubbo/issues/2491)
+- remove useless module-dubbo-test-integration [#3573](https://github.com/apache/dubbo/issues/3573)
+- complete lookup method of consul registry and add integration test [#3890](https://github.com/apache/dubbo/issues/3890)
+- Metrics Service [#3702](https://github.com/apache/dubbo/issues/3702)
+- Update nacos-client to 1.0.0 [#3804](https://github.com/apache/dubbo/issues/3804)
+- Fluent style builder API support [#3431](https://github.com/apache/dubbo/issues/3431)
+- Update readme to remove the incubator prefix [#4159](https://github.com/apache/dubbo/issues/4159)
+- update erlang link [#4100](https://github.com/apache/dubbo/issues/4100)
+- optimize array code style [#4031](https://github.com/apache/dubbo/issues/4031)
+- optimize some code style [#4006](https://github.com/apache/dubbo/issues/4006)
+- remove useless module-dubbo-test-integration [#3989](https://github.com/apache/dubbo/issues/3989)
+- optimize constant naming style [#3970](https://github.com/apache/dubbo/issues/3970)
+- Use maven CI friendly versions: revision. [#3851](https://github.com/apache/dubbo/issues/3851)
+- remove-parse-error-log [#3862](https://github.com/apache/dubbo/issues/3862)
+- Complete xsd definition for ConfigCenterConfig. [#3854](https://github.com/apache/dubbo/issues/3854)
+- add remoteApplicationName field in RpcContext [#3816](https://github.com/apache/dubbo/issues/3816)
+
+### Bugfixes
+
+- @Reference can't match the local @Service beans. [#4071](https://github.com/apache/dubbo/issues/4071)
+- remove some illegal licence: jcip-annotations, jsr173_api. [#3790](https://github.com/apache/dubbo/issues/3790)
+- Qos port can't be disabled by externalized property. [#3958](https://github.com/apache/dubbo/issues/3958)
+- Fix consumer will generate wrong stackTrace. [#4137](https://github.com/apache/dubbo/issues/4137)
+- nacos registry serviceName may conflict. [#4111](https://github.com/apache/dubbo/issues/4111)
+- The client loses the listener when the network is reconnected. [#4115](https://github.com/apache/dubbo/issues/4115)
+- fix registery urls increase forever when recreate reference proxy. [#4109](https://github.com/apache/dubbo/issues/4109)
+- In dubbo 2.7.1,the watcher processor of zookeeper client throw Nullpointexception. [#3866](https://github.com/apache/dubbo/issues/3866)
+- ReferenceConfig initialized not changed to false once subscribe throws exception [#4068](https://github.com/apache/dubbo/issues/4068)
+- dubbo registry extension compatibility with dubbo 2.6.x. [#3882](https://github.com/apache/dubbo/issues/3882)
+- Annotation mode cannot set service parameters in 2.7.0. [#3778](https://github.com/apache/dubbo/issues/3778)
+- compatibility with Zipkin. [#3728](https://github.com/apache/dubbo/issues/3728)
+- do local export before register any listener. [#3669](https://github.com/apache/dubbo/issues/3669)
+- Cannot recognize 2.6.x compatible rules from dubbo-admin. [#4059](https://github.com/apache/dubbo/issues/4059)
+- In Dubbo 2.7.0, the provider can't be configured to async [#3650](https://github.com/apache/dubbo/issues/3650)
+- dubbox compatibility [#3991](https://github.com/apache/dubbo/issues/3991)
+- dubbo-2.7.1 providers repeat register [#3785](https://github.com/apache/dubbo/issues/3785)
+- consul registry: NullPointerException [#3923](https://github.com/apache/dubbo/issues/3923)
+- cannot publish local ip address when local ip and public ip exist at the same time [#3802](https://github.com/apache/dubbo/issues/3802)
+- roll back change made by 3520. [#3935](https://github.com/apache/dubbo/issues/3935)
+- dubbo-registry-nacos module is not bundled into Apache Dubbo 2.7.1 [#3797](https://github.com/apache/dubbo/issues/3797)
+- switch from CopyOnWriteArrayList to regular list in order to avoid potential UnsupportedOperationException [#3242](https://github.com/apache/dubbo/issues/3242)
+- Serialization ContentTypeId conflict between avro protocol and protocoluff protocol [#3926](https://github.com/apache/dubbo/issues/3926)
+- delay export function doesn't work. [#3952](https://github.com/apache/dubbo/issues/3952)
+- org.apache.dubbo.rpc.support.MockInvoker#getInterface should not return null [#3713](https://github.com/apache/dubbo/issues/3713)
+- dubbo TagRouter does not work with dubbo:parameter [#3875](https://github.com/apache/dubbo/issues/3875)
+- make protocols a mutable list (a concrete ArrayList) [#3841](https://github.com/apache/dubbo/issues/3841)
+- javadoc lint issue [#3646](https://github.com/apache/dubbo/issues/3646)
+- The etcd3 lease should be recycled correctly [#3684](https://github.com/apache/dubbo/issues/3684)
+- telnet can't work when parameter has no nullary constructor and some fields is primitive [#4007](https://github.com/apache/dubbo/issues/4007)
+- Sort added router list before set the 'routers' field of the RouterChain [#3969](https://github.com/apache/dubbo/issues/3969)
+- fix injvm and local call [#3638](https://github.com/apache/dubbo/issues/3638)
+- spelling error in org.apache.dubbo.common.extension.AdaptiveClassCodeGenerator#generateReturnAndInovation [#3933](https://github.com/apache/dubbo/issues/3933)
+- metadata report doesn't support redis with password [#3826](https://github.com/apache/dubbo/issues/3826)
+- The dubbo protostuff protocol serializes the bug of java.sql.Timestamp [#3914](https://github.com/apache/dubbo/issues/3914)
+- do not filter thread pool by port [#3919](https://github.com/apache/dubbo/issues/3919)
+- 'dubbo-serialization-gson' maven package error [#3903](https://github.com/apache/dubbo/issues/3903)
+- AbstractRegistry will be endless loop, when doSaveProperties method have no permission to save the file [#3746](https://github.com/apache/dubbo/issues/3746)
+- fix fastjson serialization with generic return type [#3771](https://github.com/apache/dubbo/issues/3771)
+- The dubbo-serialization -api modules should not dependency on third-party jar packages [#3762](https://github.com/apache/dubbo/issues/3762)
+- when using protostuff to serialize, there is not to check whether the data is null [#3727](https://github.com/apache/dubbo/issues/3727)
+- bugfix and enhancement for async [#3287](https://github.com/apache/dubbo/issues/3287)
+
+## 2.7.1
+
+### Notice
+
+'zkclient' extension for 'org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter' is removed from Dubbo 2.7.1, and 'curator' extension becomes the default extension. If you happen to config your application to use 'zkclient' explicitly, pls. switch to use 'curator' instead.
+
+### New Features
+
+- service register support on nacos [#3582](https://github.com/apache/dubbo/issues/3582)
+- support consul as registry center, config center and metadata center [#983](https://github.com/apache/dubbo/issues/983)
+- service registry support/config center support on etcd [#808](https://github.com/apache/dubbo/issues/808)
+- metrics support in dubbo 2.7.1 [#3598](https://github.com/apache/dubbo/issues/3598)
+- @Argument @Method support [#2405](https://github.com/apache/dubbo/issues/2045)
+
+### Enhancement
+
+- [Enhancement] @EnableDubboConfigBinding annotates @Repeatable [#1770](https://github.com/apache/dubbo/issues/1770)
+- [Enhancement] Change the default behavior of @EnableDubboConfig.multiple() [#3193](https://github.com/apache/dubbo/issues/3193)
+- Should make annotation easier to use in multiple items circumstance [#3039](https://github.com/apache/dubbo/issues/3039)
+- NoSuchMethodError are thrown when add custom Filter using dubbo2.6.5 and JDK1.6 and upgrade to dubbo2.7.0 [#3570](https://github.com/apache/dubbo/issues/3570)
+- introduce dubbo-dependencies-zookeeper [#3607](https://github.com/apache/dubbo/pull/3607)
+- Zookeeper ConfigCenter reuse the client abstraction and connection session [#3288](https://github.com/apache/dubbo/issues/3288)
+- [Survey] Is it necessary to continue to maintain zkclient in dubbo project? [#3569](https://github.com/apache/dubbo/issues/3569)
+- Start to use IdleStateHandler in Netty4 [#3341](https://github.com/apache/dubbo/pull/3341)
+- Support multiple shared links [#2457](https://github.com/apache/dubbo/pull/2457)
+- Optimize heartbeat [#3299](https://github.com/apache/dubbo/pull/3299)
+- AccessLogFilter simple date format reduce instance creation [#3026](https://github.com/apache/dubbo/issues/3026)
+- Support wildcard ip for tag router rule. [#3289](https://github.com/apache/dubbo/issues/3289)
+- ScriptRouter should cache CompiledScript [#390](https://github.com/apache/dubbo/issues/390)
+- Optimize compareTo in Router to guarantee consistent behaviour. [#3302](https://github.com/apache/dubbo/issues/3302)
+- RMI protocol doesn't support generic invocation [#2779](https://github.com/apache/dubbo/issues/2779)
+- a more elegant way to enhance HashedWheelTimer [#3567](https://github.com/apache/dubbo/pull/3567)
+- obtain local address incorrectly sometimes in dubbo [#538](https://github.com/apache/dubbo/issues/538)
+- implement pull request #3412 on master branch [#3418](https://github.com/apache/dubbo/pull/3418)
+- enhancement for event of response (follow up for pull request #3043) [#3244](https://github.com/apache/dubbo/issues/3244)
+- bump up hessian-lite version #3423 [#3513](https://github.com/apache/dubbo/pull/3513)
+- [Dubbo-3610]make snakeyaml transitive, should we do this? [#3659](https://github.com/apache/dubbo/pull/3659)
+
+### Bugfixes
+
+- cannot register REST service in 2.7 due to the changes in RestProtoco#getContextPath [#3445](https://github.com/apache/dubbo/issues/3445)
+- Conflict between curator client and dubbo [#3574](https://github.com/apache/dubbo/issues/3574)
+- is there a problem in NettyBackedChannelBuffer.setBytes(...)? [#2619](https://github.com/apache/dubbo/issues/2619)
+- [Dubbo - client always reconnect offline provider] Dubbo client bug [#3158](https://github.com/apache/dubbo/issues/3158)
+- fix heartbeat internal [#3579](https://github.com/apache/dubbo/pull/3579)
+- logic issue in RedisRegistry leads to services cannot be discovered. [#3291](https://github.com/apache/dubbo/pull/3291)
+- Multicast demo fails with message "Can't assign requested address" [#2423](https://github.com/apache/dubbo/issues/2423)
+- Fix thrift protocol, use path to locate exporter. [#3331](https://github.com/apache/dubbo/pull/3331)
+- cannot use override to modify provider's configuration when hessian protocol is used [#900](https://github.com/apache/dubbo/issues/900)
+- Condition is not properly used ? [#1917](https://github.com/apache/dubbo/issues/1917)
+- connectionMonitor in RestProtocol seems not work [#3237](https://github.com/apache/dubbo/issues/3237)
+- fail to parse config text with white space [#3367](https://github.com/apache/dubbo/issues/3367)
+- @Reference check=false doesn't take effect [#195](https://github.com/apache/dubbo/issues/195)
+- [Issue] SpringStatusChecker execute errors on non-XML Spring configuration [#3615](https://github.com/apache/dubbo/issues/3615)
+- monitor's cluster config is set to failsafe and set to failsafe only [#274](https://github.com/apache/dubbo/issues/274)
+- A question for ReferenceConfigCache. [#1293](https://github.com/apache/dubbo/issues/1293)
+- referenceconfig#destroy never invoke unregister [#3294](https://github.com/apache/dubbo/issues/3294)
+- Fix when qos is disable,log will print every time [#3397](https://github.com/apache/dubbo/pull/3397)
+- service group is not supported in generic direct invocation [#3555](https://github.com/apache/dubbo/issues/3555)
+- setOnreturn doesn't take effect in async generic invocation [#208](https://github.com/apache/dubbo/issues/208)
+- Fix timeout filter not work in async way [#3174](https://github.com/apache/dubbo/pull/3174)
+- java.lang.NumberFormatException: For input string: "" [#3069](https://github.com/apache/dubbo/issues/3069)
+- NPE occurred when the configuration was deleted [#3533](https://github.com/apache/dubbo/issues/3533)
+- NPE when package of interface is empty [#3556](https://github.com/apache/dubbo/issues/3556)
+- NPE when exporting rest service using a given path. [#3477](https://github.com/apache/dubbo/issues/3477)
+- NullPointerException happened when using SpringContainer.getContext() [#3476](https://github.com/apache/dubbo/issues/3476)
+- Why does not tomcat throw an exception when `server.start` failed with a socket binding error.  [#3236](https://github.com/apache/dubbo/issues/3236)
+- No such extension org.apache.dubbo.metadata.store.MetadataReportFactory by name redis [#3514](https://github.com/apache/dubbo/issues/3514)
+- dubbo 2.7.1-SNAPSHOT NoClassDefFoundError when use springboot [#3426](https://github.com/apache/dubbo/issues/3426)
+- NPE occurs when use @Reference in junit in spring boot application [#3429](https://github.com/apache/dubbo/issues/3429)
+- When refer the same service with more than one @References(with different configs) on consumer side, only one take effect [#1306](https://github.com/apache/dubbo/issues/1306)
+- consumer always catch java.lang.reflect.UndeclaredThrowableException for the exception thrown from provider [#3386](https://github.com/apache/dubbo/issues/3386)
+- dubbo2.7.0 com.alibaba.com.caucho.hessian.io.HessianProtocolException: 'com.alibaba.dubbo.common.URL' could not be instantiated [#3342](https://github.com/apache/dubbo/issues/3342)
+- Close Resources Properly [#3473](https://github.com/apache/dubbo/issues/3473)
+- SPI entires dup by 3 times. [#2842](https://github.com/apache/dubbo/issues/2842)
+- provider gets wrong interface name from attachment when use generic invocation in 2.6.3 [#2981](https://github.com/apache/dubbo/issues/2981)
+- HashedWheelTimer's queue gets full [#3449](https://github.com/apache/dubbo/issues/3449)
+- Modify MetadataReportRetry ThreadName [#3550](https://github.com/apache/dubbo/pull/3550)
+- Keep interface key in the URL in simplify mode when it's different from path. [#3478](https://github.com/apache/dubbo/issues/3478)
+- nc is not stable in dubbo's bootstrap script [#936](https://github.com/apache/dubbo/issues/936)
+
+## 2.7.0
+
+Requirements: **Java 8+** required
+
+Please check [here](https://github.com/apache/dubbo/blob/2.7.0-release/CHANGES.md#upgrading-and-compatibility-notifications) for notes and possible compatibility issues for upgrading from 2.6.x or lower to 2.7.0.
+
+### New Features
+
+- Enhancement of service governance rules.
+  - Enriched Routing Rules.
+    1. Conditional Routing. Supports both application-level and service-level conditions.
+    2. Tag Routing. Newly introduced to better support traffic isolation, such as grey deployment.
+  - Decoupling governance rules with the registry, making it easier to extend. Apollo and Zookeeper are available in this version. Nacos support is on the way...
+  - Application-level Dynamic Configuration support.
+  - Use YAML as the configuration language, which is more friendly to read and use.
+
+- Externalized Configuration. Supports reading `dubbo.properties` hosted in remote centralized configuration center - centralized configuration.
+
+- Simplified registry URL. With lower Registry memory use and less notification pressure from Service Directory, separates Configuration notification from Service Discovery.
+
+- Metadata Center. A totally new concept since 2.7.0,  used to store service metadata including static configuration, service definition, method signature, etc.. By default, Zookeeper and Redis are supported as the backend storage. Will work as the basis of service testing, mock and other service governance features going to be supported in [Dubbo-Admin](https://github.com/apache/dubbo-admin).
+
+- Asynchronous Programming Model (only works for Dubbo protocol now)
+  - Built-in support for the method with CompletableFuture<T> signature.
+  - Server-side asynchronous support, with an AsyncContext API works like Servlet 3.0.
+  - Asynchronous filter chain callback.
+
+- Serialization Extension: Protobuf.
+
+- Caching Policy Extension: Expiring Cache.
+
+### Enhancements / Bugfixes
+
+- Load Balancing strategy enhancement: ConsitentHash #2190, LeastActive #2171, Random #2597, RoundRobin #2650.
+
+- Third-party dependency upgrading.
+  - Switch default remoting to Netty 4.
+  - Switch default Zookeeper client to Curator.
+  - Upgrade Jetty to 9.x.
+
+- IPV6 support #2079.
+
+- Performance tuning, check hanging requests on a closed channel, make them return directly #2185.
+
+- Fixed the serialization problem of JDK primitive types in Kryo #2178.
+
+- Fixed the problem of failing to notify Consumer as early as possible after the Provider side deserialization failed #1903.
+
+### Upgrading and Compatibility Notifications
+
+We have always keep compatibility in mind during the whole process of 2.7.0. We even want old users to upgrade with only on pom version upgrade, but it's hard to achieve that, especially when considering that we have the package renamed in this version, so we had some tradeoffs. If you only used the Dubbo's most basic features, you may have little problems of upgrading, but if you have used some advanced features or have some SPI extensions inside, you'd better read the upgrade notificat [...]
+
+1. Interoperability between 2.7.0 and lower versions
+
+2. Package renaming
+
+   com.alibaba.dubbo -> org.apache.dubbo
+
+3. Simplification of registered URLs
+
+4. Service Governance Rules
+
+5. Configuration
+
+## 2.6.6
+
+Enhancement / New feature:
+
+* tag route.  #3065 
+* Use Netty4 as default Netty version. #3029 
+* upporting Java 8 Date/Time type when serializing with Kryo #3519 
+* supoort config telnet  #3511
+* add annotation driven in MethodConfig and ArgumentConfig #2603
+* add nacos-registry module #3296  
+* add `protocol` attribute in `@Rerefence` #3555 
+*support the hierarchical interface in @Service  #3251  
+* change the default behavior in `@EnableDubboConfig.multiple()` #3193 
+* inline source code of `spring-context-support` #3192 
+* Simplify externalized configuration of Dubbo Protocol name  #3189 
+
+BugFix:
+ 
+* update hessian-lite to 2.3.5, fix unnecessary class load #3538 
+* Fix unregister when client destroyed(referenceconfig#destroy) #3502 
+* SPI entires dup by 3 times #3315 
+* fix Consumer throws RpcException after RegistryDirectory notify in high QPS #2016 
+* fix NPE in @Reference when using Junit to test dubbo service #3429 
+* fix consuer always catch java.lang.reflect.UndeclaredThrowableException for any exception throws in provider  #3386 
+* fix the priority of `DubboConfigConfigurationSelector ` #2897 
+* fix `@Rerefence#parameters()` not work #2301 
+
+## 2.6.5
+
+Enhancements / Features:    
+
+- Reactor the generation rule for @Service Bean name [#2235](https://github.com/apache/dubbo/issues/2235) 
+- Introduce a new Spring ApplicationEvent for ServiceBean exporting [#2251](https://github.com/apache/dubbo/issues/2251) 
+- [Enhancement] the algorithm of load issue on Windows. [#1641](https://github.com/apache/dubbo/issues/1641)
+- add javadoc to dubbo-all module good first issue. [#2600](https://github.com/apache/dubbo/issues/2600) 
+- [Enhancement] Reactor the generation rule for @Service Bean name type/enhancement [#2235](https://github.com/apache/dubbo/issues/2235) 
+- Optimize LeastActiveLoadBalance and add weight test case. [#2540](https://github.com/apache/dubbo/issues/2540) 
+- Smooth Round Robin selection. [#2578](https://github.com/apache/dubbo/issues/2578) [#2647](https://github.com/apache/dubbo/pull/2647) 
+- [Enhancement] Resolve the placeholders for sub-properties. [#2297](https://github.com/apache/dubbo/issues/2297) 
+- Add ability to turn off SPI auto injection, special support for generic Object type injection. [#2681](https://github.com/apache/dubbo/pull/2681)
+
+
+Bugfixes:    
+
+- @Service(register=false) is not work. [#2063](https://github.com/apache/dubbo/issues/2063) 
+- Our customized serialization id exceeds the maximum limit, now it cannot work on 2.6.2 anymore. [#1903](https://github.com/apache/dubbo/issues/1903) 
+- Consumer throws RpcException after RegistryDirectory notify in high QPS. [#2016](https://github.com/apache/dubbo/issues/2016)   
+- Annotation @Reference can't support to export a service with a sync one and an async one . [#2194](https://github.com/apache/dubbo/issues/2194) 
+- `org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor#generateReferenceBeanCacheKey` has a bug. [#2522](https://github.com/apache/dubbo/issues/2522) 
+- 2.6.x Spring Event & Bugfix. [#2256](https://github.com/apache/dubbo/issues/2256) 
+- Fix incorrect descriptions for dubbo-serialization module. [#2665](https://github.com/apache/dubbo/issues/2665) 
+- A empty directory dubbo-config/dubbo-config-spring/src/test/resources/work after package source tgz. [#2560](https://github.com/apache/dubbo/issues/2560)
+- Fixed 2.6.x branch a minor issue with doConnect not using getConnectTimeout() in NettyClient.  (*No issue*). [#2622](https://github.com/apache/dubbo/pull/2622) 
+- Bean name of @service annotated class does not resolve placeholder. [#1755](https://github.com/apache/dubbo/issues/1755) 
+
+
+
+Issues and Pull Requests, check [milestone-2.6.5](https://github.com/apache/dubbo/milestone/21).
+
+## 2.6.4
+
+Enhancements / Features
+
+- Support access Redis with password, [#2146](https://github.com/apache/dubbo/pull/2146)
+- Support char array for GenericService, [#2137](https://github.com/apache/dubbo/pull/2137)
+- Direct return when the server goes down abnormally, [#2451](https://github.com/apache/dubbo/pull/2451)
+- Add log for trouble-shooting when qos start failed, [#2455](https://github.com/apache/dubbo/pull/2455)
+- PojoUtil support subclasses of java.util.Date, [#2502](https://github.com/apache/dubbo/pull/2502)
+- Add ip and application name for MonitorService, [#2166](https://github.com/apache/dubbo/pull/2166)
+- New ASCII logo, [#2402](https://github.com/apache/dubbo/pull/2402)
+
+Bugfixes
+
+- Change consumer retries default value from 0 to 2, [#2303](https://github.com/apache/dubbo/pull/2303)
+- Fix the problem that attachment is lost when retry, [#2024](https://github.com/apache/dubbo/pull/2024)
+- Fix NPE when telnet get a null parameter, [#2453](https://github.com/apache/dubbo/pull/2453)
+
+UT stability
+
+- Improve the stability by changing different port, setting timeout to 3000ms, [#2501](https://github.com/apache/dubbo/pull/2501)
+
+Issues and Pull Requests, check [milestone-2.6.4](https://github.com/apache/dubbo/milestone/19).
+
+## 2.6.3
+
+Enhancements / Features
+
+- Support implicit delivery of attachments from provider to consumer, #889
+- Support inject Spring bean to SPI by bean type, #1837
+- Add generic invoke and attachments support for http&hessian protocol, #1827
+- Get the real methodname to support consistenthash for generic invoke, #1872
+- Remove validation key from provider url on Consumer side, config depedently, #1386
+- Introducing the Bootstrap module as a unified entry for Dubbo startup and resource destruction, #1820
+- Open TCP_NODELAY on Netty 3, #1746
+- Support specify proxy type on provider side, #1873
+- Support dbindex in redis, #1831
+- Upgrade tomcat to 8.5.31, #1781
+
+Bugfixes
+
+- ExecutionDispatcher meet with user docs, #1089
+- Remove side effects of Dubbo custom loggers on Netty logger, #1717
+- Fix isShutdown() judge of Dubbo biz threadpool always return true, #1426
+- Selection of invoker node under the critical condition of only two nodes, #1759
+- Listener cann't be removed during unsubscribe when use ZK as registry, #1792
+- URL parsing problem when user filed contains '@',  #1808
+- Check null in CacheFilter to avoid NPE, #1828
+- Fix potential deadlock in DubboProtocol, #1836
+- Restore the bug that attachment has not been updated in the RpcContext when the Dubbo built-in retry mechanism is triggered, #1453
+- Some other small bugfixes
+
+Performance Tuning
+
+- ChannelState branch prediction optimization. #1643
+- Optimize AtomicPositiveInteger, less memory and compute cost, #348
+- Introduce embedded Threadlocal to replace the JDK implementation, #1745
+
+Hessian-lite
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..b7c31c2
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,46 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at dev@dubbo.apache.org. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
+
+[homepage]: http://contributor-covenant.org
+[version]: http://contributor-covenant.org/version/1/4/
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..c92e4a1
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,76 @@
+
+## Contributing to dubbo
+Dubbo is released under the non-restrictive Apache 2.0 license, and follows a very standard Github development process, using Github tracker for issues and merging pull requests into master. If you want to contribute even something trivial please do not hesitate, but follow the guidelines below.
+
+### Sign the Contributor License Agreement
+Before we accept a non-trivial patch or pull request we will need you to sign the Contributor License Agreement. Signing the contributor’s agreement does not grant anyone commit rights to the main repository, but it does mean that we can accept your contributions, and you will get an author credit if we do. Active contributors might be asked to join the core team, and given the ability to merge pull requests.
+
+### Contact
+
+#### Mailing list
+
+The mailing list is the recommended way for discussing almost anything that related to Dubbo. Please refer to this [guide](https://github.com/apache/dubbo/wiki/Mailing-list-subscription-guide) for detailed documentation on how to subscribe.
+
+- [dev@dubbo.apache.org](mailto:dev-subscribe@dubbo.apache.org): the develop mailing list, you can ask question here if you have encountered any problem when using or developing Dubbo.
+- [commits@dubbo.apache.org](mailto:commits-subscribe@dubbo.apache.org): all the commits will be sent to this mailing list. You can subscribe to it if you are interested in Dubbo's development.
+- [notifications@dubbo.apache.org](mailto:notifications-subscribe@dubbo.apache.org): all the Github [issue](https://github.com/apache/dubbo/issues) updates and [pull request](https://github.com/apache/dubbo/pulls) updates will be sent to this mailing list.
+
+### Reporting issue
+
+Please follow the [template](https://github.com/apache/dubbo/issues/new?template=dubbo-issue-report-template.md) for reporting any issues.
+
+### Code Conventions
+Our code style is almost in line with the standard java conventions (Popular IDE's default setting satisfy this), with the following additional restricts:  
+* If there are more than 120 characters in current line, start a new line.
+
+* Make sure all new .java files to have a simple Javadoc class comment with at least a @date tag identifying birth, and preferably at least a paragraph on what the class is for.
+
+* Add the ASF license header comment to all new .java files (copy from existing files in the project)
+
+* Make sure no @author tag added to the file you contribute since @author tag is not used at Apache, other ways such as cvs will record all your contributions fairly.
+
+* Add some Javadocs and, if you change the namespace, some XSD doc elements.
+
+* A few unit tests should be added for a new feature or an important bugfix.
+
+* If no-one else is using your branch, please rebase it against the current master (or other target branch in the main project).
+
+* When writing a commit message please follow these conventions, if you are fixing an existing issue please add Fixes #XXX at the end of the commit message (where XXX is the issue number).
+
+### Contribution flow
+
+This is a rough outline of what a contributor's workflow looks like:
+
+* Fork the current repository
+* Create a topic branch from where to base the contribution. This is usually master.
+* Make commits of logical units.
+* Make sure commit messages are in the proper format (see below).
+* Push changes in a topic branch to your forked repository.
+* Follow the checklist in the [pull request template](https://github.com/apache/dubbo/blob/master/PULL_REQUEST_TEMPLATE.md)
+* Before you sending out the pull request, please sync your forked repository with remote repository, this will make your pull request simple and clear. See guide below:
+```
+git remote add upstream git@github.com:apache/dubbo.git
+git fetch upstream
+git rebase upstream/master
+git checkout -b your_awesome_patch
+... add some work
+git push origin your_awesome_patch
+```
+* Submit a pull request to apache/dubbo and wait for the reply.
+
+Thanks for contributing!
+
+### Code style
+
+We provide a template file [dubbo_codestyle_for_idea.xml](https://github.com/apache/dubbo/tree/master/codestyle/dubbo_codestyle_for_idea.xml) for IntelliJ idea, you can import it to you IDE. 
+If you use Eclipse you can config manually by referencing the same file.
+
+**NOTICE**
+
+It is very important to set the dubbo_codestyle_for_idea.xml, otherwise you will fail to pass the Travis CI. Steps to set the code style are as below:
+
+1. Enter `Editor > Code Style`
+2. To manage a code style scheme, in the Code Style page, select the desired scheme from the drop-down list, and click ![manage profiles](codestyle/manage_profiles.png).
+From the drop-down list, select `Import Scheme`, then select this option `IntelliJ IDEA code style XML` to import scheme
+3. In the Scheme field, type the name of the new scheme and press ⏎ to save the changes.
+
diff --git a/Jenkinsfile b/Jenkinsfile
new file mode 100644
index 0000000..15eda40
--- /dev/null
+++ b/Jenkinsfile
@@ -0,0 +1,138 @@
+import groovy.json.JsonSlurper
+
+pipeline {
+    agent {
+        node {
+            label 'ubuntu'
+        }
+    }
+
+    options {
+        buildDiscarder(logRotator(daysToKeepStr: '14', artifactNumToKeepStr: '10'))
+    }
+
+    environment {
+        JAVA_HOME = "${tool 'JDK 1.8 (latest)'}"
+    }
+
+    tools {
+        maven 'Maven 3 (latest)'
+        jdk 'JDK 1.8 (latest)'
+    }
+
+    triggers {
+        cron '''TZ=Asia/Shanghai
+        H 2,14 * * *'''
+        pollSCM '''TZ=Asia/Shanghai
+        H H/2 * * *'''
+    }
+
+
+    stages {
+        stage('Clone') {
+            steps {
+                checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'CloneOption', noTags: true, reference: '', shallow: true]], gitTool: 'Default', submoduleCfg: [], userRemoteConfigs: [[url: 'https://github.com/apache/dubbo.git']]])
+            }
+        }
+
+        stage('Duplicate deploy check') {
+            steps {
+                script {
+                    def deployedCommitId = sh(returnStdout: true, script: "curl --silent https://builds.apache.org/job/Apache%20Dubbo/job/${env.JOB_BASE_NAME}/lastSuccessfulBuild/artifact/DEPLOY_COMMIT_ID || true").trim()
+                    env.DEPLOYED_COMMIT_ID = deployedCommitId
+                    def commitId = sh(returnStdout: true, script: 'git rev-parse HEAD').trim()
+                    env.COMMIT_ID = commitId
+
+                    if (commitId == deployedCommitId) {
+                        env.STATUS_CHECK = "false"
+                        println "Latest deployed commit id is $deployedCommitId, Skip deployment this time"
+                    } else {
+                        env.STATUS_CHECK = "true"
+                        println "Current commit id hasn't been deployed, continue"
+                    }
+                }
+            }
+        }
+
+        stage('Commit status check') {
+            when {
+                expression {
+                    return env.STATUS_CHECK == "true";
+                }
+            }
+            steps {
+                script {
+                    def commitId = env.COMMIT_ID
+                    println "Current commit id: $commitId"
+
+                    def commitStatusJson = sh(script: "curl --silent https://api.github.com/repos/apache/dubbo/commits/$commitId/status", returnStdout: true).trim()
+                    println "Commit status: \r\n$commitStatusJson"
+
+                    def jsonSlurper = new JsonSlurper()
+                    def jsonObject = jsonSlurper.parseText(commitStatusJson)
+
+                    def status = jsonObject.state
+
+                    println "Current commit status is $status"
+
+                    if (status == "success") {
+                        env.STATUS_CHECK = "true"
+                        println "Continue to deploy snapshot"
+                    } else {
+                        env.STATUS_CHECK = "false"
+                        println "Current commit status not allow to deploy snapshot"
+                    }
+                }
+            }
+        }
+
+        stage('Snapshot version check') {
+            when {
+                expression {
+                    return env.STATUS_CHECK == "true";
+                }
+            }
+            steps {
+                sh 'env'
+                sh 'java -version'
+                sh './mvnw clean install -pl "dubbo-dependencies-bom" && ./mvnw clean install -DskipTests=true && ./mvnw clean validate -Psnapshot-ci-deploy -pl "dubbo-all"'
+            }
+        }
+
+        stage('Deploy snapshot') {
+            when {
+                expression {
+                    return env.STATUS_CHECK == "true";
+                }
+            }
+            steps {
+                timeout(40) {
+                    sh './mvnw --version'
+                    sh './mvnw clean package deploy -pl dubbo-dependencies-bom && ./mvnw clean source:jar javadoc:jar package deploy -DskipTests=true'
+                }
+            }
+        }
+
+        stage('Save deployed commit id') {
+            steps {
+                script {
+                    if (env.STATUS_CHECK != "true") {
+                        println "Not pass status check"
+                        env.COMMIT_ID = env.DEPLOYED_COMMIT_ID
+                    }
+                }
+                writeFile file: 'DEPLOY_COMMIT_ID', text: "${env.COMMIT_ID}"
+                archiveArtifacts 'DEPLOY_COMMIT_ID'
+            }
+        }
+    }
+
+    post {
+        failure {
+            mail bcc: '', body: '''Project: ${env.JOB_NAME}
+            Build Number: ${env.BUILD_NUMBER}
+            URL: ${env.BUILD_URL}''', cc: '', from: '', replyTo: '', subject: 'Apache Dubbo snapshot deployment fail', to: 'dev@dubbo.apache.org'
+        }
+    }
+
+}
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..89ce3a5
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,282 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed 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.
+
+
+Apache Dubbo Submodules:
+
+Apache Dubbo includes a number of submodules with separate copyright notices
+and license terms. Your use of these submodules is subject to the terms and
+conditions of the following licenses.
+
+For the package org.apache.dubbo.common.threadlocal and org.apache.dubbo.common.timer:
+
+This product contains a modified portion of 'Netty', an event-driven asynchronous network application framework also
+ under a "Apache License 2.0" license, see https://github.com/netty/netty/blob/4.1/LICENSE.txt:
+
+ * io.netty.util.concurrent.FastThreadLocal
+ * io.netty.util.internal.InternalThreadLocalMap
+ * io.netty.util.Timer
+ * io.netty.util.TimerTask
+ * io.netty.util.Timeout
+ * io.netty.util.HashedWheelTimer
+
+For the org.apache.dubbo.common.utils.CIDRUtils :
+
+This product contains a modified portion of 'edazdarevic.commons.net.CIDRUtils' published at
+https://github.com/edazdarevic/CIDRUtils. The project is licensed under a MIT License:
+    * The MIT License
+    *
+    * Copyright (c) 2013 Edin Dazdarevic (edin.dazdarevic@gmail.com)
+    * Permission is hereby granted, free of charge, to any person obtaining a copy
+    * of this software and associated documentation files (the "Software"), to deal
+    * in the Software without restriction, including without limitation the rights
+    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+    * copies of the Software, and to permit persons to whom the Software is
+    * furnished to do so, subject to the following conditions:
+    * The above copyright notice and this permission notice shall be included in
+    * all copies or substantial portions of the Software.
+    * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+    * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+    * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+    * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+    * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+    * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+    * THE SOFTWARE.
+
+For the file org.apache.dubbo.common.utils.Utf8Utils.java:
+
+This product contains a portion of the Protocol Buffers project, which is published at
+https://developers.google.com/protocol-buffers/ and is licensed under the following License:
+
+    Copyright 2008 Google Inc.  All rights reserved.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, are permitted provided that the following conditions are
+    met:
+
+        * Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+        * Redistributions in binary form must reproduce the above
+    copyright notice, this list of conditions and the following disclaimer
+    in the documentation and/or other materials provided with the
+    distribution.
+        * Neither the name of Google Inc. nor the names of its
+    contributors may be used to endorse or promote products derived from
+    this software without specific prior written permission.
+
+    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+    Code generated by the Protocol Buffer compiler is owned by the owner
+    of the input file used when generating it.  This code is not
+    standalone and requires a support library to be linked with it.  This
+    support library is itself covered by the above license.
\ No newline at end of file
diff --git a/NOTICE b/NOTICE
new file mode 100644
index 0000000..b20f4e8
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,22 @@
+Apache Dubbo
+Copyright 2018-2020 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+This product contains code form the Netty Project:
+
+The Netty Project
+=================
+Please visit the Netty web site for more information:
+  * http://netty.io/
+
+Copyright 2014 The Netty Project
+
+The product contains code form the Google Protocol Buffers project:
+
+Please visit the following site for more information:
+https://developers.google.com/protocol-buffers/
+
+Copyright 2008 Google Inc.  All rights reserved.
+
diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000..20c5854
--- /dev/null
+++ b/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,20 @@
+## What is the purpose of the change
+
+XXXXX
+
+## Brief changelog
+
+XXXXX
+
+## Verifying this change
+
+XXXXX
+
+Follow this checklist to help us incorporate your contribution quickly and easily:
+
+- [x] Make sure there is a [GITHUB_issue](https://github.com/apache/dubbo/issues) field for the change (usually before you start working on it). Trivial changes like typos do not require a GITHUB issue. Your pull request should address just this issue, without pulling in other changes - one PR resolves one issue.
+- [ ] Format the pull request title like `[Dubbo-XXX] Fix UnknownException when host config not exist #XXX`. Each commit in the pull request should have a meaningful subject line and body.
+- [ ] Write a pull request description that is detailed enough to understand what the pull request does, how, and why.
+- [ ] Write necessary unit-test to verify your logic correction, more mock a little better when cross module dependency exist. If the new feature or significant change is committed, please remember to add sample in [dubbo samples](https://github.com/apache/dubbo-samples) project.
+- [ ] Run `mvn clean install -DskipTests=false` & `mvn clean test-compile failsafe:integration-test` to make sure unit-test and integration-test pass.
+- [ ] If this contribution is large, please follow the [Software Donation Guide](https://github.com/apache/dubbo/wiki/Software-donation-guide).
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..c9e59eb
--- /dev/null
+++ b/README.md
@@ -0,0 +1,239 @@
+# Apache Dubbo Project
+
+[![Build Status](https://travis-ci.org/apache/dubbo.svg?branch=master)](https://travis-ci.org/apache/dubbo)
+[![codecov](https://codecov.io/gh/apache/dubbo/branch/master/graph/badge.svg)](https://codecov.io/gh/apache/dubbo)
+![maven](https://img.shields.io/maven-central/v/org.apache.dubbo/dubbo.svg)
+![license](https://img.shields.io/github/license/alibaba/dubbo.svg)
+[![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/apache/dubbo.svg)](http://isitmaintained.com/project/apache/dubbo "Average time to resolve an issue")
+[![Percentage of issues still open](http://isitmaintained.com/badge/open/apache/dubbo.svg)](http://isitmaintained.com/project/apache/dubbo "Percentage of issues still open")
+[![Tweet](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=Apache%20Dubbo%20is%20a%20high-performance%2C%20java%20based%2C%20open%20source%20RPC%20framework.&url=http://dubbo.apache.org/&via=ApacheDubbo&hashtags=rpc,java,dubbo,micro-service)
+[![](https://img.shields.io/twitter/follow/ApacheDubbo.svg?label=Follow&style=social&logoWidth=0)](https://twitter.com/intent/follow?screen_name=ApacheDubbo)
+[![Gitter](https://badges.gitter.im/alibaba/dubbo.svg)](https://gitter.im/alibaba/dubbo?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+
+Apache Dubbo is a high-performance, Java based open source RPC framework. Please visit [official site](http://dubbo.apache.org) for quick start and documentations, as well as [Wiki](https://github.com/apache/dubbo/wiki) for news, FAQ, and release notes.
+
+We are now collecting dubbo user info in order to help us to improve Dubbo better, pls. kindly help us by providing yours on [issue#1012: Wanted: who's using dubbo](https://github.com/apache/dubbo/issues/1012), thanks :)
+
+## Architecture
+
+![Architecture](http://dubbo.apache.org/img/architecture.png)
+
+## Features
+
+* Transparent interface based RPC
+* Intelligent load balancing
+* Automatic service registration and discovery
+* High extensibility
+* Runtime traffic routing
+* Visualized service governance
+
+## Getting started
+
+The following code snippet comes from [Dubbo Samples](https://github.com/apache/dubbo-samples/tree/master/java/dubbo-samples-api). You may clone the sample project and step into `dubbo-samples-api` sub directory before read on.
+
+```bash
+# git clone https://github.com/apache/dubbo-samples.git
+# cd dubbo-samples/java/dubbo-samples-api
+```
+
+There's a [README](https://github.com/apache/dubbo-samples/tree/master/java/dubbo-samples-api/README.md) file under `dubbo-samples-api` directory. Read it and try this sample out by following the instructions.
+
+### Maven dependency
+
+```xml
+<properties>
+    <dubbo.version>2.7.6</dubbo.version>
+</properties>
+    
+<dependencies>
+    <dependency>
+        <groupId>org.apache.dubbo</groupId>
+        <artifactId>dubbo</artifactId>
+        <version>${dubbo.version}</version>
+    </dependency>
+    <dependency>
+        <groupId>org.apache.dubbo</groupId>
+        <artifactId>dubbo-dependencies-zookeeper</artifactId>
+        <version>${dubbo.version}</version>
+        <type>pom</type>
+    </dependency>
+</dependencies>
+```
+
+### Define service interfaces
+
+```java
+package org.apache.dubbo.samples.api;
+
+public interface GreetingService {
+    String sayHi(String name);
+}
+```
+
+*See [api/GreetingService.java](https://github.com/apache/dubbo-samples/blob/master/java/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/api/GreetingsService.java) on GitHub.*
+
+### Implement service interface for the provider
+
+```java
+package org.apache.dubbo.samples.provider;
+
+import org.apache.dubbo.samples.api.GreetingsService;
+
+public class GreetingsServiceImpl implements GreetingsService {
+    @Override
+    public String sayHi(String name) {
+        return "hi, " + name;
+    }
+}
+```
+
+*See [provider/GreetingServiceImpl.java](https://github.com/apache/dubbo-samples/blob/master/java/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/provider/GreetingsServiceImpl.java) on GitHub.*
+
+### Start service provider
+
+```java
+package org.apache.dubbo.samples.provider;
+
+
+import org.apache.dubbo.config.ApplicationConfig;
+import org.apache.dubbo.config.RegistryConfig;
+import org.apache.dubbo.config.ServiceConfig;
+import org.apache.dubbo.samples.api.GreetingsService;
+
+import java.util.concurrent.CountDownLatch;
+
+public class Application {
+    private static String zookeeperHost = System.getProperty("zookeeper.address", "127.0.0.1");
+
+    public static void main(String[] args) throws Exception {
+        ServiceConfig<GreetingsService> service = new ServiceConfig<>();
+        service.setApplication(new ApplicationConfig("first-dubbo-provider"));
+        service.setRegistry(new RegistryConfig("zookeeper://" + zookeeperHost + ":2181"));
+        service.setInterface(GreetingsService.class);
+        service.setRef(new GreetingsServiceImpl());
+        service.export();
+
+        System.out.println("dubbo service started");
+        new CountDownLatch(1).await();
+    }
+}
+```
+
+*See [provider/Application.java](https://github.com/apache/dubbo-samples/blob/master/java/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/provider/Application.java) on GitHub.*
+
+### Build and run the provider
+
+```bash
+# mvn clean package
+# mvn -Djava.net.preferIPv4Stack=true -Dexec.mainClass=org.apache.dubbo.samples.provider.Application exec:java
+```
+
+### Call remote service in consumer
+
+```java
+package org.apache.dubbo.samples.client;
+
+
+import org.apache.dubbo.config.ApplicationConfig;
+import org.apache.dubbo.config.ReferenceConfig;
+import org.apache.dubbo.config.RegistryConfig;
+import org.apache.dubbo.samples.api.GreetingsService;
+
+public class Application {
+    private static String zookeeperHost = System.getProperty("zookeeper.address", "127.0.0.1");
+
+    public static void main(String[] args) {
+        ReferenceConfig<GreetingsService> reference = new ReferenceConfig<>();
+        reference.setApplication(new ApplicationConfig("first-dubbo-consumer"));
+        reference.setRegistry(new RegistryConfig("zookeeper://" + zookeeperHost + ":2181"));
+        reference.setInterface(GreetingsService.class);
+        GreetingsService service = reference.get();
+        String message = service.sayHi("dubbo");
+        System.out.println(message);
+    }
+}
+```
+*See [consumer/Application.java](https://github.com/apache/dubbo-samples/blob/master/java/dubbo-samples-api/src/main/java/org/apache/dubbo/samples/client/Application.java) on GitHub.*
+
+### Build and run the consumer
+
+```bash
+# mvn clean package
+# mvn -Djava.net.preferIPv4Stack=true -Dexec.mainClass=org.apache.dubbo.samples.client.Application exec:java
+```
+
+The consumer will print out `hi, dubbo` on the screen.
+
+
+### Next steps
+
+* [Your first Dubbo application](http://dubbo.apache.org/en-us/blog/dubbo-101.html) - A 101 tutorial to reveal more details, with the same code above.
+* [Dubbo user manual](http://dubbo.apache.org/en-us/docs/user/preface/background.html) - How to use Dubbo and all its features.
+* [Dubbo developer guide](http://dubbo.apache.org/en-us/docs/dev/build.html) - How to involve in Dubbo development.
+* [Dubbo admin manual](http://dubbo.apache.org/en-us/docs/admin/install/provider-demo.html) - How to admin and manage Dubbo services.
+
+## Building
+
+If you want to try out the cutting-edge features, you can build with the following commands. (Java 1.8 is required to build the master branch)
+
+```
+  mvn clean install
+```
+
+## Contact
+
+* Mailing list: 
+  * dev list: for dev/user discussion. [subscribe](mailto:dev-subscribe@dubbo.apache.org), [unsubscribe](mailto:dev-unsubscribe@dubbo.apache.org), [archive](https://lists.apache.org/list.html?dev@dubbo.apache.org),  [guide](https://github.com/apache/dubbo/wiki/Mailing-list-subscription-guide)
+  
+* Bugs: [Issues](https://github.com/apache/dubbo/issues/new?template=dubbo-issue-report-template.md)
+* Gitter: [Gitter channel](https://gitter.im/alibaba/dubbo) 
+* Twitter: [@ApacheDubbo](https://twitter.com/ApacheDubbo)
+
+## Contributing
+
+See [CONTRIBUTING](https://github.com/apache/dubbo/blob/master/CONTRIBUTING.md) for details on submitting patches and the contribution workflow.
+
+### How can I contribute?
+
+* Take a look at issues with tag called [`Good first issue`](https://github.com/apache/dubbo/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) or [`Help wanted`](https://github.com/apache/dubbo/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22).
+* Join the discussion on mailing list, subscription [guide](https://github.com/apache/dubbo/wiki/Mailing-list-subscription-guide).
+* Answer questions on [issues](https://github.com/apache/dubbo/issues).
+* Fix bugs reported on [issues](https://github.com/apache/dubbo/issues), and send us pull request.
+* Review the existing [pull request](https://github.com/apache/dubbo/pulls).
+* Improve the [website](https://github.com/apache/dubbo-website), typically we need
+  * blog post
+  * translation on documentation
+  * use cases about how Dubbo is being used in enterprise system.
+* Improve the [dubbo-admin/dubbo-monitor](https://github.com/apache/dubbo-admin).
+* Contribute to the projects listed in [ecosystem](https://github.com/dubbo).
+* Any form of contribution that is not mentioned above.
+* If you would like to contribute, please send an email to dev@dubbo.apache.org to let us know!
+
+## Reporting bugs
+
+Please follow the [template](https://github.com/apache/dubbo/issues/new?template=dubbo-issue-report-template.md) for reporting any issues.
+
+## Reporting a security vulnerability
+
+Please report security vulnerability to [us](mailto:security@dubbo.apache.org) privately.
+
+## Dubbo ecosystem
+
+* [Dubbo Ecosystem Entry](https://github.com/apache?utf8=%E2%9C%93&q=dubbo&type=&language=) - A GitHub group `dubbo` to gather all Dubbo relevant projects not appropriate in [apache](https://github.com/apache) group yet
+* [Dubbo Website](https://github.com/apache/dubbo-website) - Apache Dubbo official website
+* [Dubbo Samples](https://github.com/apache/dubbo-samples) - samples for Apache Dubbo
+* [Dubbo Spring Boot](https://github.com/apache/dubbo-spring-boot-project) - Spring Boot Project for Dubbo
+* [Dubbo Admin](https://github.com/apache/dubbo-admin) - The reference implementation for Dubbo admin
+* [Dubbo Awesome](https://github.com/apache/dubbo-awesome) - Dubbo's slides and video links in Meetup
+
+#### Language
+
+* [Node.js](https://github.com/apache/dubbo-js)
+* [Python](https://github.com/dubbo/py-client-for-apache-dubbo)
+* [PHP](https://github.com/apache/dubbo-php-framework)
+* [Go](https://github.com/dubbo/dubbo-go)
+* [Erlang](https://github.com/apache/dubbo-erlang)
+
+## License
+
+Apache Dubbo is under the Apache 2.0 license. See the [LICENSE](https://github.com/apache/dubbo/blob/master/LICENSE) file for details.
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 0000000..ac0c2ad
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,31 @@
+# Security Policy
+
+## Supported Versions
+
+Below is a table that shows versions that accept security fix.
+
+| Version | Supported          |
+| ------- | ------------------ |
+| 2.7.x   | :white_check_mark: |
+| 2.6.x   | :white_check_mark: |
+| 2.5.x   | :x: |
+
+
+## Reporting a Vulnerability
+
+The Apache Software Foundation takes a rigorous standpoint in annihilating the security issues in its software projects. Apache Dubbo is highly sensitive and forthcoming to issues pertaining to its features and functionality.
+
+If you have apprehensions regarding Dubbo's security or you discover vulnerability or potential threat, don’t hesitate to get in touch with the Apache Dubbo Security Team by dropping a mail at security@dubbo.apache.org. In the mail, specify the description of the issue or potential threat. You are also urged to recommend the way to reproduce and replicate the issue. The Dubbo community will get back to you after assessing and analysing the findings.
+
+PLEASE PAY ATTENTION to report the security issue on the security email before disclosing it on public domain.
+
+## VULNERABILITY HANDLING
+
+An overview of the vulnerability handling process is:
+
+* The reporter reports the vulnerability privately to Apache.
+* The appropriate project's security team works privately with the reporter to resolve the vulnerability.
+* A new release of the Apache product concerned is made that includes the fix.
+* The vulnerability is publicly announced.
+
+A more detailed description of the process can be found [here](https://www.apache.org/security/committers.html).
diff --git a/codestyle/checkstyle-suppressions.xml b/codestyle/checkstyle-suppressions.xml
new file mode 100644
index 0000000..1817cf7
--- /dev/null
+++ b/codestyle/checkstyle-suppressions.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<!DOCTYPE suppressions PUBLIC
+        "-//Puppy Crawl//DTD Suppressions 1.1//EN"
+        "http://www.puppycrawl.com/dtds/suppressions_1_1.dtd">
+<suppressions>
+    <suppress files="[\\/]src[\\/]main[\\/]java[\\/]com[\\/]alibaba[\\/]com[\\/]caucho[\\/]hessian" checks=".*"/>
+    <suppress files="Yylex\.java" checks="AvoidEscapedUnicodeCharacters"/>
+</suppressions>
\ No newline at end of file
diff --git a/codestyle/checkstyle.xml b/codestyle/checkstyle.xml
new file mode 100644
index 0000000..050fbed
--- /dev/null
+++ b/codestyle/checkstyle.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0"?>
+<!DOCTYPE module PUBLIC
+        "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
+        "http://checkstyle.sourceforge.net/dtds/configuration_1_3.dtd">
+
+<module name="Checker">
+    <property name="charset" value="UTF-8"/>
+    <property name="fileExtensions" value="java"/>
+
+    <module name="Header">
+        <property name="headerFile" value="/checkstyle-header.txt"/>
+        <property name="fileExtensions" value="java"/>
+    </module>
+
+    <!-- TreeWalker Checks -->
+    <module name="TreeWalker">
+        <module name="SuppressWarningsHolder"/>
+
+        <module name="AvoidStarImport"/>
+        <module name="AvoidEscapedUnicodeCharacters">
+            <property name="allowEscapesForControlCharacters" value="true"/>
+            <property name="allowByTailComment" value="true"/>
+            <property name="allowNonPrintableEscapes" value="true"/>
+        </module>
+        <module name="NoLineWrap"/>
+        <module name="OuterTypeFilename"/>
+        <module name="UnusedImports"/>
+        <module name="RedundantImport"/>
+
+        <module name="EqualsHashCode"/>
+
+        <!--<module name="CustomImportOrder">-->
+        <!--<property name="specialImportsRegExp" value="org.apache.dubbo.*"/>-->
+        <!--<property name="sortImportsInGroupAlphabetically" value="false"/>-->
+        <!--<property name="customImportOrderRules" value="SPECIAL_IMPORTS###THIRD_PARTY_PACKAGE###STANDARD_JAVA_PACKAGE###STATIC"/>-->
+        <!--</module>-->
+    </module>
+</module>
diff --git a/codestyle/dubbo_codestyle_for_idea.xml b/codestyle/dubbo_codestyle_for_idea.xml
new file mode 100644
index 0000000..1f87caa
--- /dev/null
+++ b/codestyle/dubbo_codestyle_for_idea.xml
@@ -0,0 +1,16 @@
+<code_scheme name="dubbo_codestyle">
+    <option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="99"/>
+    <option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="99"/>
+    <option name="IMPORT_LAYOUT_TABLE">
+        <value>
+            <package name="org.apache.dubbo" withSubpackages="true" static="false"/>
+            <emptyLine/>
+            <package name="" withSubpackages="true" static="false"/>
+            <emptyLine/>
+            <package name="javax" withSubpackages="true" static="false"/>
+            <package name="java" withSubpackages="true" static="false"/>
+            <emptyLine/>
+            <package name="" withSubpackages="true" static="true"/>
+        </value>
+    </option>
+</code_scheme>
\ No newline at end of file
diff --git a/codestyle/manage_profiles.png b/codestyle/manage_profiles.png
new file mode 100644
index 0000000..1664d67
Binary files /dev/null and b/codestyle/manage_profiles.png differ
diff --git a/compiler/pom.xml b/compiler/pom.xml
new file mode 100644
index 0000000..c3d4201
--- /dev/null
+++ b/compiler/pom.xml
@@ -0,0 +1,237 @@
+<!--
+  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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache</groupId>
+        <artifactId>apache</artifactId>
+        <version>21</version>
+    </parent>
+
+    <groupId>org.apache.dubbo</groupId>
+    <artifactId>dubbo-compiler</artifactId>
+    <version>0.0.1</version>
+
+    <packaging>jar</packaging>
+
+    <properties>
+        <maven_compiler_version>3.6.0</maven_compiler_version>
+        <maven_jar_version>3.0.2</maven_jar_version>
+        <maven_source_version>3.0.1</maven_source_version>
+        <maven_javadoc_version>3.0.1</maven_javadoc_version>
+        <java_source_version>1.8</java_source_version>
+        <java_target_version>1.8</java_target_version>
+        <file_encoding>UTF-8</file_encoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.salesforce.servicelibs</groupId>
+            <artifactId>grpc-contrib</artifactId>
+            <version>0.8.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.salesforce.servicelibs</groupId>
+            <artifactId>jprotoc</artifactId>
+            <version>0.9.1</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>${maven_compiler_version}</version>
+                <configuration>
+                    <compilerArgument>-proc:none</compilerArgument>
+                    <fork>true</fork>
+                    <source>${java_source_version}</source>
+                    <target>${java_target_version}</target>
+                    <encoding>${file_encoding}</encoding>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <version>${maven_jar_version}</version>
+                <configuration>
+                    <archive>
+                        <manifest>
+                            <addClasspath>true</addClasspath>
+                            <mainClass>org.apache.dubbo.gen.grpc.DubboGrpcGenerator</mainClass>
+                        </manifest>
+                    </archive>
+                </configuration>
+            </plugin>
+
+            <!-- Optional, used to build directly executable packages (without using 'java -jar'),
+            for example 'artifactId-1.0.0-osx-x86_64.exe', 'artifactId-1.0.0-osx-x86_64.exe' -->
+            <plugin>
+                <groupId>com.salesforce.servicelibs</groupId>
+                <artifactId>canteen-maven-plugin</artifactId>
+                <version>1.0.0</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>bootstrap</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+    <profiles>
+        <profile>
+            <id>release</id>
+            <properties>
+                <log4j2_version>2.11.1</log4j2_version>
+            </properties>
+            <build>
+                <plugins>
+                    <plugin>
+                        <artifactId>maven-source-plugin</artifactId>
+                        <version>${maven_source_version}</version>
+                        <executions>
+                            <execution>
+                                <id>attach-sources</id>
+                                <goals>
+                                    <goal>jar</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <artifactId>maven-javadoc-plugin</artifactId>
+                        <version>${maven_javadoc_version}</version>
+                        <executions>
+                            <execution>
+                                <id>attach-javadoc</id>
+                                <goals>
+                                    <goal>jar</goal>
+                                    <goal>aggregate</goal>
+                                </goals>
+                                <configuration>
+                                    <additionalDependencies>
+                                        <additionalDependency>
+                                            <groupId>org.apache.logging.log4j</groupId>
+                                            <artifactId>log4j-api</artifactId>
+                                            <version>${log4j2_version}</version>
+                                        </additionalDependency>
+                                        <additionalDependency>
+                                            <groupId>org.apache.logging.log4j</groupId>
+                                            <artifactId>log4j-core</artifactId>
+                                            <version>${log4j2_version}</version>
+                                        </additionalDependency>
+                                    </additionalDependencies>
+                                </configuration>
+                            </execution>
+                        </executions>
+                        <configuration>
+                            <show>public</show>
+                            <charset>UTF-8</charset>
+                            <encoding>UTF-8</encoding>
+                            <docencoding>UTF-8</docencoding>
+                            <links>
+                                <link>http://docs.oracle.com/javase/8/docs/api</link>
+                            </links>
+                            <doclint>none</doclint>
+                            <excludePackageNames>
+                                org.apache.dubbo.demo,org.apache.dubbo.demo.*
+                            </excludePackageNames>
+                            <doctitle>Apache Dubbo ${project.version} API</doctitle>
+                            <windowtitle>Apache Dubbo ${project.version} API</windowtitle>
+                        </configuration>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-gpg-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <phase>verify</phase>
+                                <goals>
+                                    <goal>sign</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+
+    <name>dubbo-compiler</name>
+    <description>Dubbo customized RPC stub compiler.</description>
+    <url>https://github.com/apache/dubbo</url>
+    <inceptionYear>2011</inceptionYear>
+    <licenses>
+        <license>
+            <name>Apache License, Version 2.0</name>
+            <url>http://www.apache.org/licenses/LICENSE-2.0</url>
+            <distribution>repo</distribution>
+        </license>
+    </licenses>
+
+    <scm>
+        <url>https://github.com/apache/dubbo</url>
+        <connection>scm:git:https://github.com/apache/dubbo.git</connection>
+        <developerConnection>scm:git:https://github.com/apache/dubbo.git</developerConnection>
+        <tag>HEAD</tag>
+    </scm>
+    <mailingLists>
+        <mailingList>
+            <name>Development List</name>
+            <subscribe>dev-subscribe@dubbo.apache.org</subscribe>
+            <unsubscribe>dev-unsubscribe@dubbo.apache.org</unsubscribe>
+            <post>dev@dubbo.apache.org</post>
+        </mailingList>
+        <mailingList>
+            <name>Commits List</name>
+            <subscribe>commits-subscribe@dubbo.apache.org</subscribe>
+            <unsubscribe>commits-unsubscribe@dubbo.apache.org</unsubscribe>
+            <post>commits@dubbo.apache.org</post>
+        </mailingList>
+        <mailingList>
+            <name>Issues List</name>
+            <subscribe>issues-subscribe@dubbo.apache.org</subscribe>
+            <unsubscribe>issues-unsubscribe@dubbo.apache.org</unsubscribe>
+            <post>issues@dubbo.apache.org</post>
+        </mailingList>
+    </mailingLists>
+    <developers>
+        <developer>
+            <id>dubbo.io</id>
+            <name>The Dubbo Project Contributors</name>
+            <email>dev-subscribe@dubbo.apache.org</email>
+            <url>http://dubbo.apache.org/</url>
+        </developer>
+    </developers>
+
+    <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+    </organization>
+
+    <issueManagement>
+        <system>Github Issues</system>
+        <url>https://github.com/apache/dubbo/issues</url>
+    </issueManagement>
+</project>
\ No newline at end of file
diff --git a/compiler/src/main/java/org/apache/dubbo/gen/AbstractGenerator.java b/compiler/src/main/java/org/apache/dubbo/gen/AbstractGenerator.java
new file mode 100644
index 0000000..3e8dee1
--- /dev/null
+++ b/compiler/src/main/java/org/apache/dubbo/gen/AbstractGenerator.java
@@ -0,0 +1,293 @@
+/*
+ * 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.gen;
+
+import com.google.common.base.Strings;
+import com.google.common.html.HtmlEscapers;
+import com.google.protobuf.DescriptorProtos.FileDescriptorProto;
+import com.google.protobuf.DescriptorProtos.FileOptions;
+import com.google.protobuf.DescriptorProtos.MethodDescriptorProto;
+import com.google.protobuf.DescriptorProtos.ServiceDescriptorProto;
+import com.google.protobuf.DescriptorProtos.SourceCodeInfo.Location;
+import com.google.protobuf.compiler.PluginProtos;
+import com.salesforce.jprotoc.Generator;
+import com.salesforce.jprotoc.GeneratorException;
+import com.salesforce.jprotoc.ProtoTypeMap;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+public abstract class AbstractGenerator extends Generator {
+
+    private static final int SERVICE_NUMBER_OF_PATHS = 2;
+    private static final int METHOD_NUMBER_OF_PATHS = 4;
+
+    protected abstract String getClassPrefix();
+
+    protected abstract String getClassSuffix();
+
+    private String getServiceJavaDocPrefix() {
+        return "    ";
+    }
+
+    private String getMethodJavaDocPrefix() {
+        return "        ";
+    }
+
+    @Override
+    public List<PluginProtos.CodeGeneratorResponse.File> generateFiles(PluginProtos.CodeGeneratorRequest request) throws GeneratorException {
+        final ProtoTypeMap typeMap = ProtoTypeMap.of(request.getProtoFileList());
+
+        List<FileDescriptorProto> protosToGenerate = request.getProtoFileList().stream()
+                .filter(protoFile -> request.getFileToGenerateList().contains(protoFile.getName()))
+                .collect(Collectors.toList());
+
+        List<ServiceContext> services = findServices(protosToGenerate, typeMap);
+        return generateFiles(services);
+    }
+
+    private List<ServiceContext> findServices(List<FileDescriptorProto> protos, ProtoTypeMap typeMap) {
+        List<ServiceContext> contexts = new ArrayList<>();
+
+        protos.forEach(fileProto -> {
+            for (int serviceNumber = 0; serviceNumber < fileProto.getServiceCount(); serviceNumber++) {
+                ServiceContext serviceContext = buildServiceContext(
+                    fileProto.getService(serviceNumber),
+                    typeMap,
+                    fileProto.getSourceCodeInfo().getLocationList(),
+                    serviceNumber
+                );
+                serviceContext.protoName = fileProto.getName();
+                serviceContext.packageName = extractPackageName(fileProto);
+                contexts.add(serviceContext);
+            }
+        });
+
+        return contexts;
+    }
+
+    private String extractPackageName(FileDescriptorProto proto) {
+        FileOptions options = proto.getOptions();
+        if (options != null) {
+            String javaPackage = options.getJavaPackage();
+            if (!Strings.isNullOrEmpty(javaPackage)) {
+                return javaPackage;
+            }
+        }
+
+        return Strings.nullToEmpty(proto.getPackage());
+    }
+
+    private ServiceContext buildServiceContext(ServiceDescriptorProto serviceProto, ProtoTypeMap typeMap, List<Location> locations, int serviceNumber) {
+        ServiceContext serviceContext = new ServiceContext();
+        serviceContext.fileName = getClassPrefix() + serviceProto.getName() + getClassSuffix() + ".java";
+        serviceContext.className = getClassPrefix() + serviceProto.getName() + getClassSuffix();
+        serviceContext.serviceName = serviceProto.getName();
+        serviceContext.deprecated = serviceProto.getOptions() != null && serviceProto.getOptions().getDeprecated();
+
+        List<Location> allLocationsForService = locations.stream()
+                .filter(location ->
+                    location.getPathCount() >= 2 &&
+                       location.getPath(0) == FileDescriptorProto.SERVICE_FIELD_NUMBER &&
+                       location.getPath(1) == serviceNumber
+                )
+                .collect(Collectors.toList());
+
+        Location serviceLocation = allLocationsForService.stream()
+                .filter(location -> location.getPathCount() == SERVICE_NUMBER_OF_PATHS)
+                .findFirst()
+                .orElseGet(Location::getDefaultInstance);
+        serviceContext.javaDoc = getJavaDoc(getComments(serviceLocation), getServiceJavaDocPrefix());
+
+        for (int methodNumber = 0; methodNumber < serviceProto.getMethodCount(); methodNumber++) {
+            MethodContext methodContext = buildMethodContext(
+                serviceProto.getMethod(methodNumber),
+                typeMap,
+                locations,
+                methodNumber
+            );
+
+            serviceContext.methods.add(methodContext);
+            serviceContext.methodTypes.add(methodContext.inputType);
+            serviceContext.methodTypes.add(methodContext.outputType);
+        }
+        return serviceContext;
+    }
+
+    private MethodContext buildMethodContext(MethodDescriptorProto methodProto, ProtoTypeMap typeMap, List<Location> locations, int methodNumber) {
+        MethodContext methodContext = new MethodContext();
+        methodContext.methodName = lowerCaseFirst(methodProto.getName());
+        methodContext.inputType = typeMap.toJavaTypeName(methodProto.getInputType());
+        methodContext.outputType = typeMap.toJavaTypeName(methodProto.getOutputType());
+        methodContext.deprecated = methodProto.getOptions() != null && methodProto.getOptions().getDeprecated();
+        methodContext.isManyInput = methodProto.getClientStreaming();
+        methodContext.isManyOutput = methodProto.getServerStreaming();
+        methodContext.methodNumber = methodNumber;
+
+        Location methodLocation = locations.stream()
+                .filter(location ->
+                    location.getPathCount() == METHOD_NUMBER_OF_PATHS &&
+                        location.getPath(METHOD_NUMBER_OF_PATHS - 1) == methodNumber
+                )
+                .findFirst()
+                .orElseGet(Location::getDefaultInstance);
+        methodContext.javaDoc = getJavaDoc(getComments(methodLocation), getMethodJavaDocPrefix());
+
+        if (!methodProto.getClientStreaming() && !methodProto.getServerStreaming()) {
+            methodContext.reactiveCallsMethodName = "oneToOne";
+            methodContext.grpcCallsMethodName = "asyncUnaryCall";
+        }
+        if (!methodProto.getClientStreaming() && methodProto.getServerStreaming()) {
+            methodContext.reactiveCallsMethodName = "oneToMany";
+            methodContext.grpcCallsMethodName = "asyncServerStreamingCall";
+        }
+        if (methodProto.getClientStreaming() && !methodProto.getServerStreaming()) {
+            methodContext.reactiveCallsMethodName = "manyToOne";
+            methodContext.grpcCallsMethodName = "asyncClientStreamingCall";
+        }
+        if (methodProto.getClientStreaming() && methodProto.getServerStreaming()) {
+            methodContext.reactiveCallsMethodName = "manyToMany";
+            methodContext.grpcCallsMethodName = "asyncBidiStreamingCall";
+        }
+        return methodContext;
+    }
+
+    private String lowerCaseFirst(String s) {
+        return Character.toLowerCase(s.charAt(0)) + s.substring(1);
+    }
+
+    private List<PluginProtos.CodeGeneratorResponse.File> generateFiles(List<ServiceContext> services) {
+        return services.stream()
+                .map(this::buildFile)
+                .collect(Collectors.toList());
+    }
+
+    private PluginProtos.CodeGeneratorResponse.File buildFile(ServiceContext context) {
+        String content = applyTemplate(getClassPrefix() + getClassSuffix() + "Stub.mustache", context);
+        return PluginProtos.CodeGeneratorResponse.File
+                .newBuilder()
+                .setName(absoluteFileName(context))
+                .setContent(content)
+                .build();
+    }
+
+    private String absoluteFileName(ServiceContext ctx) {
+        String dir = ctx.packageName.replace('.', '/');
+        if (Strings.isNullOrEmpty(dir)) {
+            return ctx.fileName;
+        } else {
+            return dir + "/" + ctx.fileName;
+        }
+    }
+
+    private String getComments(Location location) {
+        return location.getLeadingComments().isEmpty() ? location.getTrailingComments() : location.getLeadingComments();
+    }
+
+    private String getJavaDoc(String comments, String prefix) {
+        if (!comments.isEmpty()) {
+            StringBuilder builder = new StringBuilder("/**\n")
+                    .append(prefix).append(" * <pre>\n");
+            Arrays.stream(HtmlEscapers.htmlEscaper().escape(comments).split("\n"))
+                    .map(line -> line.replace("*/", "&#42;&#47;").replace("*", "&#42;"))
+                    .forEach(line -> builder.append(prefix).append(" * ").append(line).append("\n"));
+            builder
+                    .append(prefix).append(" * </pre>\n")
+                    .append(prefix).append(" */");
+            return builder.toString();
+        }
+        return null;
+    }
+
+    /**
+     * Template class for proto Service objects.
+     */
+    private class ServiceContext {
+        // CHECKSTYLE DISABLE VisibilityModifier FOR 8 LINES
+        public String fileName;
+        public String protoName;
+        public String packageName;
+        public String className;
+        public String serviceName;
+        public boolean deprecated;
+        public String javaDoc;
+        public List<MethodContext> methods = new ArrayList<>();
+
+        public Set<String> methodTypes = new HashSet<>();
+
+        public List<MethodContext> unaryRequestMethods() {
+            return methods.stream().filter(m -> !m.isManyInput).collect(Collectors.toList());
+        }
+
+        public List<MethodContext> unaryMethods() {
+            return methods.stream().filter(m -> (!m.isManyInput && !m.isManyOutput)).collect(Collectors.toList());
+        }
+
+        public List<MethodContext> serverStreamingMethods() {
+            return methods.stream().filter(m -> !m.isManyInput && m.isManyOutput).collect(Collectors.toList());
+        }
+
+        public List<MethodContext> biStreamingMethods() {
+            return methods.stream().filter(m -> m.isManyInput).collect(Collectors.toList());
+        }
+    }
+
+    /**
+     * Template class for proto RPC objects.
+     */
+    private class MethodContext {
+        // CHECKSTYLE DISABLE VisibilityModifier FOR 10 LINES
+        public String methodName;
+        public String inputType;
+        public String outputType;
+        public boolean deprecated;
+        public boolean isManyInput;
+        public boolean isManyOutput;
+        public String reactiveCallsMethodName;
+        public String grpcCallsMethodName;
+        public int methodNumber;
+        public String javaDoc;
+
+        // This method mimics the upper-casing method ogf gRPC to ensure compatibility
+        // See https://github.com/grpc/grpc-java/blob/v1.8.0/compiler/src/java_plugin/cpp/java_generator.cpp#L58
+        public String methodNameUpperUnderscore() {
+            StringBuilder s = new StringBuilder();
+            for (int i = 0; i < methodName.length(); i++) {
+                char c = methodName.charAt(i);
+                s.append(Character.toUpperCase(c));
+                if ((i < methodName.length() - 1) && Character.isLowerCase(c) && Character.isUpperCase(methodName.charAt(i + 1))) {
+                    s.append('_');
+                }
+            }
+            return s.toString();
+        }
+
+        public String methodNamePascalCase() {
+            String mn = methodName.replace("_", "");
+            return String.valueOf(Character.toUpperCase(mn.charAt(0))) + mn.substring(1);
+        }
+
+        public String methodNameCamelCase() {
+            String mn = methodName.replace("_", "");
+            return String.valueOf(Character.toLowerCase(mn.charAt(0))) + mn.substring(1);
+        }
+    }
+}
diff --git a/compiler/src/main/java/org/apache/dubbo/gen/dubbo/DubboGenerator.java b/compiler/src/main/java/org/apache/dubbo/gen/dubbo/DubboGenerator.java
new file mode 100644
index 0000000..1c35f0a
--- /dev/null
+++ b/compiler/src/main/java/org/apache/dubbo/gen/dubbo/DubboGenerator.java
@@ -0,0 +1,42 @@
+/*
+ * 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.gen.dubbo;
+
+import org.apache.dubbo.gen.AbstractGenerator;
+
+import com.salesforce.jprotoc.ProtocPlugin;
+
+public class DubboGenerator extends AbstractGenerator {
+
+    public static void main(String[] args) {
+        if (args.length == 0) {
+            ProtocPlugin.generate(new DubboGenerator());
+        } else {
+            ProtocPlugin.debug(new DubboGenerator(), args[0]);
+        }
+    }
+
+    @Override
+    protected String getClassPrefix() {
+        return "";
+    }
+
+    @Override
+    protected String getClassSuffix() {
+        return "Dubbo";
+    }
+}
\ No newline at end of file
diff --git a/compiler/src/main/java/org/apache/dubbo/gen/grpc/DubboGrpcGenerator.java b/compiler/src/main/java/org/apache/dubbo/gen/grpc/DubboGrpcGenerator.java
new file mode 100644
index 0000000..dafdd5a
--- /dev/null
+++ b/compiler/src/main/java/org/apache/dubbo/gen/grpc/DubboGrpcGenerator.java
@@ -0,0 +1,41 @@
+/*
+ * 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.gen.grpc;
+
+import org.apache.dubbo.gen.AbstractGenerator;
+
+import com.salesforce.jprotoc.ProtocPlugin;
+
+public class DubboGrpcGenerator extends AbstractGenerator {
+
+    public static void main(String[] args) {
+        if (args.length == 0) {
+            ProtocPlugin.generate(new DubboGrpcGenerator());
+        } else {
+            ProtocPlugin.debug(new DubboGrpcGenerator(), args[0]);
+        }
+    }
+
+    @Override
+    protected String getClassPrefix() {
+        return "Dubbo";
+    }
+
+    protected String getClassSuffix() {
+        return "Grpc";
+    }
+}
diff --git a/compiler/src/main/java/org/apache/dubbo/gen/grpc/reactive/ReactorDubboGrpcGenerator.java b/compiler/src/main/java/org/apache/dubbo/gen/grpc/reactive/ReactorDubboGrpcGenerator.java
new file mode 100644
index 0000000..dd9520b
--- /dev/null
+++ b/compiler/src/main/java/org/apache/dubbo/gen/grpc/reactive/ReactorDubboGrpcGenerator.java
@@ -0,0 +1,42 @@
+/*
+ * 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.gen.grpc.reactive;
+
+import org.apache.dubbo.gen.AbstractGenerator;
+
+import com.salesforce.jprotoc.ProtocPlugin;
+
+public class ReactorDubboGrpcGenerator extends AbstractGenerator {
+
+    @Override
+    protected String getClassPrefix() {
+        return "ReactorDubbo";
+    }
+
+    @Override
+    protected String getClassSuffix() {
+        return "Grpc";
+    }
+
+    public static void main(String[] args) {
+        if (args.length == 0) {
+            ProtocPlugin.generate(new ReactorDubboGrpcGenerator());
+        } else {
+            ProtocPlugin.debug(new ReactorDubboGrpcGenerator(), args[0]);
+        }
+    }
+}
diff --git a/compiler/src/main/java/org/apache/dubbo/gen/grpc/reactive/RxDubboGrpcGenerator.java b/compiler/src/main/java/org/apache/dubbo/gen/grpc/reactive/RxDubboGrpcGenerator.java
new file mode 100644
index 0000000..028332a
--- /dev/null
+++ b/compiler/src/main/java/org/apache/dubbo/gen/grpc/reactive/RxDubboGrpcGenerator.java
@@ -0,0 +1,41 @@
+/*
+ * 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.gen.grpc.reactive;
+
+import org.apache.dubbo.gen.AbstractGenerator;
+
+import com.salesforce.jprotoc.ProtocPlugin;
+
+public class RxDubboGrpcGenerator extends AbstractGenerator {
+    @Override
+    protected String getClassPrefix() {
+        return "RxDubbo";
+    }
+
+    @Override
+    protected String getClassSuffix() {
+        return "Grpc";
+    }
+
+    public static void main(String[] args) {
+        if (args.length == 0) {
+            ProtocPlugin.generate(new RxDubboGrpcGenerator());
+        } else {
+            ProtocPlugin.debug(new RxDubboGrpcGenerator(), args[0]);
+        }
+    }
+}
diff --git a/compiler/src/main/resources/DubboGrpcStub.mustache b/compiler/src/main/resources/DubboGrpcStub.mustache
new file mode 100644
index 0000000..a02d0c4
--- /dev/null
+++ b/compiler/src/main/resources/DubboGrpcStub.mustache
@@ -0,0 +1,312 @@
+{{#packageName}}
+    package {{packageName}};
+{{/packageName}}
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.config.ReferenceConfigBase;
+
+import java.util.concurrent.TimeUnit;
+
+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_TIMEOUT;
+import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_KEY;
+
+import static {{packageName}}.{{serviceName}}Grpc.getServiceDescriptor;
+import static io.grpc.stub.ServerCalls.asyncUnaryCall;
+import static io.grpc.stub.ServerCalls.asyncServerStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncClientStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncBidiStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncUnimplementedStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall;
+
+{{#deprecated}}
+    @java.lang.Deprecated
+{{/deprecated}}
+@javax.annotation.Generated(
+value = "by DubboGrpc generator",
+comments = "Source: {{protoName}}")
+public final class {{className}} {
+private {{className}}() {}
+
+public static class Dubbo{{serviceName}}Stub implements I{{serviceName}} {
+
+protected URL url;
+protected ReferenceConfigBase<?> referenceConfig;
+
+protected {{serviceName}}Grpc.{{serviceName}}BlockingStub blockingStub;
+protected {{serviceName}}Grpc.{{serviceName}}FutureStub futureStub;
+protected {{serviceName}}Grpc.{{serviceName}}Stub stub;
+
+public Dubbo{{serviceName}}Stub(io.grpc.Channel channel, io.grpc.CallOptions callOptions, URL url, ReferenceConfigBase<?> referenceConfig) {
+this.url = url;
+this.referenceConfig = referenceConfig;
+
+blockingStub = {{serviceName}}Grpc.newBlockingStub(channel).build(channel, callOptions);
+futureStub = {{serviceName}}Grpc.newFutureStub(channel).build(channel, callOptions);
+stub = {{serviceName}}Grpc.newStub(channel).build(channel, callOptions);
+}
+
+{{#unaryMethods}}
+    {{#javaDoc}}
+        {{{javaDoc}}}
+    {{/javaDoc}}
+    {{#deprecated}}
+        @java.lang.Deprecated
+    {{/deprecated}}
+    public {{outputType}} {{methodName}}({{inputType}} request) {
+    return blockingStub
+    .withDeadlineAfter(url.getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT), TimeUnit.MILLISECONDS)
+    .{{methodName}}(request);
+    }
+
+    public com.google.common.util.concurrent.ListenableFuture<{{outputType}}> {{methodName}}Async({{inputType}} request) {
+    return futureStub
+    .withDeadlineAfter(url.getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT), TimeUnit.MILLISECONDS)
+    .{{methodName}}(request);
+    }
+
+    public void {{methodName}}({{inputType}} request, io.grpc.stub.StreamObserver<{{outputType}}> responseObserver){
+    stub
+    .withDeadlineAfter(url.getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT), TimeUnit.MILLISECONDS)
+    .{{methodName}}(request, responseObserver);
+    }
+
+{{/unaryMethods}}
+{{#serverStreamingMethods}}
+    {{#javaDoc}}
+        {{{javaDoc}}}
+    {{/javaDoc}}
+    {{#deprecated}}
+        @java.lang.Deprecated
+    {{/deprecated}}
+    public java.util.Iterator<{{outputType}}> {{methodName}}({{inputType}} request) {
+    return blockingStub
+    .withDeadlineAfter(url.getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT), TimeUnit.MILLISECONDS)
+    .{{methodName}}(request);
+    }
+
+    public void {{methodName}}({{inputType}} request, io.grpc.stub.StreamObserver<{{outputType}}> responseObserver) {
+    stub
+    .withDeadlineAfter(url.getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT), TimeUnit.MILLISECONDS)
+    .{{methodName}}(request, responseObserver);
+    }
+
+{{/serverStreamingMethods}}
+{{#biStreamingMethods}}
+    {{#javaDoc}}
+        {{{javaDoc}}}
+    {{/javaDoc}}
+    {{#deprecated}}
+        @java.lang.Deprecated
+    {{/deprecated}}
+    public io.grpc.stub.StreamObserver<{{inputType}}> {{methodName}}(io.grpc.stub.StreamObserver<{{outputType}}> responseObserver) {
+    return stub
+    .withDeadlineAfter(url.getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT), TimeUnit.MILLISECONDS)
+    .{{methodName}}(responseObserver);
+    }
+{{/biStreamingMethods}}
+}
+
+public static Dubbo{{serviceName}}Stub getDubboStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions, URL url, ReferenceConfigBase<?> referenceConfig) {
+return new Dubbo{{serviceName}}Stub(channel, callOptions, url, referenceConfig);
+}
+
+public interface I{{serviceName}} {
+{{#unaryMethods}}
+    {{#javaDoc}}
+        {{{javaDoc}}}
+    {{/javaDoc}}
+    {{#deprecated}}
+        @java.lang.Deprecated
+    {{/deprecated}}
+    default public {{outputType}} {{methodName}}({{inputType}} request) {
+    throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+    }
+
+    {{#javaDoc}}
+        {{{javaDoc}}}
+    {{/javaDoc}}
+    {{#deprecated}}
+        @java.lang.Deprecated
+    {{/deprecated}}
+    default public com.google.common.util.concurrent.ListenableFuture<{{outputType}}> {{methodName}}Async({{inputType}} request) {
+    throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+    }
+
+    {{#javaDoc}}
+        {{{javaDoc}}}
+    {{/javaDoc}}
+    {{#deprecated}}
+        @java.lang.Deprecated
+    {{/deprecated}}
+    public void {{methodName}}({{inputType}} request, io.grpc.stub.StreamObserver<{{outputType}}> responseObserver);
+
+{{/unaryMethods}}
+{{#serverStreamingMethods}}
+    {{#javaDoc}}
+        {{{javaDoc}}}
+    {{/javaDoc}}
+    {{#deprecated}}
+        @java.lang.Deprecated
+    {{/deprecated}}
+    default public java.util.Iterator<{{outputType}}> {{methodName}}({{inputType}} request) {
+    throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+    }
+
+    {{#javaDoc}}
+        {{{javaDoc}}}
+    {{/javaDoc}}
+    {{#deprecated}}
+        @java.lang.Deprecated
+    {{/deprecated}}
+    public void {{methodName}}({{inputType}} request, io.grpc.stub.StreamObserver<{{outputType}}> responseObserver);
+
+{{/serverStreamingMethods}}
+{{#biStreamingMethods}}
+    {{#javaDoc}}
+        {{{javaDoc}}}
+    {{/javaDoc}}
+    {{#deprecated}}
+        @java.lang.Deprecated
+    {{/deprecated}}
+    public io.grpc.stub.StreamObserver<{{inputType}}> {{methodName}}(io.grpc.stub.StreamObserver<{{outputType}}> responseObserver);
+
+{{/biStreamingMethods}}
+}
+
+{{#javaDoc}}
+    {{{javaDoc}}}
+{{/javaDoc}}
+public static abstract class {{serviceName}}ImplBase implements io.grpc.BindableService, I{{serviceName}} {
+
+private I{{serviceName}} proxiedImpl;
+
+public final void setProxiedImpl(I{{serviceName}} proxiedImpl) {
+this.proxiedImpl = proxiedImpl;
+}
+
+{{#unaryMethods}}
+    {{#javaDoc}}
+        {{{javaDoc}}}
+    {{/javaDoc}}
+    {{#deprecated}}
+        @java.lang.Deprecated
+    {{/deprecated}}
+    @java.lang.Override
+    public final {{outputType}} {{methodName}}({{inputType}} request) {
+    throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+    }
+
+    {{#javaDoc}}
+        {{{javaDoc}}}
+    {{/javaDoc}}
+    {{#deprecated}}
+        @java.lang.Deprecated
+    {{/deprecated}}
+    @java.lang.Override
+    public final com.google.common.util.concurrent.ListenableFuture<{{outputType}}> {{methodName}}Async({{inputType}} request) {
+    throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+    }
+
+{{/unaryMethods}}
+{{#serverStreamingMethods}}
+    {{#javaDoc}}
+        {{{javaDoc}}}
+    {{/javaDoc}}
+    {{#deprecated}}
+        @java.lang.Deprecated
+    {{/deprecated}}
+    @java.lang.Override
+    public final java.util.Iterator<{{outputType}}> {{methodName}}({{inputType}} request) {
+    throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+    }
+
+{{/serverStreamingMethods}}
+{{#methods}}
+    {{#isManyInput}}
+        public io.grpc.stub.StreamObserver<{{inputType}}> {{methodName}}(
+        io.grpc.stub.StreamObserver<{{outputType}}> responseObserver) {
+        return asyncUnimplementedStreamingCall({{packageName}}.{{serviceName}}Grpc.get{{methodNamePascalCase}}Method(), responseObserver);
+        }
+    {{/isManyInput}}{{^isManyInput}}
+        public void {{methodName}}({{inputType}} request,
+        io.grpc.stub.StreamObserver<{{outputType}}> responseObserver) {
+        asyncUnimplementedUnaryCall({{packageName}}.{{serviceName}}Grpc.get{{methodNamePascalCase}}Method(), responseObserver);
+        }
+    {{/isManyInput}}
+{{/methods}}
+
+@java.lang.Override public final io.grpc.ServerServiceDefinition bindService() {
+return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor())
+{{#methods}}
+    .addMethod(
+    {{packageName}}.{{serviceName}}Grpc.get{{methodNamePascalCase}}Method(),
+    {{grpcCallsMethodName}}(
+    new MethodHandlers<
+    {{inputType}},
+    {{outputType}}>(
+    proxiedImpl, METHODID_{{methodNameUpperUnderscore}})))
+{{/methods}}
+.build();
+}
+}
+{{#methods}}
+    private static final int METHODID_{{methodNameUpperUnderscore}} = {{methodNumber}};
+{{/methods}}
+
+private static final class MethodHandlers
+<Req, Resp> implements
+io.grpc.stub.ServerCalls.UnaryMethod
+<Req, Resp>,
+io.grpc.stub.ServerCalls.ServerStreamingMethod
+<Req, Resp>,
+io.grpc.stub.ServerCalls.ClientStreamingMethod
+<Req, Resp>,
+io.grpc.stub.ServerCalls.BidiStreamingMethod
+<Req, Resp> {
+private final I{{serviceName}} serviceImpl;
+private final int methodId;
+
+MethodHandlers(I{{serviceName}} serviceImpl, int methodId) {
+this.serviceImpl = serviceImpl;
+this.methodId = methodId;
+}
+
+@java.lang.Override
+@java.lang.SuppressWarnings("unchecked")
+public void invoke(Req request, io.grpc.stub.StreamObserver
+<Resp> responseObserver) {
+    switch (methodId) {
+    {{#methods}}
+        {{^isManyInput}}
+            case METHODID_{{methodNameUpperUnderscore}}:
+            serviceImpl.{{methodName}}(({{inputType}}) request,
+            (io.grpc.stub.StreamObserver<{{outputType}}>) responseObserver);
+            break;
+        {{/isManyInput}}
+    {{/methods}}
+    default:
+    throw new java.lang.AssertionError();
+    }
+    }
+
+    @java.lang.Override
+    @java.lang.SuppressWarnings("unchecked")
+    public io.grpc.stub.StreamObserver
+    <Req> invoke(io.grpc.stub.StreamObserver
+        <Resp> responseObserver) {
+            switch (methodId) {
+            {{#methods}}
+                {{#isManyInput}}
+                    case METHODID_{{methodNameUpperUnderscore}}:
+                    return (io.grpc.stub.StreamObserver
+                <Req>) serviceImpl.{{methodName}}(
+                    (io.grpc.stub.StreamObserver<{{outputType}}>) responseObserver);
+                {{/isManyInput}}
+            {{/methods}}
+            default:
+            throw new java.lang.AssertionError();
+            }
+            }
+            }
+
+            }
diff --git a/compiler/src/main/resources/DubboStub.mustache b/compiler/src/main/resources/DubboStub.mustache
new file mode 100644
index 0000000..06bd7b4
--- /dev/null
+++ b/compiler/src/main/resources/DubboStub.mustache
@@ -0,0 +1,53 @@
+{{#packageName}}
+    package {{packageName}};
+{{/packageName}}
+
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+{{#deprecated}}
+    @java.lang.Deprecated
+{{/deprecated}}
+@javax.annotation.Generated(
+value = "by Dubbo generator",
+comments = "Source: {{protoName}}")
+public final class {{className}} {
+private static final AtomicBoolean registered = new AtomicBoolean();
+
+private static Class<?> init() {
+Class<?> clazz = null;
+try {
+clazz = Class.forName({{serviceName}}Dubbo.class.getName());
+if (registered.compareAndSet(false, true)) {
+{{#methodTypes}}
+    org.apache.dubbo.common.serialize.protobuf.support.ProtobufUtils.marshaller(
+    {{.}}.getDefaultInstance());
+{{/methodTypes}}
+}
+} catch (ClassNotFoundException e) {
+// ignore
+}
+return clazz;
+}
+
+private {{serviceName}}Dubbo() {}
+
+public static final String SERVICE_NAME = "{{packageName}}.{{serviceName}}";
+
+/**
+* Code generated for Dubbo
+*/
+public interface I{{serviceName}} {
+
+static Class<?> clazz = init();
+
+{{#methods}}
+    {{outputType}} {{methodName}}({{inputType}} request);
+
+    CompletableFuture<{{outputType}}> {{methodName}}Async({{inputType}} request);
+
+{{/methods}}
+
+}
+
+}
diff --git a/compiler/src/main/resources/ReactorDubboGrpcStub.mustache b/compiler/src/main/resources/ReactorDubboGrpcStub.mustache
new file mode 100644
index 0000000..2cf1471
--- /dev/null
+++ b/compiler/src/main/resources/ReactorDubboGrpcStub.mustache
@@ -0,0 +1,212 @@
+{{#packageName}}
+    package {{packageName}};
+{{/packageName}}
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.config.ReferenceConfigBase;
+
+import java.util.concurrent.TimeUnit;
+
+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_TIMEOUT;
+import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_KEY;
+
+import static {{packageName}}.{{serviceName}}Grpc.getServiceDescriptor;
+import static io.grpc.stub.ServerCalls.asyncUnaryCall;
+import static io.grpc.stub.ServerCalls.asyncServerStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncClientStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncBidiStreamingCall;
+
+
+{{#deprecated}}
+    @java.lang.Deprecated
+{{/deprecated}}
+@javax.annotation.Generated(
+value = "by ReactorDubboGrpc generator",
+comments = "Source: {{protoName}}")
+public final class {{className}} {
+private {{className}}() {}
+
+public static ReactorDubbo{{serviceName}}Stub getDubboStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions, URL url, ReferenceConfigBase<?> referenceConfig) {
+return new ReactorDubbo{{serviceName}}Stub(channel, callOptions, url, referenceConfig);
+}
+
+{{#javaDoc}}
+    {{{javaDoc}}}
+{{/javaDoc}}
+public static final class ReactorDubbo{{serviceName}}Stub implements IReactor{{serviceName}} {
+
+protected URL url;
+protected ReferenceConfigBase<?> referenceConfig;
+
+protected {{serviceName}}Grpc.{{serviceName}}Stub stub;
+
+public ReactorDubbo{{serviceName}}Stub(io.grpc.Channel channel, io.grpc.CallOptions callOptions, URL url, ReferenceConfigBase<?> referenceConfig) {
+this.url = url;
+this.referenceConfig = referenceConfig;
+stub = {{serviceName}}Grpc.newStub(channel).build(channel, callOptions);
+}
+
+{{#methods}}
+    {{#javaDoc}}
+        {{{javaDoc}}}
+    {{/javaDoc}}
+    {{#deprecated}}
+        @java.lang.Deprecated
+    {{/deprecated}}
+    public {{#isManyOutput}}reactor.core.publisher.Flux{{/isManyOutput}}{{^isManyOutput}}reactor.core.publisher.Mono{{/isManyOutput}}<{{outputType}}> {{methodName}}({{#isManyInput}}reactor.core.publisher.Flux{{/isManyInput}}{{^isManyInput}}reactor.core.publisher.Mono{{/isManyInput}}<{{inputType}}> reactorRequest) {
+    {{serviceName}}Grpc.{{serviceName}}Stub localStub = stub.withDeadlineAfter(url.getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT), TimeUnit.MILLISECONDS);
+    return com.salesforce.reactorgrpc.stub.ClientCalls.{{reactiveCallsMethodName}}(reactorRequest, localStub::{{methodName}});
+    }
+
+{{/methods}}
+{{#unaryRequestMethods}}
+    {{#javaDoc}}
+        {{{javaDoc}}}
+    {{/javaDoc}}
+    {{#deprecated}}
+        @java.lang.Deprecated
+    {{/deprecated}}
+    public {{#isManyOutput}}reactor.core.publisher.Flux{{/isManyOutput}}{{^isManyOutput}}reactor.core.publisher.Mono{{/isManyOutput}}<{{outputType}}> {{methodName}}({{inputType}} reactorRequest) {
+    {{serviceName}}Grpc.{{serviceName}}Stub localStub = stub.withDeadlineAfter(url.getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT), TimeUnit.MILLISECONDS);
+    return com.salesforce.reactorgrpc.stub.ClientCalls.{{reactiveCallsMethodName}}(reactor.core.publisher.Mono.just(reactorRequest), localStub::{{methodName}});
+    }
+
+{{/unaryRequestMethods}}
+}
+
+public interface IReactor{{serviceName}} {
+{{#methods}}
+    {{#javaDoc}}
+        {{{javaDoc}}}
+    {{/javaDoc}}
+    {{#deprecated}}
+        @java.lang.Deprecated
+    {{/deprecated}}
+    public {{#isManyOutput}}reactor.core.publisher.Flux{{/isManyOutput}}{{^isManyOutput}}reactor.core.publisher.Mono{{/isManyOutput}}<{{outputType}}> {{methodName}}({{#isManyInput}}reactor.core.publisher.Flux{{/isManyInput}}{{^isManyInput}}reactor.core.publisher.Mono{{/isManyInput}}<{{inputType}}> reactorRequest);
+
+{{/methods}}
+{{#unaryRequestMethods}}
+    {{#javaDoc}}
+        {{{javaDoc}}}
+    {{/javaDoc}}
+    {{#deprecated}}
+        @java.lang.Deprecated
+    {{/deprecated}}
+    public {{#isManyOutput}}reactor.core.publisher.Flux{{/isManyOutput}}{{^isManyOutput}}reactor.core.publisher.Mono{{/isManyOutput}}<{{outputType}}> {{methodName}}({{inputType}} reactorRequest);
+
+{{/unaryRequestMethods}}
+}
+
+{{#javaDoc}}
+    {{{javaDoc}}}
+{{/javaDoc}}
+public static abstract class {{serviceName}}ImplBase implements IReactor{{serviceName}}, io.grpc.BindableService {
+
+private IReactor{{serviceName}} proxiedImpl;
+
+public final void setProxiedImpl(IReactor{{serviceName}} proxiedImpl) {
+this.proxiedImpl = proxiedImpl;
+}
+
+{{#unaryRequestMethods}}
+    {{#javaDoc}}
+        {{{javaDoc}}}
+    {{/javaDoc}}
+    {{#deprecated}}
+        @java.lang.Deprecated
+    {{/deprecated}}
+    public final {{#isManyOutput}}reactor.core.publisher.Flux{{/isManyOutput}}{{^isManyOutput}}reactor.core.publisher.Mono{{/isManyOutput}}<{{outputType}}> {{methodName}}({{inputType}} reactorRequest) {
+    throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+    }
+
+{{/unaryRequestMethods}}
+{{#methods}}
+    {{#javaDoc}}
+        {{{javaDoc}}}
+    {{/javaDoc}}
+    {{#deprecated}}
+        @java.lang.Deprecated
+    {{/deprecated}}
+    public {{#isManyOutput}}reactor.core.publisher.Flux{{/isManyOutput}}{{^isManyOutput}}reactor.core.publisher.Mono{{/isManyOutput}}<{{outputType}}> {{methodName}}({{#isManyInput}}reactor.core.publisher.Flux{{/isManyInput}}{{^isManyInput}}reactor.core.publisher.Mono{{/isManyInput}}<{{inputType}}> request) {
+    throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
+    }
+
+{{/methods}}
+@java.lang.Override public final io.grpc.ServerServiceDefinition bindService() {
+return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor())
+{{#methods}}
+    .addMethod(
+    {{packageName}}.{{serviceName}}Grpc.get{{methodNamePascalCase}}Method(),
+    {{grpcCallsMethodName}}(
+    new MethodHandlers<
+    {{inputType}},
+    {{outputType}}>(
+    proxiedImpl, METHODID_{{methodNameUpperUnderscore}})))
+{{/methods}}
+.build();
+}
+}
+
+{{#methods}}
+    private static final int METHODID_{{methodNameUpperUnderscore}} = {{methodNumber}};
+{{/methods}}
+
+private static final class MethodHandlers
+<Req, Resp> implements
+io.grpc.stub.ServerCalls.UnaryMethod
+<Req, Resp>,
+io.grpc.stub.ServerCalls.ServerStreamingMethod
+<Req, Resp>,
+io.grpc.stub.ServerCalls.ClientStreamingMethod
+<Req, Resp>,
+io.grpc.stub.ServerCalls.BidiStreamingMethod
+<Req, Resp> {
+private final IReactor{{serviceName}} serviceImpl;
+private final int methodId;
+
+MethodHandlers(IReactor{{serviceName}} serviceImpl, int methodId) {
+this.serviceImpl = serviceImpl;
+this.methodId = methodId;
+}
+
+@java.lang.Override
+@java.lang.SuppressWarnings("unchecked")
+public void invoke(Req request, io.grpc.stub.StreamObserver
+<Resp> responseObserver) {
+    switch (methodId) {
+    {{#methods}}
+        {{^isManyInput}}
+            case METHODID_{{methodNameUpperUnderscore}}:
+            com.salesforce.reactorgrpc.stub.ServerCalls.{{reactiveCallsMethodName}}(({{inputType}}) request,
+            (io.grpc.stub.StreamObserver<{{outputType}}>) responseObserver,
+            serviceImpl::{{methodName}});
+            break;
+        {{/isManyInput}}
+    {{/methods}}
+    default:
+    throw new java.lang.AssertionError();
+    }
+    }
+
+    @java.lang.Override
+    @java.lang.SuppressWarnings("unchecked")
+    public io.grpc.stub.StreamObserver
+    <Req> invoke(io.grpc.stub.StreamObserver
+        <Resp> responseObserver) {
+            switch (methodId) {
+            {{#methods}}
+                {{#isManyInput}}
+                    case METHODID_{{methodNameUpperUnderscore}}:
+                    return (io.grpc.stub.StreamObserver
+                <Req>) com.salesforce.reactorgrpc.stub.ServerCalls.{{reactiveCallsMethodName}}(
+                    (io.grpc.stub.StreamObserver<{{outputType}}>) responseObserver,
+                    serviceImpl::{{methodName}});
+                {{/isManyInput}}
+            {{/methods}}
+            default:
+            throw new java.lang.AssertionError();
+            }
+            }
+            }
+
+            }
diff --git a/compiler/src/main/resources/RxDubboGrpcStub.mustache b/compiler/src/main/resources/RxDubboGrpcStub.mustache
new file mode 100644
index 0000000..22c06b0
--- /dev/null
+++ b/compiler/src/main/resources/RxDubboGrpcStub.mustache
@@ -0,0 +1,246 @@
+{{#packageName}}
+    package {{packageName}};
+{{/packageName}}
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.config.ReferenceConfigBase;
+
+import java.util.concurrent.TimeUnit;
+
+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_TIMEOUT;
+import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_KEY;
+
+import static {{packageName}}.{{serviceName}}Grpc.getServiceDescriptor;
+import static io.grpc.stub.ServerCalls.asyncUnaryCall;
+import static io.grpc.stub.ServerCalls.asyncServerStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncClientStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncBidiStreamingCall;
+
+
+{{#deprecated}}
+    @java.lang.Deprecated
+{{/deprecated}}
+@javax.annotation.Generated(
+value = "by RxDubboGrpc generator",
+comments = "Source: {{protoName}}")
+public final class {{className}} {
+private {{className}}() {}
+
+public static RxDubbo{{serviceName}}Stub getDubboStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions, URL url, ReferenceConfigBase<?> referenceConfig) {
+return new RxDubbo{{serviceName}}Stub(channel, callOptions, url, referenceConfig);
+}
+
+{{#javaDoc}}
+    {{{javaDoc}}}
+{{/javaDoc}}
+public static final class RxDubbo{{serviceName}}Stub implements IRx{{serviceName}} {
+
+protected URL url;
+protected ReferenceConfigBase<?> referenceConfig;
+
+protected {{serviceName}}Grpc.{{serviceName}}Stub stub;
+
+public RxDubbo{{serviceName}}Stub(io.grpc.Channel channel, io.grpc.CallOptions callOptions, URL url, ReferenceConfigBase<?> referenceConfig) {
+this.url = url;
+this.referenceConfig = referenceConfig;
+stub = {{serviceName}}Grpc.newStub(channel).build(channel, callOptions);
+}
+
+{{#methods}}
+    {{#javaDoc}}
+        {{{javaDoc}}}
+    {{/javaDoc}}
+    {{#deprecated}}
+        @java.lang.Deprecated
+    {{/deprecated}}
+    public {{#isManyOutput}}io.reactivex.Flowable{{/isManyOutput}}{{^isManyOutput}}io.reactivex.Single{{/isManyOutput}}<{{outputType}}> {{methodName}}({{#isManyInput}}io.reactivex.Flowable{{/isManyInput}}{{^isManyInput}}io.reactivex.Single{{/isManyInput}}<{{inputType}}> rxRequest) {
+    return com.salesforce.rxgrpc.stub.ClientCalls.{{reactiveCallsMethodName}}(rxRequest,
+    {{^isManyInput}}
+        new com.salesforce.reactivegrpc.common.BiConsumer<{{inputType}}, io.grpc.stub.StreamObserver<{{outputType}}>>() {
+        @java.lang.Override
+        public void accept({{inputType}} request, io.grpc.stub.StreamObserver<{{outputType}}> observer) {
+        stub.withDeadlineAfter(url.getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT), TimeUnit.MILLISECONDS).{{methodNameCamelCase}}(request, observer);
+        }
+        });
+    {{/isManyInput}}
+    {{#isManyInput}}
+        new com.salesforce.reactivegrpc.common.Function
+        <io.grpc.stub.StreamObserver<{{outputType}}>, io.grpc.stub.StreamObserver<{{inputType}}>>() {
+        @java.lang.Override
+        public io.grpc.stub.StreamObserver<{{inputType}}> apply(io.grpc.stub.StreamObserver<{{outputType}}> observer) {
+        return stub.withDeadlineAfter(url.getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT), TimeUnit.MILLISECONDS).{{methodNameCamelCase}}(observer);
+        }
+        });
+    {{/isManyInput}}
+    }
+
+{{/methods}}
+{{#unaryRequestMethods}}
+    {{#javaDoc}}
+        {{{javaDoc}}}
+    {{/javaDoc}}
+    {{#deprecated}}
+        @java.lang.Deprecated
+    {{/deprecated}}
+    public {{#isManyOutput}}io.reactivex.Flowable{{/isManyOutput}}{{^isManyOutput}}io.reactivex.Single{{/isManyOutput}}<{{outputType}}> {{methodName}}({{inputType}} rxRequest) {
+    return com.salesforce.rxgrpc.stub.ClientCalls.{{reactiveCallsMethodName}}(io.reactivex.Single.just(rxRequest),
+    new com.salesforce.reactivegrpc.common.BiConsumer<{{inputType}}, io.grpc.stub.StreamObserver<{{outputType}}>>() {
+    @java.lang.Override
+    public void accept({{inputType}} request, io.grpc.stub.StreamObserver<{{outputType}}> observer) {
+    stub.withDeadlineAfter(url.getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT), TimeUnit.MILLISECONDS).{{methodNameCamelCase}}(request, observer);
+    }
+    });
+    }
+
+{{/unaryRequestMethods}}
+}
+
+public interface IRx{{serviceName}} {
+{{#methods}}
+    {{#javaDoc}}
+        {{{javaDoc}}}
+    {{/javaDoc}}
+    {{#deprecated}}
+        @java.lang.Deprecated
+    {{/deprecated}}
+    public {{#isManyOutput}}io.reactivex.Flowable{{/isManyOutput}}{{^isManyOutput}}io.reactivex.Single{{/isManyOutput}}<{{outputType}}> {{methodName}}({{#isManyInput}}io.reactivex.Flowable{{/isManyInput}}{{^isManyInput}}io.reactivex.Single{{/isManyInput}}<{{inputType}}> rxRequest);
+
+{{/methods}}
+{{#unaryRequestMethods}}
+    {{#javaDoc}}
+        {{{javaDoc}}}
+    {{/javaDoc}}
+    {{#deprecated}}
+        @java.lang.Deprecated
+    {{/deprecated}}
+    public {{#isManyOutput}}io.reactivex.Flowable{{/isManyOutput}}{{^isManyOutput}}io.reactivex.Single{{/isManyOutput}}<{{outputType}}> {{methodName}}({{inputType}} rxRequest);
+
+{{/unaryRequestMethods}}
+}
+
+
+{{#javaDoc}}
+    {{{javaDoc}}}
+{{/javaDoc}}
+public static abstract class {{serviceName}}ImplBase implements IRx{{serviceName}}, io.grpc.BindableService {
+
+private IRx{{serviceName}} proxiedImpl;
+
+public final void setProxiedImpl(IRx{{serviceName}} proxiedImpl) {
+this.proxiedImpl = proxiedImpl;
+}
+{{#unaryRequestMethods}}
+    {{#javaDoc}}
+        {{{javaDoc}}}
+    {{/javaDoc}}
+    {{#deprecated}}
+        @java.lang.Deprecated
+    {{/deprecated}}
+    public final {{#isManyOutput}}io.reactivex.Flowable{{/isManyOutput}}{{^isManyOutput}}io.reactivex.Single{{/isManyOutput}}<{{outputType}}> {{methodName}}({{inputType}} rxRequest) {
+    throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+    }
+
+{{/unaryRequestMethods}}
+{{#methods}}
+    {{#javaDoc}}
+        {{{javaDoc}}}
+    {{/javaDoc}}
+    {{#deprecated}}
+        @java.lang.Deprecated
+    {{/deprecated}}
+    public {{#isManyOutput}}io.reactivex.Flowable{{/isManyOutput}}{{^isManyOutput}}io.reactivex.Single{{/isManyOutput}}<{{outputType}}> {{methodNameCamelCase}}({{#isManyInput}}io.reactivex.Flowable{{/isManyInput}}{{^isManyInput}}io.reactivex.Single{{/isManyInput}}<{{inputType}}> request) {
+    throw new io.grpc.StatusRuntimeException(io.grpc.Status.UNIMPLEMENTED);
+    }
+
+{{/methods}}
+@java.lang.Override public final io.grpc.ServerServiceDefinition bindService() {
+return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor())
+{{#methods}}
+    .addMethod(
+    {{packageName}}.{{serviceName}}Grpc.get{{methodNamePascalCase}}Method(),
+    {{grpcCallsMethodName}}(
+    new MethodHandlers<
+    {{inputType}},
+    {{outputType}}>(
+    proxiedImpl, METHODID_{{methodNameUpperUnderscore}})))
+{{/methods}}
+.build();
+}
+}
+
+{{#methods}}
+    private static final int METHODID_{{methodNameUpperUnderscore}} = {{methodNumber}};
+{{/methods}}
+
+private static final class MethodHandlers
+<Req, Resp> implements
+io.grpc.stub.ServerCalls.UnaryMethod
+<Req, Resp>,
+io.grpc.stub.ServerCalls.ServerStreamingMethod
+<Req, Resp>,
+io.grpc.stub.ServerCalls.ClientStreamingMethod
+<Req, Resp>,
+io.grpc.stub.ServerCalls.BidiStreamingMethod
+<Req, Resp> {
+private final IRx{{serviceName}} serviceImpl;
+private final int methodId;
+
+MethodHandlers(IRx{{serviceName}} serviceImpl, int methodId) {
+this.serviceImpl = serviceImpl;
+this.methodId = methodId;
+}
+
+@java.lang.Override
+@java.lang.SuppressWarnings("unchecked")
+public void invoke(Req request, io.grpc.stub.StreamObserver
+<Resp> responseObserver) {
+    switch (methodId) {
+    {{#methods}}
+        {{^isManyInput}}
+            case METHODID_{{methodNameUpperUnderscore}}:
+            com.salesforce.rxgrpc.stub.ServerCalls.{{reactiveCallsMethodName}}(({{inputType}}) request,
+            (io.grpc.stub.StreamObserver<{{outputType}}>) responseObserver,
+            new com.salesforce.reactivegrpc.common.Function
+                <{{#isManyInput}}io.reactivex.Flowable{{/isManyInput}}{{^isManyInput}}io.reactivex.Single{{/isManyInput}}
+            <{{inputType}}>, {{#isManyOutput}}
+            io.reactivex.Flowable{{/isManyOutput}}{{^isManyOutput}}
+            io.reactivex.Single{{/isManyOutput}}<{{outputType}}>>() {
+            @java.lang.Override
+            public {{#isManyOutput}}
+            io.reactivex.Flowable{{/isManyOutput}}{{^isManyOutput}}
+            io.reactivex.Single{{/isManyOutput}}<{{outputType}}> apply({{#isManyInput}}
+            io.reactivex.Flowable{{/isManyInput}}{{^isManyInput}}
+            io.reactivex.Single{{/isManyInput}}<{{inputType}}> single) {
+            return serviceImpl.{{methodNameCamelCase}}(single);
+            }
+            });
+            break;
+        {{/isManyInput}}
+    {{/methods}}
+    default:
+    throw new java.lang.AssertionError();
+    }
+    }
+
+    @java.lang.Override
+    @java.lang.SuppressWarnings("unchecked")
+    public io.grpc.stub.StreamObserver
+    <Req> invoke(io.grpc.stub.StreamObserver
+        <Resp> responseObserver) {
+            switch (methodId) {
+            {{#methods}}
+                {{#isManyInput}}
+                    case METHODID_{{methodNameUpperUnderscore}}:
+                    return (io.grpc.stub.StreamObserver
+                <Req>) com.salesforce.rxgrpc.stub.ServerCalls.{{reactiveCallsMethodName}}(
+                    (io.grpc.stub.StreamObserver<{{outputType}}>) responseObserver,
+                    serviceImpl::{{methodNameCamelCase}});
+                {{/isManyInput}}
+            {{/methods}}
+            default:
+            throw new java.lang.AssertionError();
+            }
+            }
+            }
+
+            }
diff --git a/dubbo-all/pom.xml b/dubbo-all/pom.xml
new file mode 100644
index 0000000..5c2936e
--- /dev/null
+++ b/dubbo-all/pom.xml
@@ -0,0 +1,1042 @@
+<!--
+  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.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.dubbo</groupId>
+        <artifactId>dubbo-parent</artifactId>
+        <version>${revision}</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <artifactId>dubbo</artifactId>
+    <packaging>jar</packaging>
+    <name>dubbo-all</name>
+    <description>The all in one project of dubbo</description>
+    <properties>
+        <skip_maven_deploy>false</skip_maven_deploy>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-config-api</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-config-spring</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-cluster</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-common</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-filter-cache</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-filter-validation</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-remoting-api</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-remoting-netty</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-remoting-netty4</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-remoting-etcd3</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-remoting-mina</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-remoting-grizzly</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-remoting-p2p</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-remoting-http</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-rpc-api</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-rpc-dubbo</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-rpc-injvm</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-rpc-http</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-rpc-rmi</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-rpc-hessian</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-rpc-webservice</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-rpc-thrift</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-rpc-native-thrift</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-rpc-memcached</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-rpc-redis</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-rpc-rest</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-rpc-xml</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-rpc-grpc</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-registry-api</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-registry-default</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-registry-multicast</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-registry-zookeeper</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-registry-redis</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-registry-consul</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-registry-etcd3</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+            <exclusions>
+                <exclusion>
+                    <groupId>io.grpc</groupId>
+                    <artifactId>grpc-core</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>io.grpc</groupId>
+                    <artifactId>grpc-netty</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-registry-eureka</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-registry-nacos</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-registry-sofa</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-registry-multiple</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-monitor-api</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-monitor-default</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-container-spring</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-container-log4j</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-container-logback</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-qos</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-serialization-api</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-serialization-fastjson</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-serialization-fst</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-serialization-hessian2</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-serialization-native-hession</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-serialization-jdk</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-serialization-kryo</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-serialization-avro</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-serialization-protostuff</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-serialization-gson</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-serialization-protobuf</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-configcenter-zookeeper</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-configcenter-apollo</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-configcenter-nacos</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-configcenter-consul</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-configcenter-etcd</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+            <exclusions>
+                <exclusion>
+                    <groupId>io.grpc</groupId>
+                    <artifactId>grpc-core</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>io.grpc</groupId>
+                    <artifactId>grpc-netty</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-compatible</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>hessian-lite</artifactId>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <!-- metadata -->
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-metadata-api</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-metadata-report-zookeeper</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-metadata-report-redis</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-metadata-report-consul</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-metadata-report-etcd</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+            <exclusions>
+                <exclusion>
+                    <groupId>io.grpc</groupId>
+                    <artifactId>grpc-core</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>io.grpc</groupId>
+                    <artifactId>grpc-netty</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-metadata-report-nacos</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+
+        <!-- Transitive dependencies -->
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.spring</groupId>
+            <artifactId>spring-context-support</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.javassist</groupId>
+            <artifactId>javassist</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-all</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.yaml</groupId>
+            <artifactId>snakeyaml</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+
+        <!-- Temporarily add this part to exclude transitive dependency -->
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-engine</artifactId>
+            <version>${junit_jupiter_version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-params</artifactId>
+            <version>${junit_jupiter_version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>cglib</groupId>
+            <artifactId>cglib-nodep</artifactId>
+            <version>${cglib_version}</version>
+            <scope>test</scope>
+            <optional>true</optional>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-shade-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>shade</goal>
+                        </goals>
+                        <configuration>
+                            <createSourcesJar>true</createSourcesJar>
+                            <promoteTransitiveDependencies>false</promoteTransitiveDependencies>
+                            <artifactSet>
+                                <includes>
+                                    <include>com.alibaba:hessian-lite</include>
+                                    <include>org.apache.dubbo:dubbo-config-api</include>
+                                    <include>org.apache.dubbo:dubbo-config-spring</include>
+                                    <include>org.apache.dubbo:dubbo-compatible</include>
+                                    <include>org.apache.dubbo:dubbo-common</include>
+                                    <include>org.apache.dubbo:dubbo-remoting-api</include>
+                                    <include>org.apache.dubbo:dubbo-remoting-netty</include>
+                                    <include>org.apache.dubbo:dubbo-remoting-netty4</include>
+                                    <include>org.apache.dubbo:dubbo-remoting-etcd3</include>
+                                    <include>org.apache.dubbo:dubbo-remoting-mina</include>
+                                    <include>org.apache.dubbo:dubbo-remoting-grizzly</include>
+                                    <include>org.apache.dubbo:dubbo-remoting-p2p</include>
+                                    <include>org.apache.dubbo:dubbo-remoting-http</include>
+                                    <include>org.apache.dubbo:dubbo-remoting-zookeeper</include>
+                                    <include>org.apache.dubbo:dubbo-rpc-api</include>
+                                    <include>org.apache.dubbo:dubbo-rpc-dubbo</include>
+                                    <include>org.apache.dubbo:dubbo-rpc-injvm</include>
+                                    <include>org.apache.dubbo:dubbo-rpc-http</include>
+                                    <include>org.apache.dubbo:dubbo-rpc-rmi</include>
+                                    <include>org.apache.dubbo:dubbo-rpc-hessian</include>
+                                    <include>org.apache.dubbo:dubbo-rpc-webservice</include>
+                                    <include>org.apache.dubbo:dubbo-rpc-thrift</include>
+                                    <include>org.apache.dubbo:dubbo-rpc-native-thrift</include>
+                                    <include>org.apache.dubbo:dubbo-rpc-memcached</include>
+                                    <include>org.apache.dubbo:dubbo-rpc-redis</include>
+                                    <include>org.apache.dubbo:dubbo-rpc-rest</include>
+                                    <include>org.apache.dubbo:dubbo-rpc-xml</include>
+                                    <include>org.apache.dubbo:dubbo-rpc-grpc</include>
+                                    <include>org.apache.dubbo:dubbo-filter-validation</include>
+                                    <include>org.apache.dubbo:dubbo-filter-cache</include>
+                                    <include>org.apache.dubbo:dubbo-cluster</include>
+                                    <include>org.apache.dubbo:dubbo-registry-api</include>
+                                    <include>org.apache.dubbo:dubbo-registry-default</include>
+                                    <include>org.apache.dubbo:dubbo-registry-multicast</include>
+                                    <include>org.apache.dubbo:dubbo-registry-zookeeper</include>
+                                    <include>org.apache.dubbo:dubbo-registry-redis</include>
+                                    <include>org.apache.dubbo:dubbo-registry-consul</include>
+                                    <include>org.apache.dubbo:dubbo-registry-etcd3</include>
+                                    <include>org.apache.dubbo:dubbo-registry-eureka</include>
+                                    <include>org.apache.dubbo:dubbo-registry-nacos</include>
+                                    <include>org.apache.dubbo:dubbo-registry-sofa</include>
+                                    <include>org.apache.dubbo:dubbo-registry-multiple</include>
+                                    <include>org.apache.dubbo:dubbo-monitor-api</include>
+                                    <include>org.apache.dubbo:dubbo-monitor-default</include>
+                                    <include>org.apache.dubbo:dubbo-container-api</include>
+                                    <include>org.apache.dubbo:dubbo-container-spring</include>
+                                    <include>org.apache.dubbo:dubbo-container-log4j</include>
+                                    <include>org.apache.dubbo:dubbo-container-logback</include>
+                                    <include>org.apache.dubbo:dubbo-qos</include>
+                                    <include>org.apache.dubbo:dubbo-serialization-api</include>
+                                    <include>org.apache.dubbo:dubbo-serialization-fastjson</include>
+                                    <include>org.apache.dubbo:dubbo-serialization-hessian2</include>
+                                    <include>org.apache.dubbo:dubbo-serialization-fst</include>
+                                    <include>org.apache.dubbo:dubbo-serialization-kryo</include>
+                                    <include>org.apache.dubbo:dubbo-serialization-avro</include>
+                                    <include>org.apache.dubbo:dubbo-serialization-jdk</include>
+                                    <include>org.apache.dubbo:dubbo-serialization-protostuff</include>
+                                    <include>org.apache.dubbo:dubbo-serialization-gson</include>
+                                    <include>org.apache.dubbo:dubbo-serialization-protobuf</include>
+                                    <include>org.apache.dubbo:dubbo-configcenter-api</include>
+                                    <include>org.apache.dubbo:dubbo-configcenter-definition</include>
+                                    <include>org.apache.dubbo:dubbo-configcenter-apollo</include>
+                                    <include>org.apache.dubbo:dubbo-configcenter-zookeeper</include>
+                                    <include>org.apache.dubbo:dubbo-configcenter-consul</include>
+                                    <include>org.apache.dubbo:dubbo-configcenter-etcd</include>
+                                    <include>org.apache.dubbo:dubbo-configcenter-nacos</include>
+                                    <include>org.apache.dubbo:dubbo-metadata-api</include>
+                                    <include>org.apache.dubbo:dubbo-metadata-report-redis</include>
+                                    <include>org.apache.dubbo:dubbo-metadata-report-zookeeper</include>
+                                    <include>org.apache.dubbo:dubbo-metadata-report-consul</include>
+                                    <include>org.apache.dubbo:dubbo-metadata-report-etcd</include>
+                                    <include>org.apache.dubbo:dubbo-metadata-report-nacos</include>
+                                    <include>org.apache.dubbo:dubbo-serialization-native-hession</include>
+                                </includes>
+                            </artifactSet>
+                            <transformers>
+                                <!-- dubbo-common beginning -->
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        META-INF/dubbo/internal/org.apache.dubbo.common.compiler.Compiler
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        META-INF/dubbo/internal/org.apache.dubbo.common.config.configcenter.DynamicConfigurationFactory
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        META-INF/dubbo/internal/org.apache.dubbo.common.extension.ExtensionFactory
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        META-INF/dubbo/internal/org.apache.dubbo.common.infra.InfraAdapter
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        META-INF/dubbo/internal/org.apache.dubbo.common.logger.LoggerAdapter
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        META-INF/dubbo/internal/org.apache.dubbo.common.status.StatusChecker
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        META-INF/dubbo/internal/org.apache.dubbo.common.store.DataStore
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        META-INF/dubbo/internal/org.apache.dubbo.common.threadpool.ThreadPool
+                                    </resource>
+                                </transformer>
+                                <!-- dubbo-common end -->
+
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/dubbo/internal/org.apache.dubbo.common.serialize.Serialization
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/dubbo/internal/org.apache.dubbo.remoting.Dispatcher</resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/dubbo/internal/org.apache.dubbo.remoting.Codec2</resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/dubbo/internal/org.apache.dubbo.remoting.Transporter</resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/dubbo/internal/org.apache.dubbo.remoting.exchange.Exchanger
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/dubbo/internal/org.apache.dubbo.remoting.http.HttpBinder
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/dubbo/internal/org.apache.dubbo.remoting.p2p.Networker
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/dubbo/internal/org.apache.dubbo.remoting.telnet.TelnetHandler
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        META-INF/dubbo/internal/org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/dubbo/internal/org.apache.dubbo.rpc.Protocol</resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter</resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/dubbo/internal/org.apache.dubbo.rpc.InvokerListener</resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/dubbo/internal/org.apache.dubbo.rpc.ExporterListener</resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/dubbo/internal/org.apache.dubbo.rpc.ProxyFactory</resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.Cluster</resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.LoadBalance
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.Merger</resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.RouterFactory
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.ConfiguratorFactory
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/dubbo/internal/org.apache.dubbo.container.Container</resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/dubbo/internal/org.apache.dubbo.monitor.MonitorFactory
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/dubbo/internal/org.apache.dubbo.registry.RegistryFactory
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/dubbo/internal/org.apache.dubbo.validation.Validation</resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/dubbo/internal/org.apache.dubbo.cache.CacheFactory</resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/dubbo/internal/org.apache.dubbo.qos.command.BaseCommand
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        META-INF/dubbo/internal/org.apache.dubbo.metadata.report.MetadataReportFactory
+                                    </resource>
+                                </transformer>
+                                <!-- @since 2.7.5 -->
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/dubbo/internal/org.apache.dubbo.event.EventDispatcher
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/dubbo/internal/org.apache.dubbo.metadata.MetadataServiceExporter
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/dubbo/internal/org.apache.dubbo.metadata.WritableMetadataService
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/dubbo/internal/org.apache.dubbo.metadata.ServiceNameMapping
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        META-INF/dubbo/internal/org.apache.dubbo.registry.client.metadata.proxy.MetadataServiceProxyFactory
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscoveryFactory
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscovery
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        META-INF/dubbo/internal/org.apache.dubbo.metadata.definition.builder.TypeBuilder
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/dubbo/internal/org.apache.dubbo.event.EventListener
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceInstanceCustomizer
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        META-INF/dubbo/internal/org.apache.dubbo.registry.client.metadata.MetadataServiceURLBuilder
+                                    </resource>
+                                </transformer>
+
+                                <!-- @since 2.7.6 -->
+
+                                <!-- 'dubbo-common' module -->
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        META-INF/dubbo/internal/org.apache.dubbo.common.convert.Converter
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        META-INF/dubbo/internal/org.apache.dubbo.common.convert.multiple.MultiValueConverter
+                                    </resource>
+                                </transformer>
+
+                                <!-- 'dubbo-metadata-api' module -->
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        META-INF/dubbo/internal/org.apache.dubbo.metadata.rest.AnnotatedMethodParameterProcessor
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        META-INF/dubbo/internal/org.apache.dubbo.metadata.rest.ServiceRestMetadataResolver
+                                    </resource>
+                                </transformer>
+
+                                <!-- 'dubbo-metadata-processor' module -->
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        META-INF/dubbo/internal/org.apache.dubbo.metadata.annotation.processing.builder.TypeDefinitionBuilder
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        META-INF/dubbo/internal/org.apache.dubbo.metadata.annotation.processing.rest.AnnotatedMethodParameterProcessor
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        META-INF/dubbo/internal/org.apache.dubbo.metadata.annotation.processing.rest.ServiceRestMetadataResolver
+                                    </resource>
+                                </transformer>
+
+                                <!-- @since 2.7.7 -->
+
+                                <!-- 'dubbo-common' module -->
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        META-INF/services/org.apache.dubbo.common.extension.LoadingStrategy
+                                    </resource>
+                                </transformer>
+
+                            </transformers>
+                            <filters>
+                                <filter>
+                                    <artifact>org.apache.dubbo:dubbo</artifact>
+                                    <excludes>
+                                        <!-- These two line is optional, it can remove some warn log -->
+                                        <exclude>com/**</exclude>
+                                        <exclude>org/**</exclude>
+                                        <!-- This one is required -->
+                                        <exclude>META-INF/dubbo/**</exclude>
+                                    </excludes>
+                                </filter>
+                            </filters>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+    <profiles>
+        <profile>
+            <id>release</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <artifactId>maven-javadoc-plugin</artifactId>
+                        <version>${maven_javadoc_version}</version>
+                        <executions>
+                            <execution>
+                                <id>attach-javadoc</id>
+                                <goals>
+                                    <goal>jar</goal>
+                                </goals>
+                                <configuration>
+                                    <doclint>none</doclint>
+                                </configuration>
+                            </execution>
+                        </executions>
+                        <configuration>
+                            <includeDependencySources>true</includeDependencySources>
+                            <dependencySourceIncludes>
+                                <dependencySourceInclude>org.apache.dubbo:dubbo-*</dependencySourceInclude>
+                                <dependencySourceExclude>com.alibaba:hessian-*</dependencySourceExclude>
+                            </dependencySourceIncludes>
+                            <show>public</show>
+                            <charset>UTF-8</charset>
+                            <encoding>UTF-8</encoding>
+                            <docencoding>UTF-8</docencoding>
+                            <links>
+                                <link>http://docs.oracle.com/javase/7/docs/api</link>
+                            </links>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+</project>
diff --git a/dubbo-bom/pom.xml b/dubbo-bom/pom.xml
new file mode 100644
index 0000000..a5b8b87
--- /dev/null
+++ b/dubbo-bom/pom.xml
@@ -0,0 +1,459 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.dubbo</groupId>
+        <artifactId>dubbo-parent</artifactId>
+        <version>${revision}</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>dubbo-bom</artifactId>
+    <packaging>pom</packaging>
+
+    <name>dubbo-bom</name>
+    <description>Dubbo dependencies BOM</description>
+    <url>https://github.com/apache/dubbo</url>
+    <inceptionYear>2011</inceptionYear>
+    <licenses>
+        <license>
+            <name>Apache License, Version 2.0</name>
+            <url>http://www.apache.org/licenses/LICENSE-2.0</url>
+            <distribution>repo</distribution>
+        </license>
+    </licenses>
+
+    <scm>
+        <url>https://github.com/apache/dubbo</url>
+        <connection>scm:git:https://github.com/apache/dubbo.git</connection>
+        <developerConnection>scm:git:https://github.com/apache/dubbo.git</developerConnection>
+        <tag>HEAD</tag>
+    </scm>
+    <mailingLists>
+        <mailingList>
+            <name>Development List</name>
+            <subscribe>dev-subscribe@dubbo.apache.org</subscribe>
+            <unsubscribe>dev-unsubscribe@dubbo.apache.org</unsubscribe>
+            <post>dev@dubbo.apache.org</post>
+        </mailingList>
+        <mailingList>
+            <name>Commits List</name>
+            <subscribe>commits-subscribe@dubbo.apache.org</subscribe>
+            <unsubscribe>commits-unsubscribe@dubbo.apache.org</unsubscribe>
+            <post>commits@dubbo.apache.org</post>
+        </mailingList>
+        <mailingList>
+            <name>Issues List</name>
+            <subscribe>issues-subscribe@dubbo.apache.org</subscribe>
+            <unsubscribe>issues-unsubscribe@dubbo.apache.org</unsubscribe>
+            <post>issues@dubbo.apache.org</post>
+        </mailingList>
+    </mailingLists>
+    <developers>
+        <developer>
+            <id>dubbo.io</id>
+            <name>The Dubbo Project Contributors</name>
+            <email>dev-subscribe@dubbo.apache.org</email>
+            <url>http://dubbo.apache.org/</url>
+        </developer>
+    </developers>
+
+    <organization>
+        <name>The Apache Software Foundation</name>
+        <url>http://www.apache.org/</url>
+    </organization>
+
+    <issueManagement>
+        <system>Github Issues</system>
+        <url>https://github.com/apache/dubbo/issues</url>
+    </issueManagement>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-cluster</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-common</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-config-api</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-config-spring</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-filter-cache</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-filter-validation</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-remoting-api</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-remoting-netty</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-remoting-netty4</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-remoting-mina</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-remoting-grizzly</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-remoting-p2p</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-remoting-http</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-remoting-etcd3</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-rpc-api</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-rpc-dubbo</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-rpc-injvm</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-rpc-http</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-rpc-rmi</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-rpc-hessian</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-rpc-webservice</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-rpc-thrift</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-rpc-native-thrift</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-rpc-memcached</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-rpc-redis</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-rpc-rest</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-rpc-xml</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-rpc-grpc</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-registry-api</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-registry-default</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-registry-multicast</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-registry-zookeeper</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-registry-redis</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-registry-etcd3</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-registry-consul</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-registry-nacos</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-registry-sofa</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-monitor-api</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-monitor-default</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-container-spring</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-container-log4j</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-container-logback</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-qos</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-serialization-api</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-serialization-fastjson</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-serialization-fst</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-serialization-hessian2</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-serialization-native-hession</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-serialization-jdk</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-serialization-kryo</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-serialization-protostuff</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-serialization-avro</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-serialization-gson</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-serialization-protobuf</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-compatible</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <!-- metadata -->
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-metadata-api</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-metadata-report-zookeeper</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-metadata-report-redis</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-metadata-report-consul</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-metadata-report-etcd</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-metadata-report-nacos</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+
+            <!-- config-center -->
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-configcenter-zookeeper</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-configcenter-apollo</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-configcenter-consul</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-configcenter-etcd</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-configcenter-nacos</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-metadata-definition-protobuf</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <profiles>
+        <profile>
+            <id>release</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-gpg-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <phase>verify</phase>
+                                <goals>
+                                    <goal>sign</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+
+</project>
diff --git a/dubbo-build-tools/pom.xml b/dubbo-build-tools/pom.xml
new file mode 100644
index 0000000..28bae80
--- /dev/null
+++ b/dubbo-build-tools/pom.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>org.apache.dubbo</groupId>
+    <artifactId>dubbo-build-tools</artifactId>
+    <version>1.0.0</version>
+    <packaging>jar</packaging>
+
+    <properties>
+      <maven.deploy.skip>true</maven.deploy.skip>
+    </properties>
+
+</project>
\ No newline at end of file
diff --git a/dubbo-build-tools/src/main/resources/checkstyle-header.txt b/dubbo-build-tools/src/main/resources/checkstyle-header.txt
new file mode 100644
index 0000000..d973dce
--- /dev/null
+++ b/dubbo-build-tools/src/main/resources/checkstyle-header.txt
@@ -0,0 +1,16 @@
+/*
+ * 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.
+ */
\ No newline at end of file
diff --git a/dubbo-cluster/pom.xml b/dubbo-cluster/pom.xml
new file mode 100644
index 0000000..bd62974
--- /dev/null
+++ b/dubbo-cluster/pom.xml
@@ -0,0 +1,54 @@
+<!--
+  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.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.dubbo</groupId>
+        <artifactId>dubbo-parent</artifactId>
+        <version>${revision}</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <artifactId>dubbo-cluster</artifactId>
+    <packaging>jar</packaging>
+    <name>${project.artifactId}</name>
+    <description>The cluster module of dubbo project</description>
+    <properties>
+        <skip_maven_deploy>false</skip_maven_deploy>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-rpc-api</artifactId>
+            <version>${project.parent.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.yaml</groupId>
+            <artifactId>snakeyaml</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.curator</groupId>
+            <artifactId>curator-framework</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.zookeeper</groupId>
+            <artifactId>zookeeper</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/CacheableRouterFactory.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/CacheableRouterFactory.java
new file mode 100644
index 0000000..4d4b9eb
--- /dev/null
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/CacheableRouterFactory.java
@@ -0,0 +1,37 @@
+/*
+ * 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.rpc.cluster;
+
+import org.apache.dubbo.common.URL;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+/**
+ * If you want to provide a router implementation based on design of v2.7.0, please extend from this abstract class.
+ * For 2.6.x style router, please implement and use RouterFactory directly.
+ */
+public abstract class CacheableRouterFactory implements RouterFactory {
+    private ConcurrentMap<String, Router> routerMap = new ConcurrentHashMap<>();
+
+    @Override
+    public Router getRouter(URL url) {
+        return routerMap.computeIfAbsent(url.getServiceKey(), k -> createRouter(url));
+    }
+
+    protected abstract Router createRouter(URL url);
+}
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Cluster.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Cluster.java
new file mode 100644
index 0000000..74570f5
--- /dev/null
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Cluster.java
@@ -0,0 +1,59 @@
+/*
+ * 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.rpc.cluster;
+
+import org.apache.dubbo.common.extension.Adaptive;
+import org.apache.dubbo.common.extension.ExtensionLoader;
+import org.apache.dubbo.common.extension.SPI;
+import org.apache.dubbo.common.utils.StringUtils;
+import org.apache.dubbo.rpc.Invoker;
+import org.apache.dubbo.rpc.RpcException;
+import org.apache.dubbo.rpc.cluster.support.FailoverCluster;
+
+/**
+ * Cluster. (SPI, Singleton, ThreadSafe)
+ * <p>
+ * <a href="http://en.wikipedia.org/wiki/Computer_cluster">Cluster</a>
+ * <a href="http://en.wikipedia.org/wiki/Fault-tolerant_system">Fault-Tolerant</a>
+ *
+ */
+@SPI(Cluster.DEFAULT)
+public interface Cluster {
+    String DEFAULT = FailoverCluster.NAME;
+
+    /**
+     * Merge the directory invokers to a virtual invoker.
+     *
+     * @param <T>
+     * @param directory
+     * @return cluster invoker
+     * @throws RpcException
+     */
+    @Adaptive
+    <T> Invoker<T> join(Directory<T> directory) throws RpcException;
+
+    static Cluster getCluster(String name) {
+        return getCluster(name, true);
+    }
+
+    static Cluster getCluster(String name, boolean wrap) {
+        if (StringUtils.isEmpty(name)) {
+            name = Cluster.DEFAULT;
+        }
+        return ExtensionLoader.getExtensionLoader(Cluster.class).getExtension(name, wrap);
+    }
+}
\ No newline at end of file
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/ClusterInvoker.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/ClusterInvoker.java
new file mode 100644
index 0000000..4b9199e
--- /dev/null
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/ClusterInvoker.java
@@ -0,0 +1,38 @@
+/*
+ * 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.rpc.cluster;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.rpc.Invoker;
+
+/**
+ * This is the final Invoker type referenced by the RPC proxy on Consumer side.
+ * <p>
+ * A ClusterInvoker holds a group of normal invokers, stored in a Directory, mapping to one Registry.
+ * The ClusterInvoker implementation usually provides LB or HA policies, like FailoverClusterInvoker.
+ * <p>
+ * In multi-registry subscription scenario, the final ClusterInvoker will referr to several sub ClusterInvokers, with each
+ * sub ClusterInvoker representing one Registry. Take ZoneAwareClusterInvoker as an example, it is specially customized for
+ * multi-registry use cases: first, pick up one ClusterInvoker, then do LB inside the chose ClusterInvoker.
+ *
+ * @param <T>
+ */
+public interface ClusterInvoker<T> extends Invoker<T> {
+    URL getRegistryUrl();
+
+    Directory<T> getDirectory();
+}
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Configurator.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Configurator.java
new file mode 100644
index 0000000..fd62628
--- /dev/null
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Configurator.java
@@ -0,0 +1,120 @@
+/*
+ * 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.rpc.cluster;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.extension.ExtensionLoader;
+import org.apache.dubbo.common.utils.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+import static org.apache.dubbo.rpc.cluster.Constants.PRIORITY_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_KEY;
+import static org.apache.dubbo.common.constants.RegistryConstants.EMPTY_PROTOCOL;
+
+/**
+ * Configurator. (SPI, Prototype, ThreadSafe)
+ *
+ */
+public interface Configurator extends Comparable<Configurator> {
+
+    /**
+     * Get the configurator url.
+     *
+     * @return configurator url.
+     */
+    URL getUrl();
+
+    /**
+     * Configure the provider url.
+     *
+     * @param url - old provider url.
+     * @return new provider url.
+     */
+    URL configure(URL url);
+
+
+    /**
+     * Convert override urls to map for use when re-refer. Send all rules every time, the urls will be reassembled and
+     * calculated
+     *
+     * URL contract:
+     * <ol>
+     * <li>override://0.0.0.0/...( or override://ip:port...?anyhost=true)&para1=value1... means global rules
+     * (all of the providers take effect)</li>
+     * <li>override://ip:port...?anyhost=false Special rules (only for a certain provider)</li>
+     * <li>override:// rule is not supported... ,needs to be calculated by registry itself</li>
+     * <li>override://0.0.0.0/ without parameters means clearing the override</li>
+     * </ol>
+     *
+     * @param urls URL list to convert
+     * @return converted configurator list
+     */
+    static Optional<List<Configurator>> toConfigurators(List<URL> urls) {
+        if (CollectionUtils.isEmpty(urls)) {
+            return Optional.empty();
+        }
+
+        ConfiguratorFactory configuratorFactory = ExtensionLoader.getExtensionLoader(ConfiguratorFactory.class)
+                .getAdaptiveExtension();
+
+        List<Configurator> configurators = new ArrayList<>(urls.size());
+        for (URL url : urls) {
+            if (EMPTY_PROTOCOL.equals(url.getProtocol())) {
+                configurators.clear();
+                break;
+            }
+            Map<String, String> override = new HashMap<>(url.getParameters());
+            //The anyhost parameter of override may be added automatically, it can't change the judgement of changing url
+            override.remove(ANYHOST_KEY);
+            if (override.size() == 0) {
+                configurators.clear();
+                continue;
+            }
+            configurators.add(configuratorFactory.getConfigurator(url));
+        }
+        Collections.sort(configurators);
+        return Optional.of(configurators);
+    }
+
+    /**
+     * Sort by host, then by priority
+     * 1. the url with a specific host ip should have higher priority than 0.0.0.0
+     * 2. if two url has the same host, compare by priority value;
+     */
+    @Override
+    default int compareTo(Configurator o) {
+        if (o == null) {
+            return -1;
+        }
+
+        int ipCompare = getUrl().getHost().compareTo(o.getUrl().getHost());
+        // host is the same, sort by priority
+        if (ipCompare == 0) {
+            int i = getUrl().getParameter(PRIORITY_KEY, 0);
+            int j = o.getUrl().getParameter(PRIORITY_KEY, 0);
+            return Integer.compare(i, j);
+        } else {
+            return ipCompare;
+        }
+    }
+}
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/ConfiguratorFactory.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/ConfiguratorFactory.java
new file mode 100644
index 0000000..8b2722c
--- /dev/null
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/ConfiguratorFactory.java
@@ -0,0 +1,39 @@
+/*
+ * 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.rpc.cluster;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.extension.Adaptive;
+import org.apache.dubbo.common.extension.SPI;
+
+/**
+ * ConfiguratorFactory. (SPI, Singleton, ThreadSafe)
+ *
+ */
+@SPI
+public interface ConfiguratorFactory {
+
+    /**
+     * get the configurator instance.
+     *
+     * @param url - configurator url.
+     * @return configurator instance.
+     */
+    @Adaptive("protocol")
+    Configurator getConfigurator(URL url);
+
+}
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Constants.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Constants.java
new file mode 100644
index 0000000..19861ef
--- /dev/null
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Constants.java
@@ -0,0 +1,102 @@
+/*
+ * 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.rpc.cluster;
+
+public interface Constants {
+
+    String FAIL_BACK_TASKS_KEY = "failbacktasks";
+
+    int DEFAULT_FAILBACK_TASKS = 100;
+
+    int DEFAULT_FORKS = 2;
+
+    String WEIGHT_KEY = "weight";
+
+    int DEFAULT_WEIGHT = 100;
+
+    String MOCK_PROTOCOL = "mock";
+
+    String FORCE_KEY = "force";
+
+    /**
+     * To decide whether to exclude unavailable invoker from the cluster
+     */
+    String CLUSTER_AVAILABLE_CHECK_KEY = "cluster.availablecheck";
+
+    /**
+     * The default value of cluster.availablecheck
+     *
+     * @see #CLUSTER_AVAILABLE_CHECK_KEY
+     */
+    boolean DEFAULT_CLUSTER_AVAILABLE_CHECK = true;
+
+    /**
+     * To decide whether to enable sticky strategy for cluster
+     */
+    String CLUSTER_STICKY_KEY = "sticky";
+
+    /**
+     * The default value of sticky
+     *
+     * @see #CLUSTER_STICKY_KEY
+     */
+    boolean DEFAULT_CLUSTER_STICKY = false;
+
+    String ADDRESS_KEY = "address";
+
+    /**
+     * When this attribute appears in invocation's attachment, mock invoker will be used
+     */
+    String INVOCATION_NEED_MOCK = "invocation.need.mock";
+
+    /**
+     * when ROUTER_KEY's value is set to ROUTER_TYPE_CLEAR, RegistryDirectory will clean all current routers
+     */
+    String ROUTER_TYPE_CLEAR = "clean";
+
+    String DEFAULT_SCRIPT_TYPE_KEY = "javascript";
+
+    String PRIORITY_KEY = "priority";
+
+    String RULE_KEY = "rule";
+
+    String TYPE_KEY = "type";
+
+    String RUNTIME_KEY = "runtime";
+
+    String WARMUP_KEY = "warmup";
+
+    int DEFAULT_WARMUP = 10 * 60 * 1000;
+
+    String CONFIG_VERSION_KEY = "configVersion";
+
+    String OVERRIDE_PROVIDERS_KEY = "providerAddresses";
+
+
+    /**
+     * key for router type, for e.g., "script"/"file",  corresponding to ScriptRouterFactory.NAME, FileRouterFactory.NAME
+     */
+    String ROUTER_KEY = "router";
+    /**
+     * The key name for reference URL in register center
+     */
+    String REFER_KEY = "refer";
+    /**
+     * The key name for export URL in register center
+     */
+    String EXPORT_KEY = "export";
+}
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Directory.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Directory.java
new file mode 100644
index 0000000..67b649f
--- /dev/null
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Directory.java
@@ -0,0 +1,54 @@
+/*
+ * 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.rpc.cluster;
+
+import org.apache.dubbo.common.Node;
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.rpc.Invocation;
+import org.apache.dubbo.rpc.Invoker;
+import org.apache.dubbo.rpc.RpcException;
+
+import java.util.List;
+
+/**
+ * Directory. (SPI, Prototype, ThreadSafe)
+ * <p>
+ * <a href="http://en.wikipedia.org/wiki/Directory_service">Directory Service</a>
+ *
+ * @see org.apache.dubbo.rpc.cluster.Cluster#join(Directory)
+ */
+public interface Directory<T> extends Node {
+
+    /**
+     * get service type.
+     *
+     * @return service type.
+     */
+    Class<T> getInterface();
+
+    /**
+     * list invokers.
+     *
+     * @return invokers
+     */
+    List<Invoker<T>> list(Invocation invocation) throws RpcException;
+
+    List<Invoker<T>> getAllInvokers();
+
+    URL getConsumerUrl();
+
+}
\ No newline at end of file
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/LoadBalance.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/LoadBalance.java
new file mode 100644
index 0000000..ccf00a5
--- /dev/null
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/LoadBalance.java
@@ -0,0 +1,50 @@
+/*
+ * 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.rpc.cluster;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.extension.Adaptive;
+import org.apache.dubbo.common.extension.SPI;
+import org.apache.dubbo.rpc.Invocation;
+import org.apache.dubbo.rpc.Invoker;
+import org.apache.dubbo.rpc.RpcException;
+import org.apache.dubbo.rpc.cluster.loadbalance.RandomLoadBalance;
+
+import java.util.List;
+
+/**
+ * LoadBalance. (SPI, Singleton, ThreadSafe)
+ * <p>
+ * <a href="http://en.wikipedia.org/wiki/Load_balancing_(computing)">Load-Balancing</a>
+ *
+ * @see org.apache.dubbo.rpc.cluster.Cluster#join(Directory)
+ */
+@SPI(RandomLoadBalance.NAME)
+public interface LoadBalance {
+
+    /**
+     * select one invoker in list.
+     *
+     * @param invokers   invokers.
+     * @param url        refer url
+     * @param invocation invocation.
+     * @return selected invoker.
+     */
+    @Adaptive("loadbalance")
+    <T> Invoker<T> select(List<Invoker<T>> invokers, URL url, Invocation invocation) throws RpcException;
+
+}
\ No newline at end of file
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Merger.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Merger.java
new file mode 100644
index 0000000..64bccf8
--- /dev/null
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Merger.java
@@ -0,0 +1,26 @@
+/*
+ * 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.rpc.cluster;
+
+import org.apache.dubbo.common.extension.SPI;
+
+@SPI
+public interface Merger<T> {
+
+    T merge(T... items);
+
+}
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Router.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Router.java
new file mode 100644
index 0000000..52e10df
--- /dev/null
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/Router.java
@@ -0,0 +1,99 @@
+/*
+ * 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.rpc.cluster;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.rpc.Invocation;
+import org.apache.dubbo.rpc.Invoker;
+import org.apache.dubbo.rpc.RpcException;
+
+import java.util.List;
+
+/**
+ * Router. (SPI, Prototype, ThreadSafe)
+ * <p>
+ * <a href="http://en.wikipedia.org/wiki/Routing">Routing</a>
+ *
+ * @see org.apache.dubbo.rpc.cluster.Cluster#join(Directory)
+ * @see org.apache.dubbo.rpc.cluster.Directory#list(Invocation)
+ */
+public interface Router extends Comparable<Router> {
+
+    int DEFAULT_PRIORITY = Integer.MAX_VALUE;
+
+    /**
+     * Get the router url.
+     *
+     * @return url
+     */
+    URL getUrl();
+
+    /**
+     * Filter invokers with current routing rule and only return the invokers that comply with the rule.
+     *
+     * @param invokers   invoker list
+     * @param url        refer url
+     * @param invocation invocation
+     * @return routed invokers
+     * @throws RpcException
+     */
+    <T> List<Invoker<T>> route(List<Invoker<T>> invokers, URL url, Invocation invocation) throws RpcException;
+
+
+    /**
+     * Notify the router the invoker list. Invoker list may change from time to time. This method gives the router a
+     * chance to prepare before {@link Router#route(List, URL, Invocation)} gets called.
+     *
+     * @param invokers invoker list
+     * @param <T>      invoker's type
+     */
+    default <T> void notify(List<Invoker<T>> invokers) {
+
+    }
+
+    /**
+     * To decide whether this router need to execute every time an RPC comes or should only execute when addresses or
+     * rule change.
+     *
+     * @return true if the router need to execute every time.
+     */
+    boolean isRuntime();
+
+    /**
+     * To decide whether this router should take effect when none of the invoker can match the router rule, which
+     * means the {@link #route(List, URL, Invocation)} would be empty. Most of time, most router implementation would
+     * default this value to false.
+     *
+     * @return true to execute if none of invokers matches the current router
+     */
+    boolean isForce();
+
+    /**
+     * Router's priority, used to sort routers.
+     *
+     * @return router's priority
+     */
+    int getPriority();
+
+    @Override
+    default int compareTo(Router o) {
+        if (o == null) {
+            throw new IllegalArgumentException();
+        }
+        return Integer.compare(this.getPriority(), o.getPriority());
+    }
+}
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/RouterChain.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/RouterChain.java
new file mode 100644
index 0000000..e340e3d
--- /dev/null
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/RouterChain.java
@@ -0,0 +1,112 @@
+/*
+ * 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.rpc.cluster;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.extension.ExtensionLoader;
+import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.rpc.Invocation;
+import org.apache.dubbo.rpc.Invoker;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * Router chain
+ */
+public class RouterChain<T> {
+
+    // full list of addresses from registry, classified by method name.
+    private List<Invoker<T>> invokers = Collections.emptyList();
+
+    // containing all routers, reconstruct every time 'route://' urls change.
+    private volatile List<Router> routers = Collections.emptyList();
+
+    // Fixed router instances: ConfigConditionRouter, TagRouter, e.g., the rule for each instance may change but the
+    // instance will never delete or recreate.
+    private List<Router> builtinRouters = Collections.emptyList();
+
+    public static <T> RouterChain<T> buildChain(URL url) {
+        return new RouterChain<>(url);
+    }
+
+    private RouterChain(URL url) {
+        List<RouterFactory> extensionFactories = ExtensionLoader.getExtensionLoader(RouterFactory.class)
+                .getActivateExtension(url, "router");
+
+        List<Router> routers = extensionFactories.stream()
+                .map(factory -> factory.getRouter(url))
+                .collect(Collectors.toList());
+
+        initWithRouters(routers);
+    }
+
+    /**
+     * the resident routers must being initialized before address notification.
+     * FIXME: this method should not be public
+     */
+    public void initWithRouters(List<Router> builtinRouters) {
+        this.builtinRouters = builtinRouters;
+        this.routers = new ArrayList<>(builtinRouters);
+        this.sort();
+    }
+
+    /**
+     * If we use route:// protocol in version before 2.7.0, each URL will generate a Router instance, so we should
+     * keep the routers up to date, that is, each time router URLs changes, we should update the routers list, only
+     * keep the builtinRouters which are available all the time and the latest notified routers which are generated
+     * from URLs.
+     *
+     * @param routers routers from 'router://' rules in 2.6.x or before.
+     */
+    public void addRouters(List<Router> routers) {
+        List<Router> newRouters = new ArrayList<>();
+        newRouters.addAll(builtinRouters);
+        newRouters.addAll(routers);
+        CollectionUtils.sort(newRouters);
+        this.routers = newRouters;
+    }
+
+    private void sort() {
+        Collections.sort(routers);
+    }
+
+    /**
+     *
+     * @param url
+     * @param invocation
+     * @return
+     */
+    public List<Invoker<T>> route(URL url, Invocation invocation) {
+        List<Invoker<T>> finalInvokers = invokers;
+        for (Router router : routers) {
+            finalInvokers = router.route(finalInvokers, url, invocation);
+        }
+        return finalInvokers;
+    }
+
+    /**
+     * Notify router chain of the initial addresses from registry at the first time.
+     * Notify whenever addresses in registry change.
+     */
+    public void setInvokers(List<Invoker<T>> invokers) {
+        this.invokers = (invokers == null ? Collections.emptyList() : invokers);
+        routers.forEach(router -> router.notify(this.invokers));
+    }
+}
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/RouterFactory.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/RouterFactory.java
new file mode 100644
index 0000000..3a98a58
--- /dev/null
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/RouterFactory.java
@@ -0,0 +1,47 @@
+/*
+ * 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.rpc.cluster;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.extension.Adaptive;
+import org.apache.dubbo.common.extension.SPI;
+
+/**
+ * RouterFactory. (SPI, Singleton, ThreadSafe)
+ * <p>
+ * <a href="http://en.wikipedia.org/wiki/Routing">Routing</a>
+ *
+ * @see org.apache.dubbo.rpc.cluster.Cluster#join(Directory)
+ * @see org.apache.dubbo.rpc.cluster.Directory#list(org.apache.dubbo.rpc.Invocation)
+ * <p>
+ * Note Router has a different behaviour since 2.7.0, for each type of Router, there will only has one Router instance
+ * for each service. See {@link CacheableRouterFactory} and {@link RouterChain} for how to extend a new Router or how
+ * the Router instances are loaded.
+ */
+@SPI
+public interface RouterFactory {
+
+    /**
+     * Create router.
+     * Since 2.7.0, most of the time, we will not use @Adaptive feature, so it's kept only for compatibility.
+     *
+     * @param url url
+     * @return router instance
+     */
+    @Adaptive("protocol")
+    Router getRouter(URL url);
+}
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/RuleConverter.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/RuleConverter.java
new file mode 100644
index 0000000..f2cecdc
--- /dev/null
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/RuleConverter.java
@@ -0,0 +1,30 @@
+/*
+ * 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.rpc.cluster;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.extension.SPI;
+
+import java.util.List;
+
+@SPI
+public interface RuleConverter {
+
+    List<URL> convert(URL subscribeUrl, Object source);
+
+}
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/AbstractConfigurator.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/AbstractConfigurator.java
new file mode 100644
index 0000000..38b75ab
--- /dev/null
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/AbstractConfigurator.java
@@ -0,0 +1,158 @@
+/*
+ * 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.rpc.cluster.configurator;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.utils.NetUtils;
+import org.apache.dubbo.common.utils.StringUtils;
+import org.apache.dubbo.remoting.Constants;
+import org.apache.dubbo.rpc.cluster.Configurator;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_VALUE;
+import static org.apache.dubbo.common.constants.CommonConstants.ANY_VALUE;
+import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER;
+import static org.apache.dubbo.common.constants.CommonConstants.ENABLED_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.INTERFACES;
+import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER;
+import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;
+import static org.apache.dubbo.common.constants.RegistryConstants.CATEGORY_KEY;
+import static org.apache.dubbo.common.constants.RegistryConstants.COMPATIBLE_CONFIG_KEY;
+import static org.apache.dubbo.common.constants.RegistryConstants.DYNAMIC_KEY;
+import static org.apache.dubbo.rpc.cluster.Constants.CONFIG_VERSION_KEY;
+import static org.apache.dubbo.rpc.cluster.Constants.OVERRIDE_PROVIDERS_KEY;
+
+/**
+ * AbstractOverrideConfigurator
+ */
+public abstract class AbstractConfigurator implements Configurator {
+
+    private final URL configuratorUrl;
+
+    public AbstractConfigurator(URL url) {
+        if (url == null) {
+            throw new IllegalArgumentException("configurator url == null");
+        }
+        this.configuratorUrl = url;
+    }
+
+    @Override
+    public URL getUrl() {
+        return configuratorUrl;
+    }
+
+    @Override
+    public URL configure(URL url) {
+        // If override url is not enabled or is invalid, just return.
+        if (!configuratorUrl.getParameter(ENABLED_KEY, true) || configuratorUrl.getHost() == null || url == null || url.getHost() == null) {
+            return url;
+        }
+        /*
+         * This if branch is created since 2.7.0.
+         */
+        String apiVersion = configuratorUrl.getParameter(CONFIG_VERSION_KEY);
+        if (StringUtils.isNotEmpty(apiVersion)) {
+            String currentSide = url.getParameter(SIDE_KEY);
+            String configuratorSide = configuratorUrl.getParameter(SIDE_KEY);
+            if (currentSide.equals(configuratorSide) && CONSUMER.equals(configuratorSide) && 0 == configuratorUrl.getPort()) {
+                url = configureIfMatch(NetUtils.getLocalHost(), url);
+            } else if (currentSide.equals(configuratorSide) && PROVIDER.equals(configuratorSide) && url.getPort() == configuratorUrl.getPort()) {
+                url = configureIfMatch(url.getHost(), url);
+            }
+        }
+        /*
+         * This else branch is deprecated and is left only to keep compatibility with versions before 2.7.0
+         */
+        else {
+            url = configureDeprecated(url);
+        }
+        return url;
+    }
+
+    @Deprecated
+    private URL configureDeprecated(URL url) {
+        // If override url has port, means it is a provider address. We want to control a specific provider with this override url, it may take effect on the specific provider instance or on consumers holding this provider instance.
+        if (configuratorUrl.getPort() != 0) {
+            if (url.getPort() == configuratorUrl.getPort()) {
+                return configureIfMatch(url.getHost(), url);
+            }
+        } else {
+            /*
+             *  override url don't have a port, means the ip override url specify is a consumer address or 0.0.0.0.
+             *  1.If it is a consumer ip address, the intention is to control a specific consumer instance, it must takes effect at the consumer side, any provider received this override url should ignore.
+             *  2.If the ip is 0.0.0.0, this override url can be used on consumer, and also can be used on provider.
+             */
+            if (url.getParameter(SIDE_KEY, PROVIDER).equals(CONSUMER)) {
+                // NetUtils.getLocalHost is the ip address consumer registered to registry.
+                return configureIfMatch(NetUtils.getLocalHost(), url);
+            } else if (url.getParameter(SIDE_KEY, CONSUMER).equals(PROVIDER)) {
+                // take effect on all providers, so address must be 0.0.0.0, otherwise it won't flow to this if branch
+                return configureIfMatch(ANYHOST_VALUE, url);
+            }
+        }
+        return url;
+    }
+
+    private URL configureIfMatch(String host, URL url) {
+        if (ANYHOST_VALUE.equals(configuratorUrl.getHost()) || host.equals(configuratorUrl.getHost())) {
+            // TODO, to support wildcards
+            String providers = configuratorUrl.getParameter(OVERRIDE_PROVIDERS_KEY);
+            if (StringUtils.isEmpty(providers) || providers.contains(url.getAddress()) || providers.contains(ANYHOST_VALUE)) {
+                String configApplication = configuratorUrl.getParameter(APPLICATION_KEY,
+                        configuratorUrl.getUsername());
+                String currentApplication = url.getParameter(APPLICATION_KEY, url.getUsername());
+                if (configApplication == null || ANY_VALUE.equals(configApplication)
+                        || configApplication.equals(currentApplication)) {
+                    Set<String> conditionKeys = new HashSet<String>();
+                    conditionKeys.add(CATEGORY_KEY);
+                    conditionKeys.add(Constants.CHECK_KEY);
+                    conditionKeys.add(DYNAMIC_KEY);
+                    conditionKeys.add(ENABLED_KEY);
+                    conditionKeys.add(GROUP_KEY);
+                    conditionKeys.add(VERSION_KEY);
+                    conditionKeys.add(APPLICATION_KEY);
+                    conditionKeys.add(SIDE_KEY);
+                    conditionKeys.add(CONFIG_VERSION_KEY);
+                    conditionKeys.add(COMPATIBLE_CONFIG_KEY);
+                    conditionKeys.add(INTERFACES);
+                    for (Map.Entry<String, String> entry : configuratorUrl.getParameters().entrySet()) {
+                        String key = entry.getKey();
+                        String value = entry.getValue();
+                        if (key.startsWith("~") || APPLICATION_KEY.equals(key) || SIDE_KEY.equals(key)) {
+                            conditionKeys.add(key);
+                            if (value != null && !ANY_VALUE.equals(value)
+                                    && !value.equals(url.getParameter(key.startsWith("~") ? key.substring(1) : key))) {
+                                return url;
+                            }
+                        }
+                    }
+                    return doConfigure(url, configuratorUrl.removeParameters(conditionKeys));
+                }
+            }
+        }
+        return url;
+    }
+
+    protected abstract URL doConfigure(URL currentUrl, URL configUrl);
+
+}
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/absent/AbsentConfigurator.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/absent/AbsentConfigurator.java
new file mode 100644
index 0000000..cb83b8b
--- /dev/null
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/absent/AbsentConfigurator.java
@@ -0,0 +1,37 @@
+/*
+ * 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.rpc.cluster.configurator.absent;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.rpc.cluster.configurator.AbstractConfigurator;
+
+/**
+ * AbsentConfigurator
+ *
+ */
+public class AbsentConfigurator extends AbstractConfigurator {
+
+    public AbsentConfigurator(URL url) {
+        super(url);
+    }
+
+    @Override
+    public URL doConfigure(URL currentUrl, URL configUrl) {
+        return currentUrl.addParametersIfAbsent(configUrl.getParameters());
+    }
+
+}
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/absent/AbsentConfiguratorFactory.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/absent/AbsentConfiguratorFactory.java
new file mode 100644
index 0000000..479eb50
--- /dev/null
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/absent/AbsentConfiguratorFactory.java
@@ -0,0 +1,34 @@
+/*
+ * 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.rpc.cluster.configurator.absent;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.rpc.cluster.Configurator;
+import org.apache.dubbo.rpc.cluster.ConfiguratorFactory;
+
+/**
+ * AbsentConfiguratorFactory
+ *
+ */
+public class AbsentConfiguratorFactory implements ConfiguratorFactory {
+
+    @Override
+    public Configurator getConfigurator(URL url) {
+        return new AbsentConfigurator(url);
+    }
+
+}
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/override/OverrideConfigurator.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/override/OverrideConfigurator.java
new file mode 100644
index 0000000..23f0a8d
--- /dev/null
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/override/OverrideConfigurator.java
@@ -0,0 +1,37 @@
+/*
+ * 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.rpc.cluster.configurator.override;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.rpc.cluster.configurator.AbstractConfigurator;
+
+/**
+ * OverrideConfigurator
+ *
+ */
+public class OverrideConfigurator extends AbstractConfigurator {
+
+    public OverrideConfigurator(URL url) {
+        super(url);
+    }
+
+    @Override
+    public URL doConfigure(URL currentUrl, URL configUrl) {
+        return currentUrl.addParameters(configUrl.getParameters());
+    }
+
+}
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/override/OverrideConfiguratorFactory.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/override/OverrideConfiguratorFactory.java
new file mode 100644
index 0000000..504ae3b
--- /dev/null
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/override/OverrideConfiguratorFactory.java
@@ -0,0 +1,34 @@
+/*
+ * 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.rpc.cluster.configurator.override;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.rpc.cluster.Configurator;
+import org.apache.dubbo.rpc.cluster.ConfiguratorFactory;
+
+/**
+ * OverrideConfiguratorFactory
+ *
+ */
+public class OverrideConfiguratorFactory implements ConfiguratorFactory {
+
+    @Override
+    public Configurator getConfigurator(URL url) {
+        return new OverrideConfigurator(url);
+    }
+
+}
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/parser/ConfigParser.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/parser/ConfigParser.java
new file mode 100644
index 0000000..0fc5fa9
--- /dev/null
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/parser/ConfigParser.java
@@ -0,0 +1,229 @@
+/*
+ * 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.rpc.cluster.configurator.parser;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONValidator;
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.common.utils.StringUtils;
+import org.apache.dubbo.rpc.cluster.configurator.parser.model.ConfigItem;
+import org.apache.dubbo.rpc.cluster.configurator.parser.model.ConfiguratorConfig;
+
+import org.yaml.snakeyaml.TypeDescription;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.Constructor;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import static org.apache.dubbo.rpc.cluster.Constants.OVERRIDE_PROVIDERS_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.ANYHOST_VALUE;
+import static org.apache.dubbo.common.constants.RegistryConstants.APP_DYNAMIC_CONFIGURATORS_CATEGORY;
+import static org.apache.dubbo.common.constants.RegistryConstants.DYNAMIC_CONFIGURATORS_CATEGORY;
+
+/**
+ * Config parser
+ */
+public class ConfigParser {
+
+    public static List<URL> parseConfigurators(String rawConfig) {
+        // compatible url JsonArray, such as [ "override://xxx", "override://xxx" ]
+        if (isJsonArray(rawConfig)) {
+            return parseJsonArray(rawConfig);
+        }
+
+        List<URL> urls = new ArrayList<>();
+        ConfiguratorConfig configuratorConfig = parseObject(rawConfig);
+
+        String scope = configuratorConfig.getScope();
+        List<ConfigItem> items = configuratorConfig.getConfigs();
+
+        if (ConfiguratorConfig.SCOPE_APPLICATION.equals(scope)) {
+            items.forEach(item -> urls.addAll(appItemToUrls(item, configuratorConfig)));
+        } else {
+            // service scope by default.
+            items.forEach(item -> urls.addAll(serviceItemToUrls(item, configuratorConfig)));
+        }
+        return urls;
+    }
+
+    private static List<URL> parseJsonArray(String rawConfig) {
+        List<URL> urls = new ArrayList<>();
+        List<String> list = JSON.parseArray(rawConfig, String.class);
+        if (!CollectionUtils.isEmpty(list)) {
+            list.forEach(u -> urls.add(URL.valueOf(u)));
+        }
+        return urls;
+    }
+
+    private static <T> T parseObject(String rawConfig) {
+        Constructor constructor = new Constructor(ConfiguratorConfig.class);
+        TypeDescription itemDescription = new TypeDescription(ConfiguratorConfig.class);
+        itemDescription.addPropertyParameters("items", ConfigItem.class);
+        constructor.addTypeDescription(itemDescription);
+
+        Yaml yaml = new Yaml(constructor);
+        return yaml.load(rawConfig);
+    }
+
+    private static List<URL> serviceItemToUrls(ConfigItem item, ConfiguratorConfig config) {
+        List<URL> urls = new ArrayList<>();
+        List<String> addresses = parseAddresses(item);
+
+        addresses.forEach(addr -> {
+            StringBuilder urlBuilder = new StringBuilder();
+            urlBuilder.append("override://").append(addr).append("/");
+
+            urlBuilder.append(appendService(config.getKey()));
+            urlBuilder.append(toParameterString(item));
+
+            parseEnabled(item, config, urlBuilder);
+
+            urlBuilder.append("&category=").append(DYNAMIC_CONFIGURATORS_CATEGORY);
+            urlBuilder.append("&configVersion=").append(config.getConfigVersion());
+
+            List<String> apps = item.getApplications();
+            if (CollectionUtils.isNotEmpty(apps)) {
+                apps.forEach(app -> urls.add(URL.valueOf(urlBuilder.append("&application=").append(app).toString())));
+            } else {
+                urls.add(URL.valueOf(urlBuilder.toString()));
+            }
+        });
+
+        return urls;
+    }
+
+    private static List<URL> appItemToUrls(ConfigItem item, ConfiguratorConfig config) {
+        List<URL> urls = new ArrayList<>();
+        List<String> addresses = parseAddresses(item);
+        for (String addr : addresses) {
+            StringBuilder urlBuilder = new StringBuilder();
+            urlBuilder.append("override://").append(addr).append("/");
+            List<String> services = item.getServices();
+            if (services == null) {
+                services = new ArrayList<>();
+            }
+            if (services.isEmpty()) {
+                services.add("*");
+            }
+            for (String s : services) {
+                urlBuilder.append(appendService(s));
+                urlBuilder.append(toParameterString(item));
+
+                urlBuilder.append("&application=").append(config.getKey());
+
+                parseEnabled(item, config, urlBuilder);
+
+                urlBuilder.append("&category=").append(APP_DYNAMIC_CONFIGURATORS_CATEGORY);
+                urlBuilder.append("&configVersion=").append(config.getConfigVersion());
+
+                urls.add(URL.valueOf(urlBuilder.toString()));
+            }
+        }
+        return urls;
+    }
+
+    private static String toParameterString(ConfigItem item) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("category=");
+        sb.append(DYNAMIC_CONFIGURATORS_CATEGORY);
+        if (item.getSide() != null) {
+            sb.append("&side=");
+            sb.append(item.getSide());
+        }
+        Map<String, String> parameters = item.getParameters();
+        if (CollectionUtils.isEmptyMap(parameters)) {
+            throw new IllegalStateException("Invalid configurator rule, please specify at least one parameter " +
+                    "you want to change in the rule.");
+        }
+
+        parameters.forEach((k, v) -> {
+            sb.append("&");
+            sb.append(k);
+            sb.append("=");
+            sb.append(v);
+        });
+
+        if (CollectionUtils.isNotEmpty(item.getProviderAddresses())) {
+            sb.append("&");
+            sb.append(OVERRIDE_PROVIDERS_KEY);
+            sb.append("=");
+            sb.append(CollectionUtils.join(item.getProviderAddresses(), ","));
+        }
+
+        return sb.toString();
+    }
+
+    private static String appendService(String serviceKey) {
+        StringBuilder sb = new StringBuilder();
+        if (StringUtils.isEmpty(serviceKey)) {
+            throw new IllegalStateException("service field in configuration is null.");
+        }
+
+        String interfaceName = serviceKey;
+        int i = interfaceName.indexOf('/');
+        if (i > 0) {
+            sb.append("group=");
+            sb.append(interfaceName, 0, i);
+            sb.append("&");
+
+            interfaceName = interfaceName.substring(i + 1);
+        }
+        int j = interfaceName.indexOf(':');
+        if (j > 0) {
+            sb.append("version=");
+            sb.append(interfaceName.substring(j + 1));
+            sb.append("&");
+            interfaceName = interfaceName.substring(0, j);
+        }
+        sb.insert(0, interfaceName + "?");
+
+        return sb.toString();
+    }
+
+    private static void parseEnabled(ConfigItem item, ConfiguratorConfig config, StringBuilder urlBuilder) {
+        urlBuilder.append("&enabled=");
+        if (item.getType() == null || ConfigItem.GENERAL_TYPE.equals(item.getType())) {
+            urlBuilder.append(config.getEnabled());
+        } else {
+            urlBuilder.append(item.getEnabled());
+        }
+    }
+
+    private static List<String> parseAddresses(ConfigItem item) {
+        List<String> addresses = item.getAddresses();
+        if (addresses == null) {
+            addresses = new ArrayList<>();
+        }
+        if (addresses.isEmpty()) {
+            addresses.add(ANYHOST_VALUE);
+        }
+        return addresses;
+    }
+
+    private static boolean isJsonArray(String rawConfig) {
+        try {
+            JSONValidator validator = JSONValidator.from(rawConfig);
+            return validator.validate() && validator.getType() == JSONValidator.Type.Array;
+        } catch (Exception e) {
+            // ignore exception and return false
+        }
+        return false;
+    }
+}
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/parser/model/ConfigItem.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/parser/model/ConfigItem.java
new file mode 100644
index 0000000..2a6a56a
--- /dev/null
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/parser/model/ConfigItem.java
@@ -0,0 +1,103 @@
+/*
+ * 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.rpc.cluster.configurator.parser.model;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ *
+ */
+public class ConfigItem {
+    public static final String GENERAL_TYPE = "general";
+    public static final String WEIGHT_TYPE = "weight";
+    public static final String BALANCING_TYPE = "balancing";
+    public static final String DISABLED_TYPE = "disabled";
+
+    private String type;
+    private Boolean enabled;
+    private List<String> addresses;
+    private List<String> providerAddresses;
+    private List<String> services;
+    private List<String> applications;
+    private Map<String, String> parameters;
+    private String side;
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public Boolean getEnabled() {
+        return enabled;
+    }
+
+    public void setEnabled(Boolean enabled) {
+        this.enabled = enabled;
+    }
+
+    public List<String> getAddresses() {
+        return addresses;
+    }
+
+    public void setAddresses(List<String> addresses) {
+        this.addresses = addresses;
+    }
+
+    public List<String> getServices() {
+        return services;
+    }
+
+    public void setServices(List<String> services) {
+        this.services = services;
+    }
+
+    public List<String> getApplications() {
+        return applications;
+    }
+
+    public void setApplications(List<String> applications) {
+        this.applications = applications;
+    }
+
+    public List<String> getProviderAddresses() {
+        return providerAddresses;
+    }
+
+    public void setProviderAddresses(List<String> providerAddresses) {
+        this.providerAddresses = providerAddresses;
+    }
+
+    public Map<String, String> getParameters() {
+        return parameters;
+    }
+
+    public void setParameters(Map<String, String> parameters) {
+        this.parameters = parameters;
+    }
+
+    public String getSide() {
+        return side;
+    }
+
+    public void setSide(String side) {
+        this.side = side;
+    }
+}
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/parser/model/ConfiguratorConfig.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/parser/model/ConfiguratorConfig.java
new file mode 100644
index 0000000..aadc999
--- /dev/null
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/configurator/parser/model/ConfiguratorConfig.java
@@ -0,0 +1,74 @@
+/*
+ * 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.rpc.cluster.configurator.parser.model;
+
+import java.util.List;
+
+/**
+ *
+ */
+public class ConfiguratorConfig {
+    public static final String SCOPE_SERVICE = "service";
+    public static final String SCOPE_APPLICATION = "application";
+
+    private String configVersion;
+    private String scope;
+    private String key;
+    private Boolean enabled = true;
+    private List<ConfigItem> configs;
+
+
+    public String getConfigVersion() {
+        return configVersion;
+    }
+
+    public void setConfigVersion(String configVersion) {
+        this.configVersion = configVersion;
+    }
+
+    public String getScope() {
+        return scope;
+    }
+
+    public void setScope(String scope) {
+        this.scope = scope;
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public Boolean getEnabled() {
+        return enabled;
+    }
+
+    public void setEnabled(Boolean enabled) {
+        this.enabled = enabled;
+    }
+
+    public List<ConfigItem> getConfigs() {
+        return configs;
+    }
+
+    public void setConfigs(List<ConfigItem> configs) {
+        this.configs = configs;
+    }
+}
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
new file mode 100644
index 0000000..7984d7d
--- /dev/null
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/directory/AbstractDirectory.java
@@ -0,0 +1,114 @@
+/*
+ * 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.rpc.cluster.directory;
+
+import org.apache.dubbo.common.URL;
+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.RouterChain;
+
+import java.util.Collections;
+import java.util.List;
+
+import static org.apache.dubbo.common.constants.CommonConstants.MONITOR_KEY;
+import static org.apache.dubbo.rpc.cluster.Constants.REFER_KEY;
+
+/**
+ * Abstract implementation of Directory: Invoker list returned from this Directory's list method have been filtered by Routers
+ *
+ */
+public abstract class AbstractDirectory<T> implements Directory<T> {
+
+    // logger
+    private static final Logger logger = LoggerFactory.getLogger(AbstractDirectory.class);
+
+    private final URL url;
+
+    private volatile boolean destroyed = false;
+
+    private volatile URL consumerUrl;
+
+    protected RouterChain<T> routerChain;
+
+    public AbstractDirectory(URL url) {
+        this(url, null);
+    }
+
+    public AbstractDirectory(URL url, RouterChain<T> routerChain) {
+        if (url == null) {
+            throw new IllegalArgumentException("url == null");
+        }
+
+        this.url = url.removeParameter(REFER_KEY).removeParameter(MONITOR_KEY);
+        this.consumerUrl = this.url.addParameters(StringUtils.parseQueryString(url.getParameterAndDecoded(REFER_KEY)));
+
+        setRouterChain(routerChain);
+    }
+
+    @Override
+    public List<Invoker<T>> list(Invocation invocation) throws RpcException {
+        if (destroyed) {
+            throw new RpcException("Directory already destroyed .url: " + getUrl());
+        }
+
+        return doList(invocation);
+    }
+
+    @Override
+    public URL getUrl() {
+        return url;
+    }
+
+    public RouterChain<T> getRouterChain() {
+        return routerChain;
+    }
+
+    public void setRouterChain(RouterChain<T> routerChain) {
+        this.routerChain = routerChain;
+    }
+
+    protected void addRouters(List<Router> routers) {
+        routers = routers == null ? Collections.emptyList() : routers;
+        routerChain.addRouters(routers);
+    }
+
+    public URL getConsumerUrl() {
+        return consumerUrl;
+    }
+
+    public void setConsumerUrl(URL consumerUrl) {
+        this.consumerUrl = consumerUrl;
+    }
+
+    public boolean isDestroyed() {
+        return destroyed;
+    }
+
+    @Override
+    public void destroy() {
+        destroyed = true;
+    }
+
+    protected abstract List<Invoker<T>> doList(Invocation invocation) throws RpcException;
+
+}
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/directory/StaticDirectory.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/directory/StaticDirectory.java
new file mode 100644
index 0000000..379ae12
--- /dev/null
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/directory/StaticDirectory.java
@@ -0,0 +1,113 @@
+/*
+ * 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.rpc.cluster.directory;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.logger.Logger;
+import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.rpc.Invocation;
+import org.apache.dubbo.rpc.Invoker;
+import org.apache.dubbo.rpc.RpcException;
+import org.apache.dubbo.rpc.cluster.RouterChain;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * StaticDirectory
+ */
+public class StaticDirectory<T> extends AbstractDirectory<T> {
+    private static final Logger logger = LoggerFactory.getLogger(StaticDirectory.class);
+
+    private final List<Invoker<T>> invokers;
+
+    public StaticDirectory(List<Invoker<T>> invokers) {
+        this(null, invokers, null);
+    }
+
+    public StaticDirectory(List<Invoker<T>> invokers, RouterChain<T> routerChain) {
+        this(null, invokers, routerChain);
+    }
+
+    public StaticDirectory(URL url, List<Invoker<T>> invokers) {
+        this(url, invokers, null);
+    }
+
+    public StaticDirectory(URL url, List<Invoker<T>> invokers, RouterChain<T> routerChain) {
+        super(url == null && CollectionUtils.isNotEmpty(invokers) ? invokers.get(0).getUrl() : url, routerChain);
+        if (CollectionUtils.isEmpty(invokers)) {
+            throw new IllegalArgumentException("invokers == null");
+        }
+        this.invokers = invokers;
+    }
+
+    @Override
+    public Class<T> getInterface() {
+        return invokers.get(0).getInterface();
+    }
+
+    @Override
+    public List<Invoker<T>> getAllInvokers() {
+        return invokers;
+    }
+
+    @Override
+    public boolean isAvailable() {
+        if (isDestroyed()) {
+            return false;
+        }
+        for (Invoker<T> invoker : invokers) {
+            if (invoker.isAvailable()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public void destroy() {
+        if (isDestroyed()) {
+            return;
+        }
+        super.destroy();
+        for (Invoker<T> invoker : invokers) {
+            invoker.destroy();
+        }
+        invokers.clear();
+    }
+
+    public void buildRouterChain() {
+        RouterChain<T> routerChain = RouterChain.buildChain(getUrl());
+        routerChain.setInvokers(invokers);
+        this.setRouterChain(routerChain);
+    }
+
+    @Override
+    protected List<Invoker<T>> doList(Invocation invocation) throws RpcException {
+        List<Invoker<T>> finalInvokers = invokers;
+        if (routerChain != null) {
+            try {
+                finalInvokers = routerChain.route(getConsumerUrl(), invocation);
+            } catch (Throwable t) {
+                logger.error("Failed to execute router: " + getUrl() + ", cause: " + t.getMessage(), t);
+            }
+        }
+        return finalInvokers == null ? Collections.emptyList() : finalInvokers;
+    }
+
+}
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/governance/DefaultGovernanceRuleRepositoryImpl.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/governance/DefaultGovernanceRuleRepositoryImpl.java
new file mode 100644
index 0000000..64ddb02
--- /dev/null
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/governance/DefaultGovernanceRuleRepositoryImpl.java
@@ -0,0 +1,40 @@
+/*
+ * 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.rpc.cluster.governance;
+
+import org.apache.dubbo.common.config.configcenter.ConfigurationListener;
+import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
+
+public class DefaultGovernanceRuleRepositoryImpl implements GovernanceRuleRepository {
+
+    private DynamicConfiguration dynamicConfiguration = DynamicConfiguration.getDynamicConfiguration();
+
+    @Override
+    public void addListener(String key, String group, ConfigurationListener listener) {
+        dynamicConfiguration.addListener(key, group, listener);
+    }
+
+    @Override
+    public void removeListener(String key, String group, ConfigurationListener listener) {
+        dynamicConfiguration.removeListener(key, group, listener);
+    }
+
+    @Override
+    public String getRule(String key, String group, long timeout) throws IllegalStateException {
+        return dynamicConfiguration.getConfig(key, group, timeout);
+    }
+}
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/governance/GovernanceRuleRepository.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/governance/GovernanceRuleRepository.java
new file mode 100644
index 0000000..a8e5e18
--- /dev/null
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/governance/GovernanceRuleRepository.java
@@ -0,0 +1,91 @@
+/*
+ * 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.rpc.cluster.governance;
+
+import org.apache.dubbo.common.config.configcenter.ConfigurationListener;
+import org.apache.dubbo.common.extension.SPI;
+
+@SPI("default")
+public interface GovernanceRuleRepository {
+
+    String DEFAULT_GROUP = "dubbo";
+
+    /**
+     * {@link #addListener(String, String, ConfigurationListener)}
+     *
+     * @param key      the key to represent a configuration
+     * @param listener configuration listener
+     */
+    default void addListener(String key, ConfigurationListener listener) {
+        addListener(key, DEFAULT_GROUP, listener);
+    }
+
+
+    /*
+     * {@link #removeListener(String, String, ConfigurationListener)}
+     *
+     * @param key      the key to represent a configuration
+     * @param listener configuration listener
+     */
+    default void removeListener(String key, ConfigurationListener listener) {
+        removeListener(key, DEFAULT_GROUP, listener);
+    }
+
+    /**
+     * Register a configuration listener for a specified key
+     * The listener only works for service governance purpose, so the target group would always be the value user
+     * specifies at startup or 'dubbo' by default. This method will only register listener, which means it will not
+     * trigger a notification that contains the current value.
+     *
+     * @param key      the key to represent a configuration
+     * @param group    the group where the key belongs to
+     * @param listener configuration listener
+     */
+    void addListener(String key, String group, ConfigurationListener listener);
+
+    /**
+     * Stops one listener from listening to value changes in the specified key.
+     *
+     * @param key      the key to represent a configuration
+     * @param group    the group where the key belongs to
+     * @param listener configuration listener
+     */
+    void removeListener(String key, String group, ConfigurationListener listener);
+
+    /**
+     * Get the governance rule mapped to the given key and the given group
+     *
+     * @param key   the key to represent a configuration
+     * @param group the group where the key belongs to
+     * @return target configuration mapped to the given key and the given group
+     */
+    default String getRule(String key, String group) {
+        return getRule(key, group, -1L);
+    }
+
+    /**
+     * Get the governance rule mapped to the given key and the given group. If the
+     * rule fails to return after timeout exceeds, IllegalStateException will be thrown.
+     *
+     * @param key     the key to represent a configuration
+     * @param group   the group where the key belongs to
+     * @param timeout timeout value for fetching the target config
+     * @return target configuration mapped to the given key and the given group, IllegalStateException will be thrown
+     * if timeout exceeds.
+     */
+    String getRule(String key, String group, long timeout) throws IllegalStateException;
+}
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/interceptor/ClusterInterceptor.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/interceptor/ClusterInterceptor.java
new file mode 100644
index 0000000..e989699
--- /dev/null
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/interceptor/ClusterInterceptor.java
@@ -0,0 +1,56 @@
+/*
+ * 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.rpc.cluster.interceptor;
+
+import org.apache.dubbo.common.extension.SPI;
+import org.apache.dubbo.rpc.Filter;
+import org.apache.dubbo.rpc.Invocation;
+import org.apache.dubbo.rpc.Result;
+import org.apache.dubbo.rpc.RpcException;
+import org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker;
+
+/**
+ * Different from {@link Filter}, ClusterInterceptor works at the outmost layer, before one specific address/invoker is picked.
+ */
+@SPI
+public interface ClusterInterceptor {
+
+    void before(AbstractClusterInvoker<?> clusterInvoker, Invocation invocation);
+
+    void after(AbstractClusterInvoker<?> clusterInvoker, Invocation invocation);
+
+    /**
+     * Does not need to override this method, override {@link #before(AbstractClusterInvoker, Invocation)}
+     * and {@link #after(AbstractClusterInvoker, Invocation)}, methods to add your own logic expected to be
+     * executed before and after invoke.
+     *
+     * @param clusterInvoker
+     * @param invocation
+     * @return
+     * @throws RpcException
+     */
+    default Result intercept(AbstractClusterInvoker<?> clusterInvoker, Invocation invocation) throws RpcException {
+        return clusterInvoker.invoke(invocation);
+    }
+
+    interface Listener {
+
+        void onMessage(Result appResponse, AbstractClusterInvoker<?> clusterInvoker, Invocation invocation);
+
+        void onError(Throwable t, AbstractClusterInvoker<?> clusterInvoker, Invocation invocation);
+    }
+}
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/interceptor/ConsumerContextClusterInterceptor.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/interceptor/ConsumerContextClusterInterceptor.java
new file mode 100644
index 0000000..4beb7a0
--- /dev/null
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/interceptor/ConsumerContextClusterInterceptor.java
@@ -0,0 +1,54 @@
+/*
+ * 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.rpc.cluster.interceptor;
+
+import org.apache.dubbo.common.extension.Activate;
+import org.apache.dubbo.common.utils.NetUtils;
+import org.apache.dubbo.rpc.Invocation;
+import org.apache.dubbo.rpc.Result;
+import org.apache.dubbo.rpc.RpcContext;
+import org.apache.dubbo.rpc.RpcInvocation;
+import org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker;
+
+@Activate
+public class ConsumerContextClusterInterceptor implements ClusterInterceptor, ClusterInterceptor.Listener {
+
+    @Override
+    public void before(AbstractClusterInvoker<?> invoker, Invocation invocation) {
+        RpcContext context = RpcContext.getContext();
+        context.setInvocation(invocation).setLocalAddress(NetUtils.getLocalHost(), 0);
+        if (invocation instanceof RpcInvocation) {
+            ((RpcInvocation) invocation).setInvoker(invoker);
+        }
+        RpcContext.removeServerContext();
+    }
+
+    @Override
+    public void after(AbstractClusterInvoker<?> clusterInvoker, Invocation invocation) {
+        RpcContext.removeContext(true);
+    }
+
+    @Override
+    public void onMessage(Result appResponse, AbstractClusterInvoker<?> invoker, Invocation invocation) {
+        RpcContext.getServerContext().setObjectAttachments(appResponse.getObjectAttachments());
+    }
+
+    @Override
+    public void onError(Throwable t, AbstractClusterInvoker<?> invoker, Invocation invocation) {
+
+    }
+}
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/interceptor/ZoneAwareClusterInterceptor.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/interceptor/ZoneAwareClusterInterceptor.java
new file mode 100644
index 0000000..6daec08
--- /dev/null
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/interceptor/ZoneAwareClusterInterceptor.java
@@ -0,0 +1,62 @@
+/*
+ * 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.rpc.cluster.interceptor;
+
+import org.apache.dubbo.common.extension.Activate;
+import org.apache.dubbo.common.extension.ExtensionLoader;
+import org.apache.dubbo.common.utils.StringUtils;
+import org.apache.dubbo.rpc.Invocation;
+import org.apache.dubbo.rpc.RpcContext;
+import org.apache.dubbo.rpc.ZoneDetector;
+import org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker;
+
+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_ZONE;
+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_ZONE_FORCE;
+
+/**
+ * Determines the zone information of current request.
+ *
+ * active only when url has key 'cluster=zone-aware'
+ */
+@Activate(value = "cluster:zone-aware")
+public class ZoneAwareClusterInterceptor implements ClusterInterceptor {
+
+    @Override
+    public void before(AbstractClusterInvoker<?> clusterInvoker, Invocation invocation) {
+        RpcContext rpcContext = RpcContext.getContext();
+        String zone = (String) rpcContext.getAttachment(REGISTRY_ZONE);
+        String force = (String) rpcContext.getAttachment(REGISTRY_ZONE_FORCE);
+        ExtensionLoader<ZoneDetector> loader = ExtensionLoader.getExtensionLoader(ZoneDetector.class);
+        if (StringUtils.isEmpty(zone) && loader.hasExtension("default")) {
+            ZoneDetector detector = loader.getExtension("default");
+            zone = detector.getZoneOfCurrentRequest(invocation);
+            force = detector.isZoneForcingEnabled(invocation, zone);
+        }
+
+        if (StringUtils.isNotEmpty(zone)) {
+            invocation.setAttachment(REGISTRY_ZONE, zone);
+        }
+        if (StringUtils.isNotEmpty(force)) {
+            invocation.setAttachment(REGISTRY_ZONE_FORCE, force);
+        }
+    }
+
+    @Override
+    public void after(AbstractClusterInvoker<?> clusterInvoker, Invocation invocation) {
+
+    }
+}
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/loadbalance/AbstractLoadBalance.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/loadbalance/AbstractLoadBalance.java
new file mode 100644
index 0000000..31024be
--- /dev/null
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/loadbalance/AbstractLoadBalance.java
@@ -0,0 +1,99 @@
+/*
+ * 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.rpc.cluster.loadbalance;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.rpc.Invocation;
+import org.apache.dubbo.rpc.Invoker;
+import org.apache.dubbo.rpc.cluster.LoadBalance;
+
+import java.util.List;
+
+import static org.apache.dubbo.common.constants.CommonConstants.TIMESTAMP_KEY;
+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_KEY;
+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_SERVICE_REFERENCE_PATH;
+import static org.apache.dubbo.rpc.cluster.Constants.DEFAULT_WARMUP;
+import static org.apache.dubbo.rpc.cluster.Constants.DEFAULT_WEIGHT;
+import static org.apache.dubbo.rpc.cluster.Constants.WARMUP_KEY;
+import static org.apache.dubbo.rpc.cluster.Constants.WEIGHT_KEY;
+
+/**
+ * AbstractLoadBalance
+ */
+public abstract class AbstractLoadBalance implements LoadBalance {
+    /**
+     * Calculate the weight according to the uptime proportion of warmup time
+     * the new weight will be within 1(inclusive) to weight(inclusive)
+     *
+     * @param uptime the uptime in milliseconds
+     * @param warmup the warmup time in milliseconds
+     * @param weight the weight of an invoker
+     * @return weight which takes warmup into account
+     */
+    static int calculateWarmupWeight(int uptime, int warmup, int weight) {
+        int ww = (int) ( uptime / ((float) warmup / weight));
+        return ww < 1 ? 1 : (Math.min(ww, weight));
+    }
+
+    @Override
+    public <T> Invoker<T> select(List<Invoker<T>> invokers, URL url, Invocation invocation) {
+        if (CollectionUtils.isEmpty(invokers)) {
+            return null;
+        }
+        if (invokers.size() == 1) {
+            return invokers.get(0);
+        }
+        return doSelect(invokers, url, invocation);
+    }
+
+    protected abstract <T> Invoker<T> doSelect(List<Invoker<T>> invokers, URL url, Invocation invocation);
+
+
+    /**
+     * Get the weight of the invoker's invocation which takes warmup time into account
+     * if the uptime is within the warmup time, the weight will be reduce proportionally
+     *
+     * @param invoker    the invoker
+     * @param invocation the invocation of this invoker
+     * @return weight
+     */
+    int getWeight(Invoker<?> invoker, Invocation invocation) {
+        int weight;
+        URL url = invoker.getUrl();
+        // Multiple registry scenario, load balance among multiple registries.
+        if (REGISTRY_SERVICE_REFERENCE_PATH.equals(url.getServiceInterface())) {
+            weight = url.getParameter(REGISTRY_KEY + "." + WEIGHT_KEY, DEFAULT_WEIGHT);
+        } else {
+            weight = url.getMethodParameter(invocation.getMethodName(), WEIGHT_KEY, DEFAULT_WEIGHT);
+            if (weight > 0) {
+                long timestamp = invoker.getUrl().getParameter(TIMESTAMP_KEY, 0L);
+                if (timestamp > 0L) {
+                    long uptime = System.currentTimeMillis() - timestamp;
+                    if (uptime < 0) {
+                        return 1;
+                    }
+                    int warmup = invoker.getUrl().getParameter(WARMUP_KEY, DEFAULT_WARMUP);
+                    if (uptime > 0 && uptime < warmup) {
+                        weight = calculateWarmupWeight((int)uptime, warmup, weight);
+                    }
+                }
+            }
+        }
+        return Math.max(weight, 0);
+    }
+}
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/loadbalance/ConsistentHashLoadBalance.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/loadbalance/ConsistentHashLoadBalance.java
new file mode 100644
index 0000000..6eb6f7e
--- /dev/null
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/loadbalance/ConsistentHashLoadBalance.java
@@ -0,0 +1,147 @@
+/*
+ * 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.rpc.cluster.loadbalance;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.rpc.Invocation;
+import org.apache.dubbo.rpc.Invoker;
+import org.apache.dubbo.rpc.support.RpcUtils;
+
+import java.nio.charset.StandardCharsets;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SPLIT_PATTERN;
+
+/**
+ * ConsistentHashLoadBalance
+ */
+public class ConsistentHashLoadBalance extends AbstractLoadBalance {
+    public static final String NAME = "consistenthash";
+
+    /**
+     * Hash nodes name
+     */
+    public static final String HASH_NODES = "hash.nodes";
+
+    /**
+     * Hash arguments name
+     */
+    public static final String HASH_ARGUMENTS = "hash.arguments";
+
+    private final ConcurrentMap<String, ConsistentHashSelector<?>> selectors = new ConcurrentHashMap<String, ConsistentHashSelector<?>>();
+
+    @SuppressWarnings("unchecked")
+    @Override
+    protected <T> Invoker<T> doSelect(List<Invoker<T>> invokers, URL url, Invocation invocation) {
+        String methodName = RpcUtils.getMethodName(invocation);
+        String key = invokers.get(0).getUrl().getServiceKey() + "." + methodName;
+        // using the hashcode of list to compute the hash only pay attention to the elements in the list
+        int invokersHashCode = invokers.hashCode();
+        ConsistentHashSelector<T> selector = (ConsistentHashSelector<T>) selectors.get(key);
+        if (selector == null || selector.identityHashCode != invokersHashCode) {
+            selectors.put(key, new ConsistentHashSelector<T>(invokers, methodName, invokersHashCode));
+            selector = (ConsistentHashSelector<T>) selectors.get(key);
+        }
+        return selector.select(invocation);
+    }
+
+    private static final class ConsistentHashSelector<T> {
+
+        private final TreeMap<Long, Invoker<T>> virtualInvokers;
+
+        private final int replicaNumber;
+
+        private final int identityHashCode;
+
+        private final int[] argumentIndex;
+
+        ConsistentHashSelector(List<Invoker<T>> invokers, String methodName, int identityHashCode) {
+            this.virtualInvokers = new TreeMap<Long, Invoker<T>>();
+            this.identityHashCode = identityHashCode;
+            URL url = invokers.get(0).getUrl();
+            this.replicaNumber = url.getMethodParameter(methodName, HASH_NODES, 160);
+            String[] index = COMMA_SPLIT_PATTERN.split(url.getMethodParameter(methodName, HASH_ARGUMENTS, "0"));
+            argumentIndex = new int[index.length];
+            for (int i = 0; i < index.length; i++) {
+                argumentIndex[i] = Integer.parseInt(index[i]);
+            }
... 301524 lines suppressed ...