diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/com/alibaba/dubbo/registry/integration/RegistryDirectory.java b/dubbo-registry/dubbo-registry-api/src/main/java/com/alibaba/dubbo/registry/integration/RegistryDirectory.java index 68ecc0e9efb..d5ae6b8af3b 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/com/alibaba/dubbo/registry/integration/RegistryDirectory.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/com/alibaba/dubbo/registry/integration/RegistryDirectory.java @@ -78,6 +78,8 @@ public class RegistryDirectory extends AbstractDirectory implements Notify private volatile URL overrideDirectoryUrl; // Initialization at construction time, assertion not null, and always assign non null value + private volatile URL registeredConsumerUrl; + /** * override rules * Priority: override>-D>consumer>provider @@ -164,6 +166,16 @@ public void destroy() { if (isDestroyed()) { return; } + + // unregister. + try { + if (getRegisteredConsumerUrl() != null && registry != null && registry.isAvailable()) { + registry.unregister(getRegisteredConsumerUrl()); + } + } catch (Throwable t) { + logger.warn("unexpected error when unregister service " + serviceKey + "from registry" + registry.getUrl(), t); + } + // unsubscribe. try { if (getConsumerUrl() != null && registry != null && registry.isAvailable()) { @@ -612,6 +624,14 @@ public URL getUrl() { return this.overrideDirectoryUrl; } + public URL getRegisteredConsumerUrl() { + return registeredConsumerUrl; + } + + public void setRegisteredConsumerUrl(URL registeredConsumerUrl) { + this.registeredConsumerUrl = registeredConsumerUrl; + } + @Override public boolean isAvailable() { if (isDestroyed()) { diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/com/alibaba/dubbo/registry/integration/RegistryProtocol.java b/dubbo-registry/dubbo-registry-api/src/main/java/com/alibaba/dubbo/registry/integration/RegistryProtocol.java index e1a59b9dbb2..f8bf2a133bd 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/com/alibaba/dubbo/registry/integration/RegistryProtocol.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/com/alibaba/dubbo/registry/integration/RegistryProtocol.java @@ -51,6 +51,9 @@ import static com.alibaba.dubbo.common.Constants.QOS_ENABLE; import static com.alibaba.dubbo.common.Constants.QOS_PORT; import static com.alibaba.dubbo.common.Constants.VALIDATION_KEY; +import static com.alibaba.dubbo.common.Constants.CATEGORY_KEY; +import static com.alibaba.dubbo.common.Constants.CONSUMERS_CATEGORY; +import static com.alibaba.dubbo.common.Constants.CHECK_KEY; /** * RegistryProtocol @@ -300,8 +303,9 @@ private Invoker doRefer(Cluster cluster, Registry registry, Class type URL subscribeUrl = new URL(Constants.CONSUMER_PROTOCOL, parameters.remove(Constants.REGISTER_IP_KEY), 0, type.getName(), parameters); if (!Constants.ANY_VALUE.equals(url.getServiceInterface()) && url.getParameter(Constants.REGISTER_KEY, true)) { - registry.register(subscribeUrl.addParameters(Constants.CATEGORY_KEY, Constants.CONSUMERS_CATEGORY, - Constants.CHECK_KEY, String.valueOf(false))); + URL registeredConsumerUrl = getRegisteredConsumerUrl(subscribeUrl, url); + registry.register(registeredConsumerUrl); + directory.setRegisteredConsumerUrl(registeredConsumerUrl); } directory.subscribe(subscribeUrl.addParameter(Constants.CATEGORY_KEY, Constants.PROVIDERS_CATEGORY @@ -313,6 +317,11 @@ private Invoker doRefer(Cluster cluster, Registry registry, Class type return invoker; } + public URL getRegisteredConsumerUrl(final URL consumerUrl, URL registryUrl) { + return consumerUrl.addParameters(CATEGORY_KEY, CONSUMERS_CATEGORY, + CHECK_KEY, String.valueOf(false)); + } + @Override public void destroy() { List> exporters = new ArrayList>(bounds.values());