diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataInfo.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataInfo.java index baa2559a49..998a5e8375 100644 --- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataInfo.java +++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataInfo.java @@ -30,6 +30,7 @@ import org.apache.dubbo.common.utils.StringUtils; import java.beans.Transient; import java.io.Serializable; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; @@ -318,6 +319,16 @@ public class MetadataInfo implements Serializable { return exportedServiceURLs; } + public Set collectExportedURLSet() { + if (exportedServiceURLs == null) { + return Collections.emptySet(); + } + return exportedServiceURLs.values().stream() + .filter(CollectionUtils::isNotEmpty) + .flatMap(Collection::stream) + .collect(Collectors.toSet()); + } + private boolean addURL(Map> serviceURLs, URL url) { SortedSet urls = serviceURLs.computeIfAbsent(url.getServiceKey(), this::newSortedURLs); // make sure the parameters of tmpUrl is variable diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/ProtocolPortsMetadataCustomizer.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/ProtocolPortsMetadataCustomizer.java index c413ade045..c60f17d425 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/ProtocolPortsMetadataCustomizer.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/ProtocolPortsMetadataCustomizer.java @@ -17,6 +17,8 @@ package org.apache.dubbo.registry.client.metadata; import org.apache.dubbo.common.URL; +import org.apache.dubbo.common.logger.ErrorTypeAwareLogger; +import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.common.utils.CollectionUtils; import org.apache.dubbo.metadata.MetadataInfo; import org.apache.dubbo.registry.client.ServiceInstance; @@ -25,10 +27,8 @@ import org.apache.dubbo.rpc.Protocol; import org.apache.dubbo.rpc.model.ApplicationModel; import java.util.HashMap; -import java.util.HashSet; import java.util.Map; import java.util.Set; -import java.util.SortedSet; import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.setEndpoints; @@ -39,7 +39,7 @@ import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataU * @since 2.7.5 */ public class ProtocolPortsMetadataCustomizer implements ServiceInstanceCustomizer { - + private static final ErrorTypeAwareLogger LOGGER = LoggerFactory.getErrorTypeAwareLogger(ProtocolPortsMetadataCustomizer.class); @Override public void customize(ServiceInstance serviceInstance, ApplicationModel applicationModel) { MetadataInfo metadataInfo = serviceInstance.getServiceMetadata(); @@ -48,17 +48,17 @@ public class ProtocolPortsMetadataCustomizer implements ServiceInstanceCustomize } Map protocols = new HashMap<>(); - Set urls = new HashSet<>(); - Map> exportedURLS = metadataInfo.getExportedServiceURLs(); - for (Map.Entry> entry : exportedURLS.entrySet()) { - if (entry.getValue() != null) { - urls.addAll(entry.getValue()); - } - } - + Set urls = metadataInfo.collectExportedURLSet(); urls.forEach(url -> { // TODO, same protocol listen on different ports will override with each other. - protocols.put(url.getProtocol(), url.getPort()); + String protocol = url.getProtocol(); + Integer oldPort = protocols.get(protocol); + int newPort = url.getPort(); + if (oldPort != null) { + LOGGER.warn("same protocol " + "[" + protocol + "]" + " listen on different ports " + "[" + oldPort + "," + newPort + "]" + " will override with each other" + + ".Override port [" + oldPort + "] with port [" + newPort + "]"); + } + protocols.put(protocol, newPort); }); if (protocols.size() > 0) {// set endpoints only for multi-protocol scenario diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceHostPortCustomizer.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceHostPortCustomizer.java index f5786c2316..e7c20e3bff 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceHostPortCustomizer.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceHostPortCustomizer.java @@ -26,10 +26,7 @@ import org.apache.dubbo.registry.client.ServiceInstance; import org.apache.dubbo.registry.client.ServiceInstanceCustomizer; import org.apache.dubbo.rpc.model.ApplicationModel; -import java.util.HashSet; -import java.util.Map; import java.util.Set; -import java.util.SortedSet; import static org.apache.dubbo.common.constants.LoggerCodeConstants.PROTOCOL_FAILED_INIT_SERIALIZATION_OPTIMIZER; @@ -53,13 +50,7 @@ public class ServiceInstanceHostPortCustomizer implements ServiceInstanceCustomi String host = null; int port = -1; - Set urls = new HashSet<>(); - Map> exportedURLS = metadataInfo.getExportedServiceURLs(); - for (Map.Entry> entry : exportedURLS.entrySet()) { - if (entry.getValue() != null) { - urls.addAll(entry.getValue()); - } - } + Set urls = metadataInfo.collectExportedURLSet(); if (CollectionUtils.isNotEmpty(urls)) { String preferredProtocol = applicationModel.getCurrentConfig().getProtocol();