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 2019/06/14 06:02:01 UTC

[dubbo] branch performance-tuning-2.7.x updated: remove ProviderConsumerRegTable in registry module, use ApplicationModel instead.

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

liujun pushed a commit to branch performance-tuning-2.7.x
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/performance-tuning-2.7.x by this push:
     new c48c5cf  remove ProviderConsumerRegTable in registry module, use ApplicationModel instead.
c48c5cf is described below

commit c48c5cfa1d9fe05fb6c3f5198638eb260759a8a2
Author: ken.lj <ke...@gmail.com>
AuthorDate: Fri Jun 14 13:56:35 2019 +0800

    remove ProviderConsumerRegTable in registry module, use ApplicationModel instead.
---
 .../org/apache/dubbo/rpc/cluster/Directory.java    |   2 +
 .../rpc/cluster/directory/StaticDirectory.java     |   5 +
 .../cluster/support/AbstractClusterInvoker.java    |   4 +
 .../java/org/apache/dubbo/qos/command/impl/Ls.java |   9 +-
 .../org/apache/dubbo/qos/command/impl/Offline.java |   6 +-
 .../org/apache/dubbo/qos/command/impl/Online.java  |   6 +-
 .../org/apache/dubbo/qos/command/impl/LsTest.java  |  10 +-
 .../apache/dubbo/qos/command/impl/OfflineTest.java |  10 +-
 .../apache/dubbo/qos/command/impl/OnlineTest.java  |   8 +-
 .../registry/integration/RegistryDirectory.java    |   5 +
 .../registry/integration/RegistryProtocol.java     |  11 +-
 .../registry/support/ConsumerInvokerWrapper.java   |  88 ----------------
 .../registry/support/ProviderConsumerRegTable.java | 112 ---------------------
 .../apache/dubbo/rpc/model/ApplicationModel.java   |  37 +++++++
 .../org/apache/dubbo/rpc/model/ConsumerModel.java  |  11 ++
 .../org/apache/dubbo/rpc/model/ProviderModel.java  |  18 ++++
 .../rpc/model/invoker}/ProviderInvokerWrapper.java |   4 +-
 dubbo-rpc/dubbo-rpc-dubbo/pom.xml                  |   5 -
 .../protocol/dubbo/telnet/ListTelnetHandler.java   |   8 +-
 19 files changed, 111 insertions(+), 248 deletions(-)

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
index 67f0216..a03a781 100644
--- 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
@@ -46,4 +46,6 @@ public interface Directory<T> extends Node {
      */
     List<Invoker<T>> list(Invocation invocation) throws RpcException;
 
+    List<Invoker<T>> getAllInvokers();
+
 }
\ No newline at end of file
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
index c5a26a3..0595c63 100644
--- 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
@@ -62,6 +62,11 @@ public class StaticDirectory<T> extends AbstractDirectory<T> {
     }
 
     @Override
+    public List<Invoker<T>> getAllInvokers() {
+        return invokers;
+    }
+
+    @Override
     public boolean isAvailable() {
         if (isDestroyed()) {
             return false;
diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/AbstractClusterInvoker.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/AbstractClusterInvoker.java
index db2d401..61ef955 100644
--- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/AbstractClusterInvoker.java
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/support/AbstractClusterInvoker.java
@@ -94,6 +94,10 @@ public abstract class AbstractClusterInvoker<T> implements Invoker<T> {
         return directory.isAvailable();
     }
 
+    public Directory<T> getDirectory() {
+        return directory;
+    }
+
     @Override
     public void destroy() {
         if (destroyed.compareAndSet(false, true)) {
diff --git a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/Ls.java b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/Ls.java
index ca23068..cf0dc68 100644
--- a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/Ls.java
+++ b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/Ls.java
@@ -20,15 +20,13 @@ import org.apache.dubbo.qos.command.BaseCommand;
 import org.apache.dubbo.qos.command.CommandContext;
 import org.apache.dubbo.qos.command.annotation.Cmd;
 import org.apache.dubbo.qos.textui.TTable;
+import org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.ConsumerModel;
 import org.apache.dubbo.rpc.model.ProviderModel;
 
 import java.util.Collection;
 
-import static org.apache.dubbo.registry.support.ProviderConsumerRegTable.getConsumerAddressNum;
-import static org.apache.dubbo.registry.support.ProviderConsumerRegTable.isRegistered;
-
 @Cmd(name = "ls", summary = "ls service", example = {
         "ls"
 })
@@ -57,7 +55,7 @@ public class Ls implements BaseCommand {
 
         //Content
         for (ProviderModel providerModel : providerModelList) {
-            tTable.addRow(providerModel.getServiceKey(), isRegistered(providerModel.getServiceKey()) ? "Y" : "N");
+            tTable.addRow(providerModel.getServiceKey(), ApplicationModel.isRegistered(providerModel.getServiceKey()) ? "Y" : "N");
         }
         stringBuilder.append(tTable.rendering());
 
@@ -80,7 +78,8 @@ public class Ls implements BaseCommand {
         //Content
         //TODO to calculate consumerAddressNum
         for (ConsumerModel consumerModel : consumerModelList) {
-            tTable.addRow(consumerModel.getServiceKey(), getConsumerAddressNum(consumerModel.getServiceKey()));
+            AbstractClusterInvoker clusterInvoker = (AbstractClusterInvoker) consumerModel.getInvoker();
+            tTable.addRow(consumerModel.getServiceKey(), clusterInvoker.getDirectory().getAllInvokers().size());
         }
 
         stringBuilder.append(tTable.rendering());
diff --git a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/Offline.java b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/Offline.java
index cf2862e..fcbf548 100644
--- a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/Offline.java
+++ b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/Offline.java
@@ -24,13 +24,11 @@ import org.apache.dubbo.qos.command.CommandContext;
 import org.apache.dubbo.qos.command.annotation.Cmd;
 import org.apache.dubbo.registry.Registry;
 import org.apache.dubbo.registry.RegistryFactory;
-import org.apache.dubbo.registry.support.ProviderConsumerRegTable;
-import org.apache.dubbo.registry.support.ProviderInvokerWrapper;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.ProviderModel;
+import org.apache.dubbo.rpc.model.invoker.ProviderInvokerWrapper;
 
 import java.util.Collection;
-import java.util.Set;
 
 @Cmd(name = "offline", summary = "offline dubbo", example = {
         "offline dubbo",
@@ -53,7 +51,7 @@ public class Offline implements BaseCommand {
         for (ProviderModel providerModel : providerModelList) {
             if (providerModel.getServiceKey().matches(servicePattern)) {
                 hasService = true;
-                Set<ProviderInvokerWrapper> providerInvokerWrapperSet = ProviderConsumerRegTable.getProviderInvoker(providerModel.getServiceKey());
+                Collection<ProviderInvokerWrapper> providerInvokerWrapperSet = ApplicationModel.getProviderInvokers(providerModel.getServiceKey());
                 for (ProviderInvokerWrapper providerInvokerWrapper : providerInvokerWrapperSet) {
                     if (!providerInvokerWrapper.isReg()) {
                         continue;
diff --git a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/Online.java b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/Online.java
index 6bcf089..ae3d17f 100644
--- a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/Online.java
+++ b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/Online.java
@@ -25,13 +25,11 @@ import org.apache.dubbo.qos.command.CommandContext;
 import org.apache.dubbo.qos.command.annotation.Cmd;
 import org.apache.dubbo.registry.Registry;
 import org.apache.dubbo.registry.RegistryFactory;
-import org.apache.dubbo.registry.support.ProviderConsumerRegTable;
-import org.apache.dubbo.registry.support.ProviderInvokerWrapper;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.ProviderModel;
+import org.apache.dubbo.rpc.model.invoker.ProviderInvokerWrapper;
 
 import java.util.Collection;
-import java.util.Set;
 
 @Cmd(name = "online", summary = "online dubbo", example = {
         "online dubbo",
@@ -55,7 +53,7 @@ public class Online implements BaseCommand {
         for (ProviderModel providerModel : providerModelList) {
             if (providerModel.getServiceKey().matches(servicePattern)) {
                 hasService = true;
-                Set<ProviderInvokerWrapper> providerInvokerWrapperSet = ProviderConsumerRegTable.getProviderInvoker(providerModel.getServiceKey());
+                Collection<ProviderInvokerWrapper> providerInvokerWrapperSet = ApplicationModel.getProviderInvokers(providerModel.getServiceKey());
                 for (ProviderInvokerWrapper providerInvokerWrapper : providerInvokerWrapperSet) {
                     if (providerInvokerWrapper.isReg()) {
                         continue;
diff --git a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/LsTest.java b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/LsTest.java
index 4b4fda2..bef3088 100644
--- a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/LsTest.java
+++ b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/LsTest.java
@@ -19,19 +19,17 @@ package org.apache.dubbo.qos.command.impl;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.qos.command.CommandContext;
 import org.apache.dubbo.registry.integration.RegistryDirectory;
-import org.apache.dubbo.registry.support.ProviderConsumerRegTable;
-import org.apache.dubbo.registry.support.ProviderInvokerWrapper;
 import org.apache.dubbo.rpc.Invoker;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.ConsumerModel;
 import org.apache.dubbo.rpc.model.ProviderModel;
+import org.apache.dubbo.rpc.model.invoker.ProviderInvokerWrapper;
 
 import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 
 import java.util.Map;
 
-import static org.apache.dubbo.registry.support.ProviderConsumerRegTable.getProviderInvoker;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.containsString;
 import static org.mockito.Mockito.mock;
@@ -54,8 +52,8 @@ public class LsTest {
         when(providerUrl.getServiceKey()).thenReturn("org.apache.dubbo.BarService");
         when(providerUrl.toFullString()).thenReturn("dubbo://localhost:8888/org.apache.dubbo.BarService");
         when(providerInvoker.getUrl()).thenReturn(providerUrl);
-        ProviderConsumerRegTable.registerProvider(providerInvoker, registryUrl, providerUrl);
-        for (ProviderInvokerWrapper wrapper : getProviderInvoker("org.apache.dubbo.BarService")) {
+        ApplicationModel.registerProviderInvoker(providerInvoker, registryUrl, providerUrl);
+        for (ProviderInvokerWrapper wrapper : ApplicationModel.getProviderInvokers("org.apache.dubbo.BarService")) {
             wrapper.setReg(true);
         }
 
@@ -68,7 +66,7 @@ public class LsTest {
         Map invokers = Mockito.mock(Map.class);
         when(invokers.size()).thenReturn(100);
         when(directory.getUrlInvokerMap()).thenReturn(invokers);
-        ProviderConsumerRegTable.registerConsumer(consumerInvoker, registryUrl, consumerUrl, directory);
+        ApplicationModel.registerConsumerInvoker(consumerInvoker, consumerUrl.getServiceKey());
 
         Ls ls = new Ls();
         String output = ls.execute(mock(CommandContext.class), null);
diff --git a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/OfflineTest.java b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/OfflineTest.java
index 6f6be8e..8d27d12 100644
--- a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/OfflineTest.java
+++ b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/OfflineTest.java
@@ -19,16 +19,14 @@ package org.apache.dubbo.qos.command.impl;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.qos.command.CommandContext;
 import org.apache.dubbo.registry.Registry;
-import org.apache.dubbo.registry.support.ProviderConsumerRegTable;
-import org.apache.dubbo.registry.support.ProviderInvokerWrapper;
 import org.apache.dubbo.rpc.Invoker;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.ProviderModel;
+import org.apache.dubbo.rpc.model.invoker.ProviderInvokerWrapper;
 
 import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 
-import static org.apache.dubbo.registry.support.ProviderConsumerRegTable.getProviderInvoker;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.containsString;
 import static org.hamcrest.core.Is.is;
@@ -49,8 +47,8 @@ public class OfflineTest {
         when(providerUrl.getServiceKey()).thenReturn("org.apache.dubbo.BarService");
         when(providerUrl.toFullString()).thenReturn("dubbo://localhost:8888/org.apache.dubbo.BarService");
         when(providerInvoker.getUrl()).thenReturn(providerUrl);
-        ProviderConsumerRegTable.registerProvider(providerInvoker, registryUrl, providerUrl);
-        for (ProviderInvokerWrapper wrapper : getProviderInvoker("org.apache.dubbo.BarService")) {
+        ApplicationModel.registerProviderInvoker(providerInvoker, registryUrl, providerUrl);
+        for (ProviderInvokerWrapper wrapper : ApplicationModel.getProviderInvokers("org.apache.dubbo.BarService")) {
             wrapper.setReg(true);
         }
 
@@ -61,7 +59,7 @@ public class OfflineTest {
         String output = offline.execute(mock(CommandContext.class), new String[]{"org.apache.dubbo.BarService"});
         assertThat(output, containsString("OK"));
         Mockito.verify(registry).unregister(providerUrl);
-        for (ProviderInvokerWrapper wrapper : getProviderInvoker("org.apache.dubbo.BarService")) {
+        for (ProviderInvokerWrapper wrapper : ApplicationModel.getProviderInvokers("org.apache.dubbo.BarService")) {
             assertThat(wrapper.isReg(), is(false));
         }
 
diff --git a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/OnlineTest.java b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/OnlineTest.java
index b419f0c..7474b68 100644
--- a/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/OnlineTest.java
+++ b/dubbo-plugin/dubbo-qos/src/test/java/org/apache/dubbo/qos/command/impl/OnlineTest.java
@@ -19,15 +19,13 @@ package org.apache.dubbo.qos.command.impl;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.qos.command.CommandContext;
 import org.apache.dubbo.registry.Registry;
-import org.apache.dubbo.registry.support.ProviderConsumerRegTable;
-import org.apache.dubbo.registry.support.ProviderInvokerWrapper;
 import org.apache.dubbo.rpc.Invoker;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.ProviderModel;
+import org.apache.dubbo.rpc.model.invoker.ProviderInvokerWrapper;
 
 import org.junit.jupiter.api.Test;
 
-import static org.apache.dubbo.registry.support.ProviderConsumerRegTable.getProviderInvoker;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.equalTo;
 import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -48,7 +46,7 @@ public class OnlineTest {
         when(providerUrl.getServiceKey()).thenReturn("org.apache.dubbo.BarService");
         when(providerUrl.toFullString()).thenReturn("dubbo://localhost:8888/org.apache.dubbo.BarService");
         when(providerInvoker.getUrl()).thenReturn(providerUrl);
-        ProviderConsumerRegTable.registerProvider(providerInvoker, registryUrl, providerUrl);
+        ApplicationModel.registerProviderInvoker(providerInvoker, registryUrl, providerUrl);
 
         Registry registry = mock(Registry.class);
         TestRegistryFactory.registry = registry;
@@ -56,7 +54,7 @@ public class OnlineTest {
         Online online = new Online();
         String output = online.execute(mock(CommandContext.class), new String[]{"org.apache.dubbo.BarService"});
         assertThat(output, equalTo("OK"));
-        for (ProviderInvokerWrapper wrapper : getProviderInvoker("org.apache.dubbo.BarService")) {
+        for (ProviderInvokerWrapper wrapper : ApplicationModel.getProviderInvokers("org.apache.dubbo.BarService")) {
             assertTrue(wrapper.isReg());
         }
     }
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 2f3a835..5686917 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
@@ -605,6 +605,11 @@ public class RegistryDirectory<T> extends AbstractDirectory<T> implements Notify
     }
 
     @Override
+    public List<Invoker<T>> getAllInvokers() {
+        return invokers;
+    }
+
+    @Override
     public URL getUrl() {
         return this.overrideDirectoryUrl;
     }
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 9afa7ab..0f07aad 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
@@ -31,8 +31,6 @@ import org.apache.dubbo.registry.NotifyListener;
 import org.apache.dubbo.registry.Registry;
 import org.apache.dubbo.registry.RegistryFactory;
 import org.apache.dubbo.registry.RegistryService;
-import org.apache.dubbo.registry.support.ProviderConsumerRegTable;
-import org.apache.dubbo.registry.support.ProviderInvokerWrapper;
 import org.apache.dubbo.rpc.Exporter;
 import org.apache.dubbo.rpc.Invoker;
 import org.apache.dubbo.rpc.Protocol;
@@ -41,6 +39,7 @@ 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.model.ApplicationModel;
+import org.apache.dubbo.rpc.model.invoker.ProviderInvokerWrapper;
 import org.apache.dubbo.rpc.protocol.InvokerWrapper;
 
 import java.util.ArrayList;
@@ -211,7 +210,7 @@ public class RegistryProtocol implements Protocol {
         // url to registry
         final Registry registry = getRegistry(originInvoker);
         final URL registeredProviderUrl = getRegisteredProviderUrl(providerUrl, registryUrl);
-        ProviderInvokerWrapper<T> providerInvokerWrapper = ProviderConsumerRegTable.registerProvider(originInvoker,
+        ProviderInvokerWrapper<T> providerInvokerWrapper = ApplicationModel.registerProviderInvoker(originInvoker,
                 registryUrl, registeredProviderUrl);
         //to judge if we need to delay publish
         boolean register = registeredProviderUrl.getParameter("register", true);
@@ -254,8 +253,8 @@ public class RegistryProtocol implements Protocol {
         final URL registeredProviderUrl = getRegisteredProviderUrl(newInvokerUrl, registryUrl);
 
         //decide if we need to re-publish
-        ProviderInvokerWrapper<T> providerInvokerWrapper = ProviderConsumerRegTable.getProviderWrapper(registeredProviderUrl, originInvoker);
-        ProviderInvokerWrapper<T> newProviderInvokerWrapper = ProviderConsumerRegTable.registerProvider(originInvoker, registryUrl, registeredProviderUrl);
+        ProviderInvokerWrapper<T> providerInvokerWrapper = ApplicationModel.getProviderInvoker(registeredProviderUrl.getServiceKey(), originInvoker);
+        ProviderInvokerWrapper<T> newProviderInvokerWrapper = ApplicationModel.registerProviderInvoker(originInvoker, registryUrl, registeredProviderUrl);
         /**
          * Only if the new url going to Registry is different with the previous one should we do unregister and register.
          */
@@ -412,7 +411,7 @@ public class RegistryProtocol implements Protocol {
                 PROVIDERS_CATEGORY + "," + CONFIGURATORS_CATEGORY + "," + ROUTERS_CATEGORY));
 
         Invoker invoker = cluster.join(directory);
-        ProviderConsumerRegTable.registerConsumer(invoker, url, subscribeUrl, directory);
+        ApplicationModel.registerConsumerInvoker(invoker, subscribeUrl.getServiceKey());
         return invoker;
     }
 
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/ConsumerInvokerWrapper.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/ConsumerInvokerWrapper.java
deleted file mode 100644
index 141634d..0000000
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/ConsumerInvokerWrapper.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * 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.registry.support;
-
-import org.apache.dubbo.common.URL;
-import org.apache.dubbo.registry.integration.RegistryDirectory;
-import org.apache.dubbo.rpc.Invocation;
-import org.apache.dubbo.rpc.Invoker;
-import org.apache.dubbo.rpc.Result;
-import org.apache.dubbo.rpc.RpcException;
-
-/**
- * @date 2017/11/23
- */
-public class ConsumerInvokerWrapper<T> implements Invoker {
-    private Invoker<T> invoker;
-    private URL originUrl;
-    private URL registryUrl;
-    private URL consumerUrl;
-    private RegistryDirectory registryDirectory;
-
-    public ConsumerInvokerWrapper(Invoker<T> invoker, URL registryUrl, URL consumerUrl, RegistryDirectory registryDirectory) {
-        this.invoker = invoker;
-        this.originUrl = URL.valueOf(invoker.getUrl().toFullString());
-        this.registryUrl = URL.valueOf(registryUrl.toFullString());
-        this.consumerUrl = consumerUrl;
-        this.registryDirectory = registryDirectory;
-    }
-
-    @Override
-    public Class<T> getInterface() {
-        return invoker.getInterface();
-    }
-
-    @Override
-    public URL getUrl() {
-        return invoker.getUrl();
-    }
-
-    @Override
-    public boolean isAvailable() {
-        return invoker.isAvailable();
-    }
-
-    @Override
-    public Result invoke(Invocation invocation) throws RpcException {
-        return invoker.invoke(invocation);
-    }
-
-    @Override
-    public void destroy() {
-        invoker.destroy();
-    }
-
-    public URL getOriginUrl() {
-        return originUrl;
-    }
-
-    public URL getRegistryUrl() {
-        return registryUrl;
-    }
-
-    public Invoker<T> getInvoker() {
-        return invoker;
-    }
-
-    public URL getConsumerUrl() {
-        return consumerUrl;
-    }
-
-    public RegistryDirectory getRegistryDirectory() {
-        return registryDirectory;
-    }
-}
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/ProviderConsumerRegTable.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/ProviderConsumerRegTable.java
deleted file mode 100644
index 9af3988..0000000
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/ProviderConsumerRegTable.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * 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.registry.support;
-
-import org.apache.dubbo.common.URL;
-import org.apache.dubbo.common.utils.ConcurrentHashSet;
-import org.apache.dubbo.registry.integration.RegistryDirectory;
-import org.apache.dubbo.rpc.Invoker;
-
-import java.util.Collections;
-import java.util.Map;
-import java.util.Objects;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-/**
- * @date 2017/11/23
- */
-public class ProviderConsumerRegTable {
-    public static ConcurrentHashMap<String, ConcurrentMap<Invoker, ProviderInvokerWrapper>> providerInvokers = new ConcurrentHashMap<>();
-    public static ConcurrentHashMap<String, Set<ConsumerInvokerWrapper>> consumerInvokers = new ConcurrentHashMap<>();
-
-    public static <T> ProviderInvokerWrapper<T> registerProvider(Invoker<T> invoker, URL registryUrl, URL providerUrl) {
-        ProviderInvokerWrapper<T> wrapperInvoker = new ProviderInvokerWrapper<>(invoker, registryUrl, providerUrl);
-        String serviceUniqueName = providerUrl.getServiceKey();
-        ConcurrentMap<Invoker, ProviderInvokerWrapper> invokers = providerInvokers.get(serviceUniqueName);
-        if (invokers == null) {
-            providerInvokers.putIfAbsent(serviceUniqueName, new ConcurrentHashMap<>());
-            invokers = providerInvokers.get(serviceUniqueName);
-        }
-        invokers.put(invoker, wrapperInvoker);
-        return wrapperInvoker;
-    }
-
-    /*public static ProviderInvokerWrapper removeProviderWrapper(Invoker invoker, URL providerUrl) {
-        String serviceUniqueName = providerUrl.getServiceKey();
-        Set<ProviderInvokerWrapper> invokers = providerInvokers.get(serviceUniqueName);
-        if (invokers == null) {
-            return null;
-        }
-        return invokers.remove(new ProviderIndvokerWrapper(invoker, null, null));
-    }*/
-
-    public static Set<ProviderInvokerWrapper> getProviderInvoker(String serviceUniqueName) {
-        ConcurrentMap<Invoker, ProviderInvokerWrapper> invokers = providerInvokers.get(serviceUniqueName);
-        if (invokers == null) {
-            return Collections.emptySet();
-        }
-        return new HashSet<>(invokers.values());
-    }
-
-    public static <T> ProviderInvokerWrapper<T> getProviderWrapper(URL registeredProviderUrl, Invoker<T> invoker) {
-        String serviceUniqueName = registeredProviderUrl.getServiceKey();
-        ConcurrentMap<Invoker, ProviderInvokerWrapper> invokers = providerInvokers.get(serviceUniqueName);
-        if (invokers == null) {
-            return null;
-        }
-
-        for (Map.Entry<Invoker, ProviderInvokerWrapper> entry : invokers.entrySet()) {
-            if (entry.getKey() == invoker) {
-                return entry.getValue();
-            }
-        }
-
-        return null;
-    }
-
-    public static void registerConsumer(Invoker invoker, URL registryUrl, URL consumerUrl, RegistryDirectory registryDirectory) {
-        ConsumerInvokerWrapper wrapperInvoker = new ConsumerInvokerWrapper(invoker, registryUrl, consumerUrl, registryDirectory);
-        String serviceUniqueName = consumerUrl.getServiceKey();
-        Set<ConsumerInvokerWrapper> invokers = consumerInvokers.get(serviceUniqueName);
-        if (invokers == null) {
-            consumerInvokers.putIfAbsent(serviceUniqueName, new ConcurrentHashSet<ConsumerInvokerWrapper>());
-            invokers = consumerInvokers.get(serviceUniqueName);
-        }
-        invokers.add(wrapperInvoker);
-    }
-
-    public static Set<ConsumerInvokerWrapper> getConsumerInvoker(String serviceUniqueName) {
-        Set<ConsumerInvokerWrapper> invokers = consumerInvokers.get(serviceUniqueName);
-        return invokers == null ? Collections.emptySet() : invokers;
-    }
-
-    public static boolean isRegistered(String serviceUniqueName) {
-        Set<ProviderInvokerWrapper> providerInvokerWrapperSet = ProviderConsumerRegTable.getProviderInvoker(serviceUniqueName);
-        return providerInvokerWrapperSet.stream().anyMatch(ProviderInvokerWrapper::isReg);
-    }
-
-    public static int getConsumerAddressNum(String serviceUniqueName) {
-        Set<ConsumerInvokerWrapper> providerInvokerWrapperSet = ProviderConsumerRegTable.getConsumerInvoker(serviceUniqueName);
-        return providerInvokerWrapperSet.stream()
-                .map(w -> w.getRegistryDirectory().getUrlInvokerMap())
-                .filter(Objects::nonNull)
-                .mapToInt(Map::size).sum();
-    }
-}
diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java
index 7a7a4be..953d3c3 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java
@@ -16,10 +16,14 @@
  */
 package org.apache.dubbo.rpc.model;
 
+import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.rpc.Invoker;
+import org.apache.dubbo.rpc.model.invoker.ProviderInvokerWrapper;
 
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
@@ -122,6 +126,39 @@ public class ApplicationModel {
         ApplicationModel.application = application;
     }
 
+    public static <T> ProviderInvokerWrapper<T> registerProviderInvoker(Invoker<T> invoker, URL registryUrl, URL providerUrl) {
+        ProviderInvokerWrapper<T> wrapperInvoker = new ProviderInvokerWrapper<>(invoker, registryUrl, providerUrl);
+        ProviderModel providerModel = getProviderModel(providerUrl.getServiceKey());
+        providerModel.addInvoker(wrapperInvoker);
+        return wrapperInvoker;
+    }
+
+    public static Collection<ProviderInvokerWrapper> getProviderInvokers(String serviceKey) {
+        ProviderModel providerModel = getProviderModel(serviceKey);
+        if (providerModel == null) {
+            return Collections.emptySet();
+        }
+        return providerModel.getInvokers();
+    }
+
+    public static <T> ProviderInvokerWrapper<T> getProviderInvoker(String serviceKey, Invoker<T> invoker) {
+        ProviderModel providerModel = getProviderModel(serviceKey);
+        return providerModel.getInvoker(invoker.getUrl().getProtocol());
+    }
+
+    public static boolean isRegistered(String serviceKey) {
+        return getProviderInvokers(serviceKey).stream().anyMatch(ProviderInvokerWrapper::isReg);
+    }
+
+    public static void registerConsumerInvoker(Invoker invoker, String serviceKey) {
+        ConsumerModel consumerModel = getConsumerModel(serviceKey);
+        consumerModel.setInvoker(invoker);
+    }
+
+    public static <T> Invoker<T> getConsumerInvoker(String serviceKey) {
+        return (Invoker<T>) getConsumerModel(serviceKey).getInvoker();
+    }
+
     /**
      * For unit test
      */
diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ConsumerModel.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ConsumerModel.java
index 135cadb..f7c8705 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ConsumerModel.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ConsumerModel.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.rpc.model;
 
 import org.apache.dubbo.common.utils.Assert;
 import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.rpc.Invoker;
 
 import java.lang.reflect.Method;
 import java.util.HashMap;
@@ -33,6 +34,8 @@ public class ConsumerModel {
     private final ServiceModel serviceModel;
     private final Map<String, AsyncMethodInfo> methodConfigs = new HashMap<>();
 
+    private Invoker<?> invoker;
+
     /**
      *  This constructor create an instance of ConsumerModel and passed objects should not be null.
      *  If service name, service instance, proxy object,methods should not be null. If these are null
@@ -96,6 +99,14 @@ public class ConsumerModel {
         return serviceModel;
     }
 
+    public Invoker<?> getInvoker() {
+        return invoker;
+    }
+
+    public void setInvoker(Invoker<?> invoker) {
+        this.invoker = invoker;
+    }
+
     public static class AsyncMethodInfo {
         // callback instance when async-call is invoked
         private Object oninvokeInstance;
diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ProviderModel.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ProviderModel.java
index 41f6f7c..54e6625 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ProviderModel.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/ProviderModel.java
@@ -16,6 +16,11 @@
  */
 package org.apache.dubbo.rpc.model;
 
+import org.apache.dubbo.rpc.model.invoker.ProviderInvokerWrapper;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -25,6 +30,7 @@ public class ProviderModel {
     private final String serviceKey;
     private final Object serviceInstance;
     private final ServiceModel serviceModel;
+    private Map<String, ProviderInvokerWrapper> protocolInvokers;
 
     public ProviderModel(String serviceKey, Object serviceInstance, ServiceModel serviceModel) {
         if (null == serviceInstance) {
@@ -55,4 +61,16 @@ public class ProviderModel {
     public ServiceModel getServiceModel() {
         return serviceModel;
     }
+
+    public void addInvoker(ProviderInvokerWrapper invoker) {
+        protocolInvokers.put(invoker.getUrl().getProtocol(), invoker);
+    }
+
+    public ProviderInvokerWrapper getInvoker(String protocol) {
+        return protocolInvokers.get(protocol);
+    }
+
+    public Collection<ProviderInvokerWrapper> getInvokers() {
+        return Collections.unmodifiableCollection(protocolInvokers.values());
+    }
 }
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/ProviderInvokerWrapper.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/invoker/ProviderInvokerWrapper.java
similarity index 95%
rename from dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/ProviderInvokerWrapper.java
rename to dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/invoker/ProviderInvokerWrapper.java
index ce079b7..cc19589 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/ProviderInvokerWrapper.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/model/invoker/ProviderInvokerWrapper.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.registry.support;
+package org.apache.dubbo.rpc.model.invoker;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.rpc.Invocation;
@@ -32,7 +32,7 @@ public class ProviderInvokerWrapper<T> implements Invoker {
     private URL providerUrl;
     private volatile boolean isReg;
 
-    public ProviderInvokerWrapper(Invoker<T> invoker,URL registryUrl,URL providerUrl) {
+    public ProviderInvokerWrapper(Invoker<T> invoker, URL registryUrl, URL providerUrl) {
         this.invoker = invoker;
         this.originUrl = URL.valueOf(invoker.getUrl().toFullString());
         this.registryUrl = URL.valueOf(registryUrl.toFullString());
diff --git a/dubbo-rpc/dubbo-rpc-dubbo/pom.xml b/dubbo-rpc/dubbo-rpc-dubbo/pom.xml
index dc6cd22..9f45f81 100644
--- a/dubbo-rpc/dubbo-rpc-dubbo/pom.xml
+++ b/dubbo-rpc/dubbo-rpc-dubbo/pom.xml
@@ -41,11 +41,6 @@
         </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-container-api</artifactId>
             <version>${project.parent.version}</version>
             <exclusions>
diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/ListTelnetHandler.java b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/ListTelnetHandler.java
index f0953ea..b3e176c 100644
--- a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/ListTelnetHandler.java
+++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/telnet/ListTelnetHandler.java
@@ -22,6 +22,7 @@ import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.remoting.Channel;
 import org.apache.dubbo.remoting.telnet.TelnetHandler;
 import org.apache.dubbo.remoting.telnet.support.Help;
+import org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.ConsumerModel;
 import org.apache.dubbo.rpc.model.MethodModel;
@@ -29,9 +30,6 @@ import org.apache.dubbo.rpc.model.ProviderModel;
 
 import java.lang.reflect.Method;
 
-import static org.apache.dubbo.registry.support.ProviderConsumerRegTable.getConsumerAddressNum;
-import static org.apache.dubbo.registry.support.ProviderConsumerRegTable.isRegistered;
-
 /**
  * ListTelnetHandler handler list services and its methods details.
  */
@@ -90,7 +88,7 @@ public class ListTelnetHandler implements TelnetHandler {
             if (detail) {
                 buf.append(" -> ");
                 buf.append(" published: ");
-                buf.append(isRegistered(provider.getServiceKey()) ? "Y" : "N");
+                buf.append(ApplicationModel.isRegistered(provider.getServiceKey()) ? "Y" : "N");
             }
             buf.append("\r\n");
         }
@@ -106,7 +104,7 @@ public class ListTelnetHandler implements TelnetHandler {
             if (detail) {
                 buf.append(" -> ");
                 buf.append(" addresses: ");
-                buf.append(getConsumerAddressNum(consumer.getServiceKey()));
+                buf.append(((AbstractClusterInvoker) consumer.getInvoker()).getDirectory().getAllInvokers().size());
             }
         }
     }