diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/constants/RegistryConstants.java b/dubbo-common/src/main/java/org/apache/dubbo/common/constants/RegistryConstants.java index d0f41af93b..f76440bd83 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/constants/RegistryConstants.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/constants/RegistryConstants.java @@ -65,9 +65,19 @@ public interface RegistryConstants { String REGISTRY_PUBLISH_INSTANCE_KEY = "publish-instance"; + String REGISTER_MODE_KEY = "register-mode"; + + String DUBBO_REGISTER_MODE_DEFAULT_KEY = "dubbo.application.register-mode"; + String DUBBO_PUBLISH_INTERFACE_DEFAULT_KEY = "dubbo.application.publish-interface"; String DUBBO_PUBLISH_INSTANCE_DEFAULT_KEY = "dubbo.application.publish-instance"; + + String DEFAULT_REGISTER_MODE_INTERFACE = "interface"; + + String DEFAULT_REGISTER_MODE_INSTANCE = "instance"; + + String DEFAULT_REGISTER_MODE_ALL = "all"; /** * The parameter key of Dubbo Registry type * diff --git a/dubbo-common/src/main/java/org/apache/dubbo/rpc/support/GroupServiceKeyCache.java b/dubbo-common/src/main/java/org/apache/dubbo/rpc/support/GroupServiceKeyCache.java index 3b37b59ccb..f040f3c948 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/rpc/support/GroupServiceKeyCache.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/rpc/support/GroupServiceKeyCache.java @@ -62,7 +62,7 @@ public class GroupServiceKeyCache { } buf.append(serviceName); - if (StringUtils.isNotEmpty(serviceVersion) && !"0.0.0".equals(serviceVersion)) { + if (StringUtils.isNotEmpty(serviceVersion) && !"0.0.0".equals(serviceVersion) && !"*".equals(serviceVersion)) { buf.append(':').append(serviceVersion); } buf.append(':').append(port); diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/utils/ConfigValidationUtils.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/utils/ConfigValidationUtils.java index 4737bf204a..6919652d5b 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/utils/ConfigValidationUtils.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/utils/ConfigValidationUtils.java @@ -87,12 +87,13 @@ import static org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_SE import static org.apache.dubbo.common.constants.CommonConstants.THREADPOOL_KEY; import static org.apache.dubbo.common.constants.CommonConstants.USERNAME_KEY; import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY; -import static org.apache.dubbo.common.constants.RegistryConstants.DUBBO_PUBLISH_INSTANCE_DEFAULT_KEY; -import static org.apache.dubbo.common.constants.RegistryConstants.DUBBO_PUBLISH_INTERFACE_DEFAULT_KEY; +import static org.apache.dubbo.common.constants.RegistryConstants.DEFAULT_REGISTER_MODE_ALL; +import static org.apache.dubbo.common.constants.RegistryConstants.DEFAULT_REGISTER_MODE_INSTANCE; +import static org.apache.dubbo.common.constants.RegistryConstants.DEFAULT_REGISTER_MODE_INTERFACE; +import static org.apache.dubbo.common.constants.RegistryConstants.DUBBO_REGISTER_MODE_DEFAULT_KEY; +import static org.apache.dubbo.common.constants.RegistryConstants.REGISTER_MODE_KEY; import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_KEY; import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_PROTOCOL; -import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_PUBLISH_INSTANCE_KEY; -import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_PUBLISH_INTERFACE_KEY; import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_TYPE_KEY; import static org.apache.dubbo.common.constants.RegistryConstants.SERVICE_REGISTRY_PROTOCOL; import static org.apache.dubbo.common.constants.RemotingConstants.BACKUP_KEY; @@ -214,11 +215,15 @@ public class ConfigValidationUtils { List result = new ArrayList<>(registryList.size()); registryList.forEach(registryURL -> { if (provider) { - boolean publishInterface = registryURL.getParameter(REGISTRY_PUBLISH_INTERFACE_KEY, ConfigurationUtils.getDynamicGlobalConfiguration().getBoolean(DUBBO_PUBLISH_INTERFACE_DEFAULT_KEY, true)); // for registries enabled service discovery, automatically register interface compatible addresses. if (SERVICE_REGISTRY_PROTOCOL.equals(registryURL.getProtocol())) { + String registerMode = registryURL.getParameter(REGISTER_MODE_KEY, ConfigurationUtils.getDynamicGlobalConfiguration().getString(DUBBO_REGISTER_MODE_DEFAULT_KEY, DEFAULT_REGISTER_MODE_INSTANCE)); + if (!isValidRegisterMode(registerMode)) { + registerMode = DEFAULT_REGISTER_MODE_INSTANCE; + } result.add(registryURL); - if (publishInterface && registryNotExists(registryURL, registryList, REGISTRY_PROTOCOL)) { + if (DEFAULT_REGISTER_MODE_ALL.equalsIgnoreCase(registerMode) + && registryNotExists(registryURL, registryList, REGISTRY_PROTOCOL)) { URL interfaceCompatibleRegistryURL = URLBuilder.from(registryURL) .setProtocol(REGISTRY_PROTOCOL) .removeParameter(REGISTRY_TYPE_KEY) @@ -226,16 +231,20 @@ public class ConfigValidationUtils { result.add(interfaceCompatibleRegistryURL); } } else { - boolean publishInstance = registryURL.getParameter(REGISTRY_PUBLISH_INSTANCE_KEY, ConfigurationUtils.getDynamicGlobalConfiguration().getBoolean(DUBBO_PUBLISH_INSTANCE_DEFAULT_KEY, true)); - if (registryNotExists(registryURL, registryList, SERVICE_REGISTRY_PROTOCOL) - && publishInstance) { + String registerMode = registryURL.getParameter(REGISTER_MODE_KEY, ConfigurationUtils.getDynamicGlobalConfiguration().getString(DUBBO_REGISTER_MODE_DEFAULT_KEY, DEFAULT_REGISTER_MODE_INTERFACE)); + if (!isValidRegisterMode(registerMode)) { + registerMode = DEFAULT_REGISTER_MODE_INTERFACE; + } + if ((DEFAULT_REGISTER_MODE_INSTANCE.equalsIgnoreCase(registerMode) || DEFAULT_REGISTER_MODE_ALL.equalsIgnoreCase(registerMode)) + && registryNotExists(registryURL, registryList, SERVICE_REGISTRY_PROTOCOL)) { URL serviceDiscoveryRegistryURL = URLBuilder.from(registryURL) .setProtocol(SERVICE_REGISTRY_PROTOCOL) .removeParameter(REGISTRY_TYPE_KEY) .build(); result.add(serviceDiscoveryRegistryURL); } - if (publishInterface) { + + if (DEFAULT_REGISTER_MODE_INTERFACE.equalsIgnoreCase(registerMode) || DEFAULT_REGISTER_MODE_ALL.equalsIgnoreCase(registerMode)) { result.add(registryURL); } } @@ -246,6 +255,14 @@ public class ConfigValidationUtils { return result; } + private static boolean isValidRegisterMode(String mode) { + return StringUtils.isNotEmpty(mode) + && (DEFAULT_REGISTER_MODE_INTERFACE.equalsIgnoreCase(mode) + || DEFAULT_REGISTER_MODE_INSTANCE.equalsIgnoreCase(mode) + || DEFAULT_REGISTER_MODE_ALL.equalsIgnoreCase(mode) + ); + } + private static boolean registryNotExists(URL registryURL, List registryList, String registryType) { return registryList.stream().noneMatch( url -> registryType.equals(url.getProtocol()) && registryURL.getBackupAddress().equals(url.getBackupAddress()) diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java index 62fb08f453..57aadd5cf4 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java @@ -262,14 +262,9 @@ public class ServiceInstancesChangedListener implements ConditionalEventListener protected MetadataInfo getRemoteMetadata(ServiceInstance instance, String revision, Map> localServiceToRevisions, List subInstances) { MetadataInfo metadata = revisionToMetadata.get(revision); - if (metadata != null && metadata != MetadataInfo.EMPTY) { - logger.info("MetadataInfo for instance " + instance.getAddress() + "?revision=" + revision + "&cluster=" + instance.getRegistryCluster() + ", " + metadata); - } - if (metadata == null || (metadata == MetadataInfo.EMPTY && (failureCounter.get() < 3 || (System.currentTimeMillis() - lastFailureTime > 10000)))) { metadata = getMetadataInfo(instance); - if (metadata != MetadataInfo.EMPTY) { failureCounter.set(0); revisionToMetadata.putIfAbsent(revision, metadata);