diff --git a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/directory/MockDirInvocation.java b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/directory/MockDirInvocation.java index 80e86f9eb7..69cfb53111 100644 --- a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/directory/MockDirInvocation.java +++ b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/directory/MockDirInvocation.java @@ -34,6 +34,11 @@ import static org.apache.dubbo.rpc.Constants.TOKEN_KEY; */ public class MockDirInvocation implements Invocation { + @Override + public String getTargetServiceUniqueName() { + return null; + } + public String getMethodName() { return "echo"; } diff --git a/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/Invocation.java b/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/Invocation.java index 3188bd305c..3f606b4acd 100644 --- a/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/Invocation.java +++ b/dubbo-compatible/src/main/java/com/alibaba/dubbo/rpc/Invocation.java @@ -46,6 +46,11 @@ public interface Invocation extends org.apache.dubbo.rpc.Invocation { this.delegate = invocation; } + @Override + public String getTargetServiceUniqueName() { + return delegate.getTargetServiceUniqueName(); + } + @Override public String getMethodName() { return delegate.getMethodName(); diff --git a/dubbo-compatible/src/test/java/org/apache/dubbo/cache/CacheTest.java b/dubbo-compatible/src/test/java/org/apache/dubbo/cache/CacheTest.java index 0c9a82ecae..b8300cfe93 100644 --- a/dubbo-compatible/src/test/java/org/apache/dubbo/cache/CacheTest.java +++ b/dubbo-compatible/src/test/java/org/apache/dubbo/cache/CacheTest.java @@ -24,7 +24,6 @@ import com.alibaba.dubbo.cache.CacheFactory; import com.alibaba.dubbo.common.URL; import com.alibaba.dubbo.rpc.Invocation; import com.alibaba.dubbo.rpc.Invoker; - import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -49,6 +48,11 @@ public class CacheTest { } static class NullInvocation implements Invocation { + @Override + public String getTargetServiceUniqueName() { + return null; + } + @Override public String getMethodName() { return null; diff --git a/dubbo-compatible/src/test/java/org/apache/dubbo/filter/LegacyInvocation.java b/dubbo-compatible/src/test/java/org/apache/dubbo/filter/LegacyInvocation.java index 3544c0b46a..b6d3c10bdd 100644 --- a/dubbo-compatible/src/test/java/org/apache/dubbo/filter/LegacyInvocation.java +++ b/dubbo-compatible/src/test/java/org/apache/dubbo/filter/LegacyInvocation.java @@ -41,6 +41,11 @@ public class LegacyInvocation implements Invocation { this.arg0 = arg0; } + @Override + public String getTargetServiceUniqueName() { + return null; + } + public String getMethodName() { return "echo"; } diff --git a/dubbo-compatible/src/test/java/org/apache/dubbo/service/MockInvocation.java b/dubbo-compatible/src/test/java/org/apache/dubbo/service/MockInvocation.java index 4c0d4eee0f..e5377c7c60 100644 --- a/dubbo-compatible/src/test/java/org/apache/dubbo/service/MockInvocation.java +++ b/dubbo-compatible/src/test/java/org/apache/dubbo/service/MockInvocation.java @@ -40,6 +40,11 @@ public class MockInvocation implements Invocation { this.arg0 = arg0; } + @Override + public String getTargetServiceUniqueName() { + return null; + } + public String getMethodName() { return "echo"; } diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java index 028de529e6..0b26e11c8e 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java @@ -356,9 +356,11 @@ public class ReferenceConfig extends AbstractReferenceConfig { serviceMetadata.getAttachments().putAll(map); + ApplicationModel.initConsumerModel(URL.buildKey(interfaceName, group, version), buildConsumerModel(attributes, serviceMetadata)); + ref = createProxy(map); - ApplicationModel.initConsumerModel(serviceMetadata.getServiceKey(), buildConsumerModel(attributes, serviceMetadata)); + serviceMetadata.setTarget(ref); serviceMetadata.addAttribute(PROXY_CLASS_REF, ref); initialized = true; @@ -417,7 +419,7 @@ public class ReferenceConfig extends AbstractReferenceConfig { } } else { // assemble URL from register center's configuration // if protocols not injvm checkRegistry - if (!LOCAL_PROTOCOL.equalsIgnoreCase(getProtocol())){ + if (!LOCAL_PROTOCOL.equalsIgnoreCase(getProtocol())) { checkRegistry(); List us = loadRegistries(false); if (CollectionUtils.isNotEmpty(us)) { diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/AddressListener.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/AddressListener.java index 9c79f15819..e1d8809374 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/AddressListener.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/AddressListener.java @@ -18,6 +18,7 @@ package org.apache.dubbo.registry; import org.apache.dubbo.common.URL; import org.apache.dubbo.common.extension.SPI; +import org.apache.dubbo.rpc.cluster.Directory; import java.util.List; @@ -29,7 +30,8 @@ public interface AddressListener { * * @param addresses provider address list * @param registryDirectoryUrl + * @param registryDirectory */ - List notify(List addresses, URL registryDirectoryUrl); + List notify(List addresses, URL registryDirectoryUrl, Directory registryDirectory); } \ No newline at end of file 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 f122ec31f0..c310226bb7 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 @@ -238,7 +238,7 @@ public class RegistryDirectory extends AbstractDirectory implements Notify List supportedListeners = addressListenerExtensionLoader.getActivateExtension(getUrl(), (String[]) null); if (supportedListeners != null && !supportedListeners.isEmpty()) { for (AddressListener addressListener : supportedListeners) { - providerURLs = addressListener.notify(providerURLs, getUrl()); + providerURLs = addressListener.notify(providerURLs, getUrl(),this); } } refreshOverrideAndInvoker(providerURLs); diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/Invocation.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/Invocation.java index 61c86e2320..96520d375a 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/Invocation.java +++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/Invocation.java @@ -27,6 +27,8 @@ import java.util.Map; */ public interface Invocation { + String getTargetServiceUniqueName(); + /** * get method name. * diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/RpcInvocation.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/RpcInvocation.java index 2aa973514e..fc63baea76 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/RpcInvocation.java +++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/RpcInvocation.java @@ -41,6 +41,8 @@ public class RpcInvocation implements Invocation, Serializable { private static final long serialVersionUID = -4355285085441097045L; + private String targetServiceUniqueName; + private String methodName; private Class[] parameterTypes; @@ -86,11 +88,13 @@ public class RpcInvocation implements Invocation, Serializable { setAttachment(APPLICATION_KEY, url.getParameter(APPLICATION_KEY)); } } + this.targetServiceUniqueName = invocation.getTargetServiceUniqueName(); } public RpcInvocation(Invocation invocation) { this(invocation.getMethodName(), invocation.getParameterTypes(), invocation.getArguments(), invocation.getAttachments(), invocation.getInvoker()); + this.targetServiceUniqueName = invocation.getTargetServiceUniqueName(); } public RpcInvocation(Method method, Object[] arguments) { @@ -141,6 +145,15 @@ public class RpcInvocation implements Invocation, Serializable { return attributes; } + @Override + public String getTargetServiceUniqueName() { + return targetServiceUniqueName; + } + + public void setTargetServiceUniqueName(String targetServiceUniqueName) { + this.targetServiceUniqueName = targetServiceUniqueName; + } + @Override public String getMethodName() { return methodName; diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/GenericFilter.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/GenericFilter.java index ccad3a3940..95b4a1f309 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/GenericFilter.java +++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/GenericFilter.java @@ -138,7 +138,10 @@ public class GenericFilter extends ListenableFilter { args[0].getClass().getName()); } } - return invoker.invoke(new RpcInvocation(method, args, inv.getAttachments(), inv.getAttributes())); + RpcInvocation rpcInvocation = new RpcInvocation(method, args, inv.getAttachments(), inv.getAttributes()); + rpcInvocation.setTargetServiceUniqueName(inv.getTargetServiceUniqueName()); + + return invoker.invoke(rpcInvocation); } catch (NoSuchMethodException e) { throw new RpcException(e.getMessage(), e); } catch (ClassNotFoundException e) { diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/proxy/InvokerInvocationHandler.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/proxy/InvokerInvocationHandler.java index 1d047cdccf..0b054264aa 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/proxy/InvokerInvocationHandler.java +++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/proxy/InvokerInvocationHandler.java @@ -51,7 +51,9 @@ public class InvokerInvocationHandler implements InvocationHandler { if ("equals".equals(methodName) && parameterTypes.length == 1) { return invoker.equals(args[0]); } + RpcInvocation rpcInvocation = new RpcInvocation(method, args); + rpcInvocation.setTargetServiceUniqueName(invoker.getUrl().getServiceKey()); - return invoker.invoke(new RpcInvocation(method, args)).recreate(); + return invoker.invoke(rpcInvocation).recreate(); } } diff --git a/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/support/MockInvocation.java b/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/support/MockInvocation.java index c13218dbaa..431b4249e6 100644 --- a/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/support/MockInvocation.java +++ b/dubbo-rpc/dubbo-rpc-api/src/test/java/org/apache/dubbo/rpc/support/MockInvocation.java @@ -34,6 +34,11 @@ import static org.apache.dubbo.rpc.Constants.TOKEN_KEY; */ public class MockInvocation implements Invocation { + @Override + public String getTargetServiceUniqueName() { + return null; + } + public String getMethodName() { return "echo"; } diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DecodeableRpcInvocation.java b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DecodeableRpcInvocation.java index 353501e6de..8ffb363a60 100644 --- a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DecodeableRpcInvocation.java +++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DecodeableRpcInvocation.java @@ -37,10 +37,12 @@ import java.io.OutputStream; import java.util.HashMap; import java.util.Map; +import static org.apache.dubbo.common.URL.buildKey; +import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY; import static org.apache.dubbo.common.constants.CommonConstants.PATH_KEY; import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY; -import static org.apache.dubbo.rpc.protocol.dubbo.CallbackServiceCodec.decodeInvocationArgument; import static org.apache.dubbo.remoting.Constants.DUBBO_VERSION_KEY; +import static org.apache.dubbo.rpc.protocol.dubbo.CallbackServiceCodec.decodeInvocationArgument; public class DecodeableRpcInvocation extends RpcInvocation implements Codec, Decodeable { @@ -138,7 +140,10 @@ public class DecodeableRpcInvocation extends RpcInvocation implements Codec, Dec } setArguments(args); - + String targetServiceName = buildKey((String) getAttachment(PATH_KEY), + (String) getAttachment(GROUP_KEY), + (String) getAttachment(VERSION_KEY)); + setTargetServiceUniqueName(targetServiceName); } catch (ClassNotFoundException e) { throw new IOException(StringUtils.toString("Read invocation data failed.", e)); } finally {