You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by al...@apache.org on 2021/09/15 15:35:36 UTC

[dubbo] branch 3.0 updated: Fix DubboProtocol state & Fix NPE when destroy (#8809)

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

albumenj pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.0 by this push:
     new 726cdd7  Fix DubboProtocol state & Fix NPE when destroy (#8809)
726cdd7 is described below

commit 726cdd74c2cae880da8f7c953f59cc23ee439541
Author: Albumen Kevin <jh...@gmail.com>
AuthorDate: Wed Sep 15 23:35:20 2021 +0800

    Fix DubboProtocol state & Fix NPE when destroy (#8809)
    
    * Fix DubboProtocol state & Fix NPE when destroy
    
    * Fix
---
 .../apache/dubbo/rpc/model/ApplicationModel.java   |  9 ++++---
 .../org/apache/dubbo/rpc/model/FrameworkModel.java |  3 ++-
 .../org/apache/dubbo/rpc/model/ModuleModel.java    |  7 +++--
 .../org/apache/dubbo/rpc/model/ScopeModel.java     |  9 ++++---
 .../bootstrap/DubboBootstrapMultiInstanceTest.java | 30 ++++++++++++----------
 ...MultipleRegistryCenterExportProviderFilter.java |  4 +--
 .../injvm/MultipleRegistryCenterInjvmFilter.java   |  8 ++++--
 .../SingleRegistryCenterExportProviderFilter.java  |  4 +--
 .../injvm/SingleRegistryCenterInjvmFilter.java     |  4 +--
 .../StandardMetadataServiceURLBuilder.java         | 13 +++++-----
 .../registry/integration/RegistryProtocol.java     | 20 +++++++++------
 ...dubbo.registry.client.ServiceInstanceCustomizer |  3 ---
 .../rpc/protocol/dubbo/CallbackServiceCodec.java   |  4 ++-
 13 files changed, 69 insertions(+), 49 deletions(-)

diff --git a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java
index cfb3a8d..fab944b 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ApplicationModel.java
@@ -168,7 +168,7 @@ public class ApplicationModel extends ScopeModel {
     @Override
     protected void initialize() {
         super.initialize();
-        internalModule = new ModuleModel(this);
+        internalModule = new ModuleModel(this, true);
         this.serviceRepository = new ServiceRepository(this);
 
         ExtensionLoader<ApplicationInitListener> extensionLoader = this.getExtensionLoader(ApplicationInitListener.class);
@@ -264,10 +264,13 @@ public class ApplicationModel extends ScopeModel {
         return getCurrentConfig().getName();
     }
 
-    public synchronized void addModule(ModuleModel moduleModel) {
+    public synchronized void addModule(ModuleModel moduleModel, boolean isInternal) {
         if (!this.moduleModels.contains(moduleModel)) {
             this.moduleModels.add(moduleModel);
             moduleModel.setInternalName(buildInternalName(ModuleModel.NAME, getInternalId(), moduleIndex.getAndIncrement()));
+            if (!isInternal) {
+                pubModuleModels.add(moduleModel);
+            }
         }
     }
 
@@ -349,7 +352,7 @@ public class ApplicationModel extends ScopeModel {
 
     @Override
     protected boolean checkIfClassLoaderCanRemoved(ClassLoader classLoader) {
-        return !containsClassLoader(classLoader);
+        return super.checkIfClassLoaderCanRemoved(classLoader) && !containsClassLoader(classLoader);
     }
 
     protected boolean containsClassLoader(ClassLoader classLoader) {
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/FrameworkModel.java b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/FrameworkModel.java
index ffbeb3b..6ed1917 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/FrameworkModel.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/FrameworkModel.java
@@ -140,6 +140,7 @@ public class FrameworkModel extends ScopeModel {
 
     @Override
     protected boolean checkIfClassLoaderCanRemoved(ClassLoader classLoader) {
-        return applicationModels.stream().noneMatch(applicationModel -> applicationModel.containsClassLoader(classLoader));
+        return super.checkIfClassLoaderCanRemoved(classLoader) &&
+            applicationModels.stream().noneMatch(applicationModel -> applicationModel.containsClassLoader(classLoader));
     }
 }
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ModuleModel.java b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ModuleModel.java
index 56daf48..eb14730 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ModuleModel.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ModuleModel.java
@@ -44,12 +44,15 @@ public class ModuleModel extends ScopeModel {
     private ModuleServiceRepository serviceRepository;
     private ModuleConfigManager moduleConfigManager;
 
-
     public ModuleModel(ApplicationModel applicationModel) {
+        this(applicationModel, false);
+    }
+
+    public ModuleModel(ApplicationModel applicationModel, boolean isInternal) {
         super(applicationModel, ExtensionScope.MODULE);
         Assert.notNull(applicationModel, "ApplicationModel can not be null");
         this.applicationModel = applicationModel;
-        applicationModel.addModule(this);
+        applicationModel.addModule(this, isInternal);
         initialize();
         Assert.notNull(applicationModel, "ApplicationModel can not be null");
     }
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ScopeModel.java b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ScopeModel.java
index 6ae533d..145ac58 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ScopeModel.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/ScopeModel.java
@@ -21,6 +21,8 @@ import org.apache.dubbo.common.config.Environment;
 import org.apache.dubbo.common.extension.ExtensionAccessor;
 import org.apache.dubbo.common.extension.ExtensionDirector;
 import org.apache.dubbo.common.extension.ExtensionScope;
+import org.apache.dubbo.common.logger.Logger;
+import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.common.utils.ConcurrentHashSet;
 
 import java.util.Collections;
@@ -33,6 +35,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 public abstract class ScopeModel implements ExtensionAccessor {
+    protected static final Logger LOGGER = LoggerFactory.getLogger(ScopeModel.class);
 
     /**
      * The internal name is used to represent the hierarchy of the model tree, such as:
@@ -94,13 +97,13 @@ public abstract class ScopeModel implements ExtensionAccessor {
     public void destroy() {
         if (destroyed.compareAndSet(false, true)) {
             try {
+                onDestroy();
                 HashSet<ClassLoader> copyOfClassLoaders = new HashSet<>(classLoaders);
                 for (ClassLoader classLoader : copyOfClassLoaders) {
                     removeClassLoader(classLoader);
                 }
-                onDestroy();
             } catch (Throwable t) {
-                t.printStackTrace();
+                LOGGER.error("Error happened when destroying ScopeModel.", t);
             }
         }
     }
@@ -172,7 +175,7 @@ public abstract class ScopeModel implements ExtensionAccessor {
     }
 
     protected boolean checkIfClassLoaderCanRemoved(ClassLoader classLoader) {
-        return true;
+        return classLoader != null && !classLoader.equals(ScopeModel.class.getClassLoader());
     }
 
     public Set<ClassLoader> getClassLoaders() {
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/DubboBootstrapMultiInstanceTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/DubboBootstrapMultiInstanceTest.java
index 6fa0d00..76e2df4 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/DubboBootstrapMultiInstanceTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/DubboBootstrapMultiInstanceTest.java
@@ -34,22 +34,24 @@ import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.FrameworkModel;
 import org.apache.dubbo.rpc.model.FrameworkServiceRepository;
 import org.apache.dubbo.rpc.model.ModuleModel;
-import org.junit.jupiter.api.AfterAll;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 import java.util.List;
 
+import static org.apache.dubbo.metadata.MetadataConstants.METADATA_PUBLISH_DELAY_KEY;
+
 public class DubboBootstrapMultiInstanceTest {
 
     private static ZookeeperSingleRegistryCenter registryCenter;
 
     private static RegistryConfig registryConfig;
 
-    @BeforeAll
-    public static void setup() {
+    @BeforeEach
+    public void setup() {
         registryCenter = new ZookeeperSingleRegistryCenter(NetUtils.getAvailablePort());
         registryCenter.startup();
         RegistryCenter.Instance instance = registryCenter.getRegistryCenterInstance().get(0);
@@ -60,15 +62,11 @@ public class DubboBootstrapMultiInstanceTest {
 
     }
 
-    @AfterAll
-    public static void teardown() {
-        registryCenter.shutdown();
-    }
-
     @AfterEach
-    protected void afterEach() {
+    public void afterEach() {
         SysProps.clear();
         DubboBootstrap.reset();
+        registryCenter.shutdown();
     }
 
     @Test
@@ -93,8 +91,8 @@ public class DubboBootstrapMultiInstanceTest {
             DemoService demoServiceFromProvider = dubboBootstrap1.getCache().get(DemoService.class);
             Assertions.assertNull(demoServiceFromProvider);
         } finally {
-            dubboBootstrap1.destroy();
             dubboBootstrap2.destroy();
+            dubboBootstrap1.destroy();
         }
     }
 
@@ -160,8 +158,9 @@ public class DubboBootstrapMultiInstanceTest {
     }
 
     @Test
-    public void testMultiModuleApplication() {
+    public void testMultiModuleApplication() throws InterruptedException {
 
+        SysProps.setProperty(METADATA_PUBLISH_DELAY_KEY, "1");
         String version1 = "1.0";
         String version2 = "2.0";
         String version3 = "3.0";
@@ -212,6 +211,7 @@ public class DubboBootstrapMultiInstanceTest {
 
             providerBootstrap.start();
 
+            Thread.sleep(100);
 
             // consumer app
             consumerBootstrap = DubboBootstrap.newInstance();
@@ -230,10 +230,12 @@ public class DubboBootstrapMultiInstanceTest {
             consumerBootstrap.start();
 
             DemoService referProxy1 = consumerBootstrap.getCache().get(DemoService.class.getName() + ":" + version1);
-            referProxy1.sayName("dubbo");
+            Assertions.assertEquals("say:dubbo", referProxy1.sayName("dubbo"));
 
             DemoService referProxy2 = consumerBootstrap.getCache().get(DemoService.class.getName() + ":" + version2);
-            referProxy2.sayName("dubbo");
+            Assertions.assertEquals("say:dubbo", referProxy2.sayName("dubbo"));
+
+            Assertions.assertNotEquals(referProxy1, referProxy2);
         } finally {
             if (providerBootstrap != null) {
                 providerBootstrap.destroy();
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/multiple/exportprovider/MultipleRegistryCenterExportProviderFilter.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/multiple/exportprovider/MultipleRegistryCenterExportProviderFilter.java
index dcb7bcd..0457238 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/multiple/exportprovider/MultipleRegistryCenterExportProviderFilter.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/multiple/exportprovider/MultipleRegistryCenterExportProviderFilter.java
@@ -21,8 +21,8 @@ import org.apache.dubbo.common.extension.Activate;
 import org.apache.dubbo.rpc.Filter;
 import org.apache.dubbo.rpc.Invocation;
 import org.apache.dubbo.rpc.Invoker;
-import org.apache.dubbo.rpc.RpcException;
 import org.apache.dubbo.rpc.Result;
+import org.apache.dubbo.rpc.RpcException;
 
 @Activate(group = CommonConstants.PROVIDER, order = 10001)
 public class MultipleRegistryCenterExportProviderFilter implements Filter,Filter.Listener {
@@ -55,7 +55,7 @@ public class MultipleRegistryCenterExportProviderFilter implements Filter,Filter
 
     @Override
     public void onResponse(Result appResponse, Invoker<?> invoker, Invocation invocation) {
-        response = appResponse.getValue().toString();
+        response = String.valueOf(appResponse.getValue());
     }
 
     @Override
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/multiple/injvm/MultipleRegistryCenterInjvmFilter.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/multiple/injvm/MultipleRegistryCenterInjvmFilter.java
index 658924d..679ff83 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/multiple/injvm/MultipleRegistryCenterInjvmFilter.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/multiple/injvm/MultipleRegistryCenterInjvmFilter.java
@@ -18,7 +18,11 @@ package org.apache.dubbo.integration.multiple.injvm;
 
 import org.apache.dubbo.common.constants.CommonConstants;
 import org.apache.dubbo.common.extension.Activate;
-import org.apache.dubbo.rpc.*;
+import org.apache.dubbo.rpc.Filter;
+import org.apache.dubbo.rpc.Invocation;
+import org.apache.dubbo.rpc.Invoker;
+import org.apache.dubbo.rpc.Result;
+import org.apache.dubbo.rpc.RpcException;
 
 @Activate(group = CommonConstants.PROVIDER, order = 10200)
 public class MultipleRegistryCenterInjvmFilter implements Filter,Filter.Listener{
@@ -51,7 +55,7 @@ public class MultipleRegistryCenterInjvmFilter implements Filter,Filter.Listener
 
     @Override
     public void onResponse(Result appResponse, Invoker<?> invoker, Invocation invocation) {
-        response = appResponse.getValue().toString();
+        response = String.valueOf(appResponse.getValue());
     }
 
     @Override
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/single/exportprovider/SingleRegistryCenterExportProviderFilter.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/single/exportprovider/SingleRegistryCenterExportProviderFilter.java
index 79cbc93..26bbcda 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/single/exportprovider/SingleRegistryCenterExportProviderFilter.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/single/exportprovider/SingleRegistryCenterExportProviderFilter.java
@@ -21,8 +21,8 @@ import org.apache.dubbo.common.extension.Activate;
 import org.apache.dubbo.rpc.Filter;
 import org.apache.dubbo.rpc.Invocation;
 import org.apache.dubbo.rpc.Invoker;
-import org.apache.dubbo.rpc.RpcException;
 import org.apache.dubbo.rpc.Result;
+import org.apache.dubbo.rpc.RpcException;
 
 @Activate(group = CommonConstants.PROVIDER, order = 10000)
 public class SingleRegistryCenterExportProviderFilter implements Filter,Filter.Listener {
@@ -55,7 +55,7 @@ public class SingleRegistryCenterExportProviderFilter implements Filter,Filter.L
 
     @Override
     public void onResponse(Result appResponse, Invoker<?> invoker, Invocation invocation) {
-        response = appResponse.getValue().toString();
+        response = String.valueOf(appResponse.getValue());
     }
 
     @Override
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/single/injvm/SingleRegistryCenterInjvmFilter.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/single/injvm/SingleRegistryCenterInjvmFilter.java
index a27a7b9..6580b7e 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/single/injvm/SingleRegistryCenterInjvmFilter.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/single/injvm/SingleRegistryCenterInjvmFilter.java
@@ -21,8 +21,8 @@ import org.apache.dubbo.common.extension.Activate;
 import org.apache.dubbo.rpc.Filter;
 import org.apache.dubbo.rpc.Invocation;
 import org.apache.dubbo.rpc.Invoker;
-import org.apache.dubbo.rpc.RpcException;
 import org.apache.dubbo.rpc.Result;
+import org.apache.dubbo.rpc.RpcException;
 
 @Activate(group = CommonConstants.PROVIDER, order = 10000)
 public class SingleRegistryCenterInjvmFilter implements Filter,Filter.Listener {
@@ -55,7 +55,7 @@ public class SingleRegistryCenterInjvmFilter implements Filter,Filter.Listener {
 
     @Override
     public void onResponse(Result appResponse, Invoker<?> invoker, Invocation invocation) {
-        response = appResponse.getValue().toString();
+        response = String.valueOf(appResponse.getValue());
     }
 
     @Override
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/StandardMetadataServiceURLBuilder.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/StandardMetadataServiceURLBuilder.java
index e407124..e895a1d 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/StandardMetadataServiceURLBuilder.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/StandardMetadataServiceURLBuilder.java
@@ -27,7 +27,7 @@ import org.apache.dubbo.remoting.Constants;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.ScopeModelAware;
 
-import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
@@ -72,20 +72,21 @@ public class StandardMetadataServiceURLBuilder implements MetadataServiceURLBuil
     public List<URL> build(ServiceInstance serviceInstance) {
         Map<String, String> paramsMap = getMetadataServiceURLsParams(serviceInstance);
 
-        List<URL> urls = new ArrayList<>(paramsMap.size());
-
         String serviceName = serviceInstance.getServiceName();
 
         String host = serviceInstance.getHost();
 
+        URL url;
         if (paramsMap.isEmpty()) {
             // ServiceInstance Metadata is empty. Happened when registry not support metadata write.
-            urls.add(generateUrlWithoutMetadata(serviceName, host, serviceInstance.getPort()));
+            url = generateUrlWithoutMetadata(serviceName, host, serviceInstance.getPort());
         } else {
-            urls.add(generateWithMetadata(serviceName, host, paramsMap));
+            url = generateWithMetadata(serviceName, host, paramsMap);
         }
 
-        return urls;
+        url = url.setScopeModel(serviceInstance.getApplicationModel());
+
+        return Collections.singletonList(url);
     }
 
     private URL generateWithMetadata(String serviceName, String host, Map<String, String> params) {
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 7d4767c..dbcd8ac 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
@@ -603,10 +603,12 @@ public class RegistryProtocol implements Protocol, ScopeModelAware {
 
         for (ApplicationModel applicationModel : frameworkModel.getApplicationModels()) {
             if (applicationModel.getModelEnvironment().getConfiguration().convert(Boolean.class, org.apache.dubbo.registry.Constants.ENABLE_CONFIGURATION_LISTEN, true)) {
-                for (ModuleModel moduleModel : applicationModel.getModuleModels()) {
-                    moduleModel.getExtensionLoader(GovernanceRuleRepository.class).getDefaultExtension()
-                        .removeListener(applicationModel.getApplicationName() + CONFIGURATORS_SUFFIX,
-                            getProviderConfigurationListener(moduleModel));
+                for (ModuleModel moduleModel : applicationModel.getPubModuleModels()) {
+                    if (moduleModel.getServiceRepository().getExportedServices().size() > 0) {
+                        moduleModel.getExtensionLoader(GovernanceRuleRepository.class).getDefaultExtension()
+                            .removeListener(applicationModel.getApplicationName() + CONFIGURATORS_SUFFIX,
+                                getProviderConfigurationListener(moduleModel));
+                    }
                 }
             }
         }
@@ -879,10 +881,12 @@ public class RegistryProtocol implements Protocol, ScopeModelAware {
                         registry.unsubscribe(subscribeUrl, listener);
                         ApplicationModel applicationModel = getApplicationModel(registerUrl.getScopeModel());
                         if (applicationModel.getModelEnvironment().getConfiguration().convert(Boolean.class, ENABLE_CONFIGURATION_LISTEN, true)) {
-                            for (ModuleModel moduleModel : applicationModel.getModuleModels()) {
-                                moduleModel.getExtensionLoader(GovernanceRuleRepository.class).getDefaultExtension()
-                                    .removeListener(subscribeUrl.getServiceKey() + CONFIGURATORS_SUFFIX,
-                                        serviceConfigurationListeners.remove(subscribeUrl.getServiceKey()));
+                            for (ModuleModel moduleModel : applicationModel.getPubModuleModels()) {
+                                if (moduleModel.getServiceRepository().getExportedServices().size() > 0) {
+                                    moduleModel.getExtensionLoader(GovernanceRuleRepository.class).getDefaultExtension()
+                                        .removeListener(subscribeUrl.getServiceKey() + CONFIGURATORS_SUFFIX,
+                                            serviceConfigurationListeners.remove(subscribeUrl.getServiceKey()));
+                                }
                             }
                         }
                     }
diff --git a/dubbo-registry/dubbo-registry-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceInstanceCustomizer b/dubbo-registry/dubbo-registry-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceInstanceCustomizer
index 1f517c8..aa9a685 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceInstanceCustomizer
+++ b/dubbo-registry/dubbo-registry-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceInstanceCustomizer
@@ -1,6 +1,3 @@
 metadata-url=org.apache.dubbo.registry.client.metadata.MetadataServiceURLParamsMetadataCustomizer
-exported-revision=org.apache.dubbo.registry.client.metadata.ExportedServicesRevisionMetadataCustomizer
-subscribed-revision=org.apache.dubbo.registry.client.metadata.SubscribedServicesRevisionMetadataCustomizer
 protocol-ports=org.apache.dubbo.registry.client.metadata.ProtocolPortsMetadataCustomizer
-instance-port=org.apache.dubbo.config.metadata.ServiceInstancePortCustomizer
 instance-metadata=org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataCustomizer
diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/CallbackServiceCodec.java b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/CallbackServiceCodec.java
index 2eec406..922b181 100644
--- a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/CallbackServiceCodec.java
+++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/CallbackServiceCodec.java
@@ -72,11 +72,13 @@ class CallbackServiceCodec {
     private final ProxyFactory proxyFactory;
     private final Protocol protocolSPI;
     private final FrameworkModel frameworkModel;
+    private final DubboProtocol dubboProtocol;
 
     public CallbackServiceCodec(FrameworkModel frameworkModel) {
         this.frameworkModel = frameworkModel;
         proxyFactory = frameworkModel.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();
         protocolSPI = frameworkModel.getExtensionLoader(Protocol.class).getExtension(DUBBO_PROTOCOL);
+        dubboProtocol = (DubboProtocol) frameworkModel.getExtensionLoader(Protocol.class).getExtension(DubboProtocol.NAME, false);
     }
 
     private static byte isCallBack(URL url, String protocolServiceKey, String methodName, int argIndex) {
@@ -322,7 +324,7 @@ class CallbackServiceCodec {
         // need get URL from channel and env when decode
         URL url = null;
         try {
-            url = DubboProtocol.getDubboProtocol().getInvoker(channel, inv).getUrl();
+            url = dubboProtocol.getInvoker(channel, inv).getUrl();
         } catch (RemotingException e) {
             if (logger.isInfoEnabled()) {
                 logger.info(e.getMessage(), e);