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

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

commit 2245cf70bc89c229a387fd9aa59339bdb947f8d6
Author: ken.lj <ken.lj...@gmail.com>
AuthorDate: Fri Aug 9 10:36:28 2019 +0800

    Introduce ProtocolServer to distinguish from RemotingServer
---
 .../org/apache/dubbo/bootstrap/DubboBootstrap.java |  1 +
 .../DefaultGovernanceRuleRepositoryImpl.java       | 52 ++----------
 .../governance/GovernanceRuleRepository.java       | 94 ++++++++++++++++++++++
 .../dubbo/rpc/cluster/router/AbstractRouter.java   | 13 ++-
 .../cluster/router/condition/config/AppRouter.java |  5 +-
 .../router/condition/config/AppRouterFactory.java  |  3 +-
 .../router/condition/config/ListenableRouter.java  |  8 +-
 .../router/condition/config/ServiceRouter.java     |  4 +-
 .../condition/config/ServiceRouterFactory.java     |  3 +-
 .../dubbo/rpc/cluster/router/tag/TagRouter.java    | 10 +--
 .../rpc/cluster/router/tag/TagRouterFactory.java   |  3 +-
 ...rpc.cluster.governance.GovernanceRuleRepository |  1 +
 .../apache/dubbo/common/config/Configuration.java  | 49 +++++++++++
 .../configcenter/AbstractDynamicConfiguration.java |  5 --
 .../config/configcenter/DynamicConfiguration.java  | 26 ------
 .../file/FileSystemDynamicConfiguration.java       |  5 --
 .../configcenter/nop/NopDynamicConfiguration.java  |  6 --
 .../wrapper/CompositeDynamicConfiguration.java     |  5 --
 .../file/FileSystemDynamicConfigurationTest.java   |  2 +-
 .../support/apollo/ApolloDynamicConfiguration.java |  2 +-
 .../consul/ConsulDynamicConfiguration.java         | 15 ++--
 .../support/etcd/EtcdDynamicConfiguration.java     | 12 +--
 .../support/nacos/NacosDynamicConfiguration.java   |  5 --
 .../zookeeper/ZookeeperDynamicConfiguration.java   | 10 ---
 .../dubbo/qos/protocol/QosProtocolWrapper.java     |  7 ++
 .../integration/AbstractConfiguratorListener.java  |  8 +-
 .../registry/integration/RegistryDirectory.java    |  3 +-
 .../registry/integration/RegistryProtocol.java     |  5 +-
 .../java/org/apache/dubbo/rpc/ProtocolServer.java  |  5 +-
 .../dubbo/rpc/protocol/AbstractProxyProtocol.java  |  2 +-
 .../rpc/protocol/dubbo/DubboProtocolServer.java    |  2 +-
 .../rpc/protocol/rest/BaseRestProtocolServer.java  | 12 +++
 ...ttpServer.java => DubboHttpProtocolServer.java} |  4 +-
 .../dubbo/rpc/protocol/rest/RestProtocol.java      |  1 +
 .../dubbo/rpc/protocol/rest/RestServerFactory.java |  2 +-
 .../dubbo/rpc/protocol/thrift/ThriftProtocol.java  |  2 +-
 36 files changed, 224 insertions(+), 168 deletions(-)

diff --git 
a/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java 
b/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java
index fbc523a..005f11d 100644
--- 
a/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java
+++ 
b/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java
@@ -59,6 +59,7 @@ import org.apache.dubbo.rpc.ProtocolServer;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/nop/NopDynamicConfiguration.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/governance/DefaultGovernanceRuleRepositoryImpl.java
similarity index 53%
copy from 
dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/nop/NopDynamicConfiguration.java
copy to 
dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/governance/DefaultGovernanceRuleRepositoryImpl.java
index 7940101..64ddb02 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/nop/NopDynamicConfiguration.java
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/governance/DefaultGovernanceRuleRepositoryImpl.java
@@ -14,67 +14,27 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.common.config.configcenter.nop;
+package org.apache.dubbo.rpc.cluster.governance;
 
-import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.config.configcenter.ConfigurationListener;
 import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
 
-import java.util.SortedSet;
+public class DefaultGovernanceRuleRepositoryImpl implements 
GovernanceRuleRepository {
 
-import static java.util.Collections.emptySortedSet;
-
-/**
- * The default extension of {@link DynamicConfiguration}. If user does not 
specify a config centre, or specifies one
- * that is not a valid extension, it will default to this one.
- */
-@Deprecated
-public class NopDynamicConfiguration implements DynamicConfiguration {
-
-    public NopDynamicConfiguration(URL url) {
-        // no-op
-    }
-
-    @Override
-    public Object getInternalProperty(String key) {
-        return null;
-    }
+    private DynamicConfiguration dynamicConfiguration = 
DynamicConfiguration.getDynamicConfiguration();
 
     @Override
     public void addListener(String key, String group, ConfigurationListener 
listener) {
-        // no-op
+        dynamicConfiguration.addListener(key, group, listener);
     }
 
     @Override
     public void removeListener(String key, String group, ConfigurationListener 
listener) {
-        // no-op
-    }
-
-    @Override
-    public String getConfig(String key, String group, long timeout) throws 
IllegalStateException {
-        // no-op
-        return null;
+        dynamicConfiguration.removeListener(key, group, listener);
     }
 
     @Override
     public String getRule(String key, String group, long timeout) throws 
IllegalStateException {
-        // no-op
-        return null;
-    }
-
-    /**
-     * @since 2.7.4
-     */
-    @Override
-    public boolean publishConfig(String key, String group, String content) {
-        return true;
-    }
-
-    /**
-     * @since 2.7.4
-     */
-    @Override
-    public SortedSet<String> getConfigKeys(String group) {
-        return emptySortedSet();
+        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..4391cba
--- /dev/null
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/governance/GovernanceRuleRepository.java
@@ -0,0 +1,94 @@
+/*
+ * 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/router/AbstractRouter.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/AbstractRouter.java
index b848cb1..e5809b0 100644
--- 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/AbstractRouter.java
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/AbstractRouter.java
@@ -17,18 +17,19 @@
 package org.apache.dubbo.rpc.cluster.router;
 
 import org.apache.dubbo.common.URL;
-import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
+import org.apache.dubbo.common.extension.ExtensionLoader;
 import org.apache.dubbo.rpc.cluster.Router;
+import org.apache.dubbo.rpc.cluster.governance.GovernanceRuleRepository;
 
 public abstract class AbstractRouter implements Router {
     protected int priority = DEFAULT_PRIORITY;
     protected boolean force = false;
     protected URL url;
 
-    protected DynamicConfiguration configuration;
+    protected GovernanceRuleRepository ruleRepository;
 
-    public AbstractRouter(DynamicConfiguration configuration, URL url) {
-        this.configuration = configuration;
+    public AbstractRouter(URL url) {
+        this.ruleRepository = 
ExtensionLoader.getExtensionLoader(GovernanceRuleRepository.class).getDefaultExtension();
         this.url = url;
     }
 
@@ -44,10 +45,6 @@ public abstract class AbstractRouter implements Router {
         this.url = url;
     }
 
-    public void setConfiguration(DynamicConfiguration configuration) {
-        this.configuration = configuration;
-    }
-
     @Override
     public boolean isRuntime() {
         return true;
diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/AppRouter.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/AppRouter.java
index 852da6b..59a63c7 100644
--- 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/AppRouter.java
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/AppRouter.java
@@ -17,7 +17,6 @@
 package org.apache.dubbo.rpc.cluster.router.condition.config;
 
 import org.apache.dubbo.common.URL;
-import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
 import org.apache.dubbo.common.constants.CommonConstants;
 
 /**
@@ -30,8 +29,8 @@ public class AppRouter extends ListenableRouter {
      */
     private static final int APP_ROUTER_DEFAULT_PRIORITY = 150;
 
-    public AppRouter(DynamicConfiguration configuration, URL url) {
-        super(configuration, url, 
url.getParameter(CommonConstants.APPLICATION_KEY));
+    public AppRouter(URL url) {
+        super(url, url.getParameter(CommonConstants.APPLICATION_KEY));
         this.priority = APP_ROUTER_DEFAULT_PRIORITY;
     }
 }
diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/AppRouterFactory.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/AppRouterFactory.java
index 067a523..c0464d8 100644
--- 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/AppRouterFactory.java
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/AppRouterFactory.java
@@ -17,7 +17,6 @@
 package org.apache.dubbo.rpc.cluster.router.condition.config;
 
 import org.apache.dubbo.common.URL;
-import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
 import org.apache.dubbo.common.extension.Activate;
 import org.apache.dubbo.rpc.cluster.Router;
 import org.apache.dubbo.rpc.cluster.RouterFactory;
@@ -45,6 +44,6 @@ public class AppRouterFactory implements RouterFactory {
     }
 
     private Router createRouter(URL url) {
-        return new AppRouter(DynamicConfiguration.getDynamicConfiguration(), 
url);
+        return new AppRouter(url);
     }
 }
diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/ListenableRouter.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/ListenableRouter.java
index 6d3276a..41044ec 100644
--- 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/ListenableRouter.java
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/ListenableRouter.java
@@ -49,8 +49,8 @@ public abstract class ListenableRouter extends AbstractRouter 
implements Configu
     private ConditionRouterRule routerRule;
     private List<ConditionRouter> conditionRouters = Collections.emptyList();
 
-    public ListenableRouter(DynamicConfiguration configuration, URL url, 
String ruleKey) {
-        super(configuration, url);
+    public ListenableRouter(URL url, String ruleKey) {
+        super(url);
         this.force = false;
         this.init(ruleKey);
     }
@@ -118,8 +118,8 @@ public abstract class ListenableRouter extends 
AbstractRouter implements Configu
             return;
         }
         String routerKey = ruleKey + RULE_SUFFIX;
-        configuration.addListener(routerKey, this);
-        String rule = configuration.getConfig(routerKey, 
DynamicConfiguration.DEFAULT_GROUP);
+        ruleRepository.addListener(routerKey, this);
+        String rule = ruleRepository.getRule(routerKey, 
DynamicConfiguration.DEFAULT_GROUP);
         if (StringUtils.isNotEmpty(rule)) {
             this.process(new ConfigChangeEvent(routerKey, rule));
         }
diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/ServiceRouter.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/ServiceRouter.java
index 2a50052..93ebf8b 100644
--- 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/ServiceRouter.java
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/ServiceRouter.java
@@ -29,8 +29,8 @@ public class ServiceRouter extends ListenableRouter {
      */
     private static final int SERVICE_ROUTER_DEFAULT_PRIORITY = 140;
 
-    public ServiceRouter(DynamicConfiguration configuration, URL url) {
-        super(configuration, url, DynamicConfiguration.getRuleKey(url));
+    public ServiceRouter(URL url) {
+        super(url, DynamicConfiguration.getRuleKey(url));
         this.priority = SERVICE_ROUTER_DEFAULT_PRIORITY;
     }
 }
diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/ServiceRouterFactory.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/ServiceRouterFactory.java
index 12911ac..af971d7 100644
--- 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/ServiceRouterFactory.java
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/condition/config/ServiceRouterFactory.java
@@ -17,7 +17,6 @@
 package org.apache.dubbo.rpc.cluster.router.condition.config;
 
 import org.apache.dubbo.common.URL;
-import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
 import org.apache.dubbo.common.extension.Activate;
 import org.apache.dubbo.rpc.cluster.CacheableRouterFactory;
 import org.apache.dubbo.rpc.cluster.Router;
@@ -32,7 +31,7 @@ public class ServiceRouterFactory extends 
CacheableRouterFactory {
 
     @Override
     protected Router createRouter(URL url) {
-        return new 
ServiceRouter(DynamicConfiguration.getDynamicConfiguration(), url);
+        return new ServiceRouter(url);
     }
 
 }
diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java
index 00ce099..05b1a11 100644
--- 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouter.java
@@ -55,8 +55,8 @@ public class TagRouter extends AbstractRouter implements 
ConfigurationListener {
     private TagRouterRule tagRouterRule;
     private String application;
 
-    public TagRouter(DynamicConfiguration configuration, URL url) {
-        super(configuration, url);
+    public TagRouter(URL url) {
+        super(url);
         this.priority = TAG_ROUTER_DEFAULT_PRIORITY;
     }
 
@@ -244,12 +244,12 @@ public class TagRouter extends AbstractRouter implements 
ConfigurationListener {
         synchronized (this) {
             if (!providerApplication.equals(application)) {
                 if (!StringUtils.isEmpty(application)) {
-                    configuration.removeListener(application + RULE_SUFFIX, 
this);
+                    ruleRepository.removeListener(application + RULE_SUFFIX, 
this);
                 }
                 String key = providerApplication + RULE_SUFFIX;
-                configuration.addListener(key, this);
+                ruleRepository.addListener(key, this);
                 application = providerApplication;
-                String rawRule = configuration.getConfig(key, 
DynamicConfiguration.DEFAULT_GROUP);
+                String rawRule = ruleRepository.getRule(key, 
DynamicConfiguration.DEFAULT_GROUP);
                 if (StringUtils.isNotEmpty(rawRule)) {
                     this.process(new ConfigChangeEvent(key, rawRule));
                 }
diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouterFactory.java
 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouterFactory.java
index 0df085d..3c9a60e 100644
--- 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouterFactory.java
+++ 
b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/tag/TagRouterFactory.java
@@ -17,7 +17,6 @@
 package org.apache.dubbo.rpc.cluster.router.tag;
 
 import org.apache.dubbo.common.URL;
-import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
 import org.apache.dubbo.common.extension.Activate;
 import org.apache.dubbo.rpc.cluster.CacheableRouterFactory;
 import org.apache.dubbo.rpc.cluster.Router;
@@ -32,6 +31,6 @@ public class TagRouterFactory extends CacheableRouterFactory {
 
     @Override
     protected Router createRouter(URL url) {
-        return new TagRouter(DynamicConfiguration.getDynamicConfiguration(), 
url);
+        return new TagRouter(url);
     }
 }
diff --git 
a/dubbo-cluster/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.governance.GovernanceRuleRepository
 
b/dubbo-cluster/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.governance.GovernanceRuleRepository
new file mode 100644
index 0000000..067a72e
--- /dev/null
+++ 
b/dubbo-cluster/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.governance.GovernanceRuleRepository
@@ -0,0 +1 @@
+default=org.apache.dubbo.rpc.cluster.governance.DefaultGovernanceRuleRepositoryImpl
\ No newline at end of file
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/Configuration.java 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/Configuration.java
index 94ff25f..f687c85 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/Configuration.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/Configuration.java
@@ -16,6 +16,8 @@
  */
 package org.apache.dubbo.common.config;
 
+import java.util.NoSuchElementException;
+
 /**
  * Configuration interface, to fetch the value for the specified key.
  */
@@ -44,6 +46,49 @@ public interface Configuration {
         return convert(String.class, key, defaultValue);
     }
 
+    default int getInt(String key) {
+        Integer i = this.getInteger(key, (Integer) null);
+        if (i != null) {
+            return i;
+        } else {
+            throw new NoSuchElementException('\'' + key + "' doesn't map to an 
existing object");
+        }
+    }
+
+    default int getInt(String key, int defaultValue) {
+        Integer i = this.getInteger(key, (Integer) null);
+        return i == null ? defaultValue : i;
+    }
+
+    default Integer getInteger(String key, Integer defaultValue) {
+        try {
+            return convert(Integer.class, key, defaultValue);
+        } catch (NumberFormatException e) {
+            throw new IllegalStateException('\'' + key + "' doesn't map to a 
Integer object", e);
+        }
+    }
+
+    default boolean getBoolean(String key) {
+        Boolean b = this.getBoolean(key, null);
+        if (b != null) {
+            return b;
+        } else {
+            throw new NoSuchElementException('\'' + key + "' doesn't map to an 
existing object");
+        }
+    }
+
+    default boolean getBoolean(String key, boolean defaultValue) {
+        return this.getBoolean(key, toBooleanObject(defaultValue));
+    }
+
+    default Boolean getBoolean(String key, Boolean defaultValue) {
+        try {
+            return convert(Boolean.class, key, defaultValue);
+        } catch (Exception e) {
+            throw new IllegalStateException("Try to get " + '\'' + key + "' 
failed, maybe because this key doesn't map to a Boolean object", e);
+        }
+    }
+
     /**
      * Gets a property from the configuration. This is the most basic get
      * method for retrieving values of properties. In a typical implementation
@@ -127,4 +172,8 @@ public interface Configuration {
 
         return cls.cast(obj);
     }
+
+    static Boolean toBooleanObject(boolean bool) {
+        return bool ? Boolean.TRUE : Boolean.FALSE;
+    }
 }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/AbstractDynamicConfiguration.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/AbstractDynamicConfiguration.java
index 604be99..3b7d3b3 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/AbstractDynamicConfiguration.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/AbstractDynamicConfiguration.java
@@ -75,11 +75,6 @@ public abstract class AbstractDynamicConfiguration 
implements DynamicConfigurati
     }
 
     @Override
-    public String getRule(String key, String group, long timeout) throws 
IllegalStateException {
-        return getConfig(key, group, timeout);
-    }
-
-    @Override
     public Object getInternalProperty(String key) {
         return null;
     }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/DynamicConfiguration.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/DynamicConfiguration.java
index 852ec62..777f50b 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/DynamicConfiguration.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/DynamicConfiguration.java
@@ -35,7 +35,6 @@ import static 
org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoad
  * <br/>
  * From the use scenario internally inside framework, there're mainly three 
kinds of methods:
  * <ol>
- * <li>{@link #getRule(String, String, long)}, get governance rules.</li>
  * <li>{@link #getProperties(String, String, long)}, get configuration file 
from Config Center at start up.</li>
  * <li>{@link #addListener(String, String, ConfigurationListener)}/ {@link 
#removeListener(String, String, ConfigurationListener)}
  * , add or remove listeners for governance rules or config items that need to 
watch.</li>
@@ -128,31 +127,6 @@ public interface DynamicConfiguration extends 
Configuration, AutoCloseable {
     }
 
     /**
-     * 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
-     * @since 2.7.3
-     */
-    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.
-     * @since 2.7.3
-     */
-    String getRule(String key, String group, long timeout) throws 
IllegalStateException;
-
-    /**
      * Publish Config mapped to the given key under the {@link #DEFAULT_GROUP 
default group}
      *
      * @param key     the key to represent a configuration
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfiguration.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfiguration.java
index 5b37c34..715fd87 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfiguration.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfiguration.java
@@ -348,11 +348,6 @@ public class FileSystemDynamicConfiguration implements 
DynamicConfiguration {
         });
     }
 
-    @Override
-    public String getRule(String key, String group, long timeout) throws 
IllegalStateException {
-        return getConfig(key, group, timeout);
-    }
-
     protected String getConfig(File configFile, long timeout) {
         return canRead(configFile) ? execute(() -> 
readFileToString(configFile, getEncoding()), timeout) : null;
     }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/nop/NopDynamicConfiguration.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/nop/NopDynamicConfiguration.java
index 7940101..e61af12 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/nop/NopDynamicConfiguration.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/nop/NopDynamicConfiguration.java
@@ -56,12 +56,6 @@ public class NopDynamicConfiguration implements 
DynamicConfiguration {
         return null;
     }
 
-    @Override
-    public String getRule(String key, String group, long timeout) throws 
IllegalStateException {
-        // no-op
-        return null;
-    }
-
     /**
      * @since 2.7.4
      */
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/wrapper/CompositeDynamicConfiguration.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/wrapper/CompositeDynamicConfiguration.java
index e86d656..16484e7 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/wrapper/CompositeDynamicConfiguration.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/wrapper/CompositeDynamicConfiguration.java
@@ -55,11 +55,6 @@ public class CompositeDynamicConfiguration implements 
DynamicConfiguration {
     }
 
     @Override
-    public String getRule(String key, String group, long timeout) throws 
IllegalStateException {
-        return (String) iterateConfigOperation(configuration -> 
configuration.getRule(key, group, timeout));
-    }
-
-    @Override
     public String getProperties(String key, String group, long timeout) throws 
IllegalStateException {
         return (String) iterateConfigOperation(configuration -> 
configuration.getProperties(key, group, timeout));
     }
diff --git 
a/dubbo-common/src/test/java/org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfigurationTest.java
 
b/dubbo-common/src/test/java/org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfigurationTest.java
index 5502bdf..17ead90 100644
--- 
a/dubbo-common/src/test/java/org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfigurationTest.java
+++ 
b/dubbo-common/src/test/java/org/apache/dubbo/common/config/configcenter/file/FileSystemDynamicConfigurationTest.java
@@ -83,7 +83,7 @@ public class FileSystemDynamicConfigurationTest {
         assertTrue(configuration.publishConfig(KEY, CONTENT));
         assertTrue(configuration.publishConfig(KEY, CONTENT));
         assertTrue(configuration.publishConfig(KEY, CONTENT));
-        assertEquals(CONTENT, configuration.getRule(KEY, DEFAULT_GROUP));
+        assertEquals(CONTENT, configuration.getConfig(KEY, DEFAULT_GROUP));
         assertTrue(configuration.getConfigs(null).size() > 0);
     }
 
diff --git 
a/dubbo-configcenter/dubbo-configcenter-apollo/src/main/java/org/apache/dubbo/configcenter/support/apollo/ApolloDynamicConfiguration.java
 
b/dubbo-configcenter/dubbo-configcenter-apollo/src/main/java/org/apache/dubbo/configcenter/support/apollo/ApolloDynamicConfiguration.java
index cd20dc2..603dd73 100644
--- 
a/dubbo-configcenter/dubbo-configcenter-apollo/src/main/java/org/apache/dubbo/configcenter/support/apollo/ApolloDynamicConfiguration.java
+++ 
b/dubbo-configcenter/dubbo-configcenter-apollo/src/main/java/org/apache/dubbo/configcenter/support/apollo/ApolloDynamicConfiguration.java
@@ -147,7 +147,7 @@ public class ApolloDynamicConfiguration implements 
DynamicConfiguration {
     }
 
     @Override
-    public String getRule(String key, String group, long timeout) throws 
IllegalStateException {
+    public String getProperties(String key, String group, long timeout) throws 
IllegalStateException {
         if (StringUtils.isEmpty(group)) {
             return dubboConfigFile.getContent();
         }
diff --git 
a/dubbo-configcenter/dubbo-configcenter-consul/src/main/java/org/apache/dubbo/configcenter/consul/ConsulDynamicConfiguration.java
 
b/dubbo-configcenter/dubbo-configcenter-consul/src/main/java/org/apache/dubbo/configcenter/consul/ConsulDynamicConfiguration.java
index 9a698a3..e6d5c74 100644
--- 
a/dubbo-configcenter/dubbo-configcenter-consul/src/main/java/org/apache/dubbo/configcenter/consul/ConsulDynamicConfiguration.java
+++ 
b/dubbo-configcenter/dubbo-configcenter-consul/src/main/java/org/apache/dubbo/configcenter/consul/ConsulDynamicConfiguration.java
@@ -98,14 +98,6 @@ public class ConsulDynamicConfiguration implements 
DynamicConfiguration {
     }
 
     @Override
-    public String getRule(String key, String group, long timeout) throws 
IllegalStateException {
-        if (StringUtils.isEmpty(group)) {
-            group = DEFAULT_GROUP;
-        }
-        return getConfig(key, group, timeout);
-    }
-
-    @Override
     public Object getInternalProperty(String key) {
         logger.info("get config from: " + key);
         Response<GetValue> response = getValue(key);
@@ -127,8 +119,13 @@ public class ConsulDynamicConfiguration implements 
DynamicConfiguration {
         return null;
     }
 
+    private String buildPath(String group) {
+        String actualGroup = StringUtils.isEmpty(group) ? DEFAULT_GROUP : 
group;
+        return rootPath + PATH_SEPARATOR + actualGroup;
+    }
+
     private String convertKey(String group, String key) {
-        return rootPath + PATH_SEPARATOR + group + PATH_SEPARATOR + key;
+        return buildPath(group) + PATH_SEPARATOR + key;
     }
 
     private int buildWatchTimeout(URL url) {
diff --git 
a/dubbo-configcenter/dubbo-configcenter-etcd/src/main/java/org/apache/dubbo/configcenter/support/etcd/EtcdDynamicConfiguration.java
 
b/dubbo-configcenter/dubbo-configcenter-etcd/src/main/java/org/apache/dubbo/configcenter/support/etcd/EtcdDynamicConfiguration.java
index c5b48b7..356161a 100644
--- 
a/dubbo-configcenter/dubbo-configcenter-etcd/src/main/java/org/apache/dubbo/configcenter/support/etcd/EtcdDynamicConfiguration.java
+++ 
b/dubbo-configcenter/dubbo-configcenter-etcd/src/main/java/org/apache/dubbo/configcenter/support/etcd/EtcdDynamicConfiguration.java
@@ -22,6 +22,7 @@ import 
org.apache.dubbo.common.config.configcenter.ConfigChangeEvent;
 import org.apache.dubbo.common.config.configcenter.ConfigChangeType;
 import org.apache.dubbo.common.config.configcenter.ConfigurationListener;
 import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
+import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.remoting.etcd.StateListener;
 import org.apache.dubbo.remoting.etcd.jetcd.JEtcdClient;
 
@@ -98,11 +99,6 @@ public class EtcdDynamicConfiguration implements 
DynamicConfiguration {
         return (String) getInternalProperty(convertKey(group, key));
     }
 
-    @Override
-    public String getRule(String key, String group, long timeout) throws 
IllegalStateException {
-        return getConfig(key, group, timeout);
-    }
-
 //    @Override
 //    public String getConfigs(String key, String group, long timeout) throws 
IllegalStateException {
 //        if (StringUtils.isEmpty(group)) {
@@ -116,9 +112,13 @@ public class EtcdDynamicConfiguration implements 
DynamicConfiguration {
         return etcdClient.getKVValue(key);
     }
 
+    private String buildPath(String group) {
+        String actualGroup = StringUtils.isEmpty(group) ? DEFAULT_GROUP : 
group;
+        return rootPath + PATH_SEPARATOR + actualGroup;
+    }
 
     private String convertKey(String group, String key) {
-        return rootPath + PATH_SEPARATOR + group + PATH_SEPARATOR + key;
+        return buildPath(group) + PATH_SEPARATOR + key;
     }
 
     private void recover() {
diff --git 
a/dubbo-configcenter/dubbo-configcenter-nacos/src/main/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfiguration.java
 
b/dubbo-configcenter/dubbo-configcenter-nacos/src/main/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfiguration.java
index bc3f900..5b40527 100644
--- 
a/dubbo-configcenter/dubbo-configcenter-nacos/src/main/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfiguration.java
+++ 
b/dubbo-configcenter/dubbo-configcenter-nacos/src/main/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfiguration.java
@@ -199,11 +199,6 @@ public class NacosDynamicConfiguration implements 
DynamicConfiguration {
     }
 
     @Override
-    public String getRule(String key, String group, long timeout) throws 
IllegalStateException {
-        return getConfig(key, group, timeout);
-    }
-
-    @Override
     public Object getInternalProperty(String key) {
         try {
             return configService.getConfig(key, DEFAULT_GROUP, 
DEFAULT_TIMEOUT);
diff --git 
a/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfiguration.java
 
b/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfiguration.java
index a346ecc..b36c023 100644
--- 
a/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfiguration.java
+++ 
b/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfiguration.java
@@ -111,16 +111,6 @@ public class ZookeeperDynamicConfiguration implements 
DynamicConfiguration {
     }
 
     @Override
-    public String getRule(String key, String group, long timeout) throws 
IllegalStateException {
-        return getConfig(key, group, timeout);
-    }
-
-    @Override
-    public String getProperties(String key, String group, long timeout) throws 
IllegalStateException {
-        return getConfig(key, group, timeout);
-    }
-
-    @Override
     public boolean publishConfig(String key, String group, String content) {
         String path = getPathKey(key, group);
         zkClient.create(path, content, true);
diff --git 
a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/protocol/QosProtocolWrapper.java
 
b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/protocol/QosProtocolWrapper.java
index fd824ba..6c5b72f 100644
--- 
a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/protocol/QosProtocolWrapper.java
+++ 
b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/protocol/QosProtocolWrapper.java
@@ -24,8 +24,10 @@ import org.apache.dubbo.qos.server.Server;
 import org.apache.dubbo.rpc.Exporter;
 import org.apache.dubbo.rpc.Invoker;
 import org.apache.dubbo.rpc.Protocol;
+import org.apache.dubbo.rpc.ProtocolServer;
 import org.apache.dubbo.rpc.RpcException;
 
+import java.util.List;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import static org.apache.dubbo.common.constants.QosConstants.ACCEPT_FOREIGN_IP;
@@ -78,6 +80,11 @@ public class QosProtocolWrapper implements Protocol {
         stopServer();
     }
 
+    @Override
+    public List<ProtocolServer> getServers() {
+        return protocol.getServers();
+    }
+
     private void startQosServer(URL url) {
         try {
             if (!hasStarted.compareAndSet(false, true)) {
diff --git 
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/AbstractConfiguratorListener.java
 
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/AbstractConfiguratorListener.java
index 308ca52..cf774ab 100644
--- 
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/AbstractConfiguratorListener.java
+++ 
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/AbstractConfiguratorListener.java
@@ -20,11 +20,13 @@ import 
org.apache.dubbo.common.config.configcenter.ConfigChangeEvent;
 import org.apache.dubbo.common.config.configcenter.ConfigChangeType;
 import org.apache.dubbo.common.config.configcenter.ConfigurationListener;
 import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
+import org.apache.dubbo.common.extension.ExtensionLoader;
 import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.rpc.cluster.Configurator;
 import org.apache.dubbo.rpc.cluster.configurator.parser.ConfigParser;
+import org.apache.dubbo.rpc.cluster.governance.GovernanceRuleRepository;
 
 import java.util.Collections;
 import java.util.List;
@@ -39,9 +41,9 @@ public abstract class AbstractConfiguratorListener implements 
ConfigurationListe
 
 
     protected final void initWith(String key) {
-        DynamicConfiguration dynamicConfiguration = 
DynamicConfiguration.getDynamicConfiguration();
-        dynamicConfiguration.addListener(key, this);
-        String rawConfig = dynamicConfiguration.getRule(key, 
DynamicConfiguration.DEFAULT_GROUP);
+        GovernanceRuleRepository ruleRepository = 
ExtensionLoader.getExtensionLoader(GovernanceRuleRepository.class).getDefaultExtension();
+        ruleRepository.addListener(key, this);
+        String rawConfig = ruleRepository.getRule(key, 
DynamicConfiguration.DEFAULT_GROUP);
         if (!StringUtils.isEmpty(rawConfig)) {
             genConfiguratorsFromRawRule(rawConfig);
         }
diff --git 
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java
 
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java
index 0166d72..9592d76 100644
--- 
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java
+++ 
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryDirectory.java
@@ -42,6 +42,7 @@ import org.apache.dubbo.rpc.cluster.RouterChain;
 import org.apache.dubbo.rpc.cluster.RouterFactory;
 import org.apache.dubbo.rpc.cluster.directory.AbstractDirectory;
 import org.apache.dubbo.rpc.cluster.directory.StaticDirectory;
+import org.apache.dubbo.rpc.cluster.governance.GovernanceRuleRepository;
 import org.apache.dubbo.rpc.cluster.support.ClusterUtils;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.protocol.InvokerWrapper;
@@ -192,7 +193,7 @@ public class RegistryDirectory<T> extends 
AbstractDirectory<T> implements Notify
             if (getConsumerUrl() != null && registry != null && 
registry.isAvailable()) {
                 registry.unsubscribe(getConsumerUrl(), this);
             }
-            DynamicConfiguration.getDynamicConfiguration()
+            
ExtensionLoader.getExtensionLoader(GovernanceRuleRepository.class).getDefaultExtension()
                     .removeListener(ApplicationModel.getApplication(), 
CONSUMER_CONFIGURATION_LISTENER);
         } catch (Throwable t) {
             logger.warn("unexpected error when unsubscribe service " + 
serviceKey + "from registry" + registry.getUrl(), t);
diff --git 
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
 
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
index bae63ec..089383c 100644
--- 
a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
+++ 
b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
@@ -39,6 +39,7 @@ import org.apache.dubbo.rpc.ProxyFactory;
 import org.apache.dubbo.rpc.RpcException;
 import org.apache.dubbo.rpc.cluster.Cluster;
 import org.apache.dubbo.rpc.cluster.Configurator;
+import org.apache.dubbo.rpc.cluster.governance.GovernanceRuleRepository;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.invoker.ProviderInvokerWrapper;
 import org.apache.dubbo.rpc.protocol.InvokerWrapper;
@@ -443,7 +444,7 @@ public class RegistryProtocol implements Protocol {
         }
         bounds.clear();
 
-        DynamicConfiguration.getDynamicConfiguration()
+        
ExtensionLoader.getExtensionLoader(GovernanceRuleRepository.class).getDefaultExtension()
                 .removeListener(ApplicationModel.getApplication() + 
CONFIGURATORS_SUFFIX, providerConfigurationListener);
     }
 
@@ -680,7 +681,7 @@ public class RegistryProtocol implements Protocol {
             try {
                 NotifyListener listener = 
RegistryProtocol.INSTANCE.overrideListeners.remove(subscribeUrl);
                 registry.unsubscribe(subscribeUrl, listener);
-                DynamicConfiguration.getDynamicConfiguration()
+                
ExtensionLoader.getExtensionLoader(GovernanceRuleRepository.class).getDefaultExtension()
                         .removeListener(subscribeUrl.getServiceKey() + 
CONFIGURATORS_SUFFIX,
                                 
serviceConfigurationListeners.get(subscribeUrl.getServiceKey()));
             } catch (Throwable t) {
diff --git 
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/ProtocolServer.java
 
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/ProtocolServer.java
index 3da2b95..02b8d49 100644
--- 
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/ProtocolServer.java
+++ 
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/ProtocolServer.java
@@ -29,13 +29,12 @@ public interface ProtocolServer {
         return null;
     }
 
-    default void setRemotingServers() {
-
+    default void setRemotingServers(RemotingServer server) {
     }
 
     String getAddress();
 
-    void setAddress();
+    void setAddress(String address);
 
     default URL getUrl() {
         return null;
diff --git 
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractProxyProtocol.java
 
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractProxyProtocol.java
index 4b5c016..7ee976e 100644
--- 
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractProxyProtocol.java
+++ 
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AbstractProxyProtocol.java
@@ -172,7 +172,7 @@ public abstract class AbstractProxyProtocol extends 
AbstractProtocol {
         }
 
         @Override
-        public void setAddress() {
+        public void setAddress(String address) {
             this.address = address;
         }
 
diff --git 
a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocolServer.java
 
b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocolServer.java
index d0933bc..29abfa0 100644
--- 
a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocolServer.java
+++ 
b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboProtocolServer.java
@@ -41,7 +41,7 @@ public class DubboProtocolServer implements ProtocolServer {
     }
 
     @Override
-    public void setAddress() {
+    public void setAddress(String address) {
         this.address = address;
     }
 
diff --git 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/BaseRestProtocolServer.java
 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/BaseRestProtocolServer.java
index f16967d..3621848 100644
--- 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/BaseRestProtocolServer.java
+++ 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/BaseRestProtocolServer.java
@@ -26,6 +26,8 @@ import static 
org.apache.dubbo.rpc.protocol.rest.Constants.EXTENSION_KEY;
 
 public abstract class BaseRestProtocolServer implements RestProtocolServer {
 
+    private String address;
+
     @Override
     public void start(URL url) {
         getDeployment().getMediaTypeMappings().put("json", "application/json");
@@ -54,6 +56,16 @@ public abstract class BaseRestProtocolServer implements 
RestProtocolServer {
         getDeployment().getRegistry().removeRegistrations(resourceDef);
     }
 
+    @Override
+    public String getAddress() {
+        return address;
+    }
+
+    @Override
+    public void setAddress(String address) {
+        this.address = address;
+    }
+
     protected void loadProviders(String value) {
         for (String clazz : COMMA_SPLIT_PATTERN.split(value)) {
             if (!StringUtils.isEmpty(clazz)) {
diff --git 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/DubboHttpServer.java
 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/DubboHttpProtocolServer.java
similarity index 97%
rename from 
dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/DubboHttpServer.java
rename to 
dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/DubboHttpProtocolServer.java
index e07d0a7..1ab039a 100644
--- 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/DubboHttpServer.java
+++ 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/DubboHttpProtocolServer.java
@@ -36,7 +36,7 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.Enumeration;
 
-public class DubboHttpServer extends BaseRestProtocolServer {
+public class DubboHttpProtocolServer extends BaseRestProtocolServer {
 
     private final HttpServletDispatcher dispatcher = new 
HttpServletDispatcher();
     private final ResteasyDeployment deployment = new ResteasyDeployment();
@@ -44,7 +44,7 @@ public class DubboHttpServer extends BaseRestProtocolServer {
     private HttpServer httpServer;
 //    private boolean isExternalServer;
 
-    public DubboHttpServer(HttpBinder httpBinder) {
+    public DubboHttpProtocolServer(HttpBinder httpBinder) {
         this.httpBinder = httpBinder;
     }
 
diff --git 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RestProtocol.java
 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RestProtocol.java
index fe30443..62b1af6 100644
--- 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RestProtocol.java
+++ 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RestProtocol.java
@@ -97,6 +97,7 @@ public class RestProtocol extends AbstractProxyProtocol {
         Class implClass = 
ApplicationModel.getProviderModel(url.getPathKey()).getServiceInstance().getClass();
         RestProtocolServer server = (RestProtocolServer) 
serverMap.computeIfAbsent(addr, restServer -> {
             RestProtocolServer s = 
serverFactory.createServer(url.getParameter(SERVER_KEY, DEFAULT_SERVER));
+            s.setAddress(url.getAddress());
             s.start(url);
             return s;
         });
diff --git 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RestServerFactory.java
 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RestServerFactory.java
index 6de7ba1..6fcf7f6 100644
--- 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RestServerFactory.java
+++ 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/RestServerFactory.java
@@ -34,7 +34,7 @@ public class RestServerFactory {
     public RestProtocolServer createServer(String name) {
         // TODO move names to Constants
         if ("servlet".equalsIgnoreCase(name) || "jetty".equalsIgnoreCase(name) 
|| "tomcat".equalsIgnoreCase(name)) {
-            return new DubboHttpServer(httpBinder);
+            return new DubboHttpProtocolServer(httpBinder);
         } else if ("netty".equalsIgnoreCase(name)) {
             return new NettyRestProtocolServer();
         } else {
diff --git 
a/dubbo-rpc/dubbo-rpc-thrift/src/main/java/org/apache/dubbo/rpc/protocol/thrift/ThriftProtocol.java
 
b/dubbo-rpc/dubbo-rpc-thrift/src/main/java/org/apache/dubbo/rpc/protocol/thrift/ThriftProtocol.java
index b5c492e..76bca80 100644
--- 
a/dubbo-rpc/dubbo-rpc-thrift/src/main/java/org/apache/dubbo/rpc/protocol/thrift/ThriftProtocol.java
+++ 
b/dubbo-rpc/dubbo-rpc-thrift/src/main/java/org/apache/dubbo/rpc/protocol/thrift/ThriftProtocol.java
@@ -246,7 +246,7 @@ public class ThriftProtocol extends AbstractProtocol {
         }
 
         @Override
-        public void setAddress() {
+        public void setAddress(String address) {
             this.address = address;
         }
 

Reply via email to