Skip to content

Commit

Permalink
Merge pull request #3520, fix #538 polish the process of deciding the…
Browse files Browse the repository at this point in the history
… ip to bind.
  • Loading branch information
beiwei30 authored and chickenlj committed Feb 26, 2019
1 parent 4aaa542 commit ade0cd7
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 55 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ public static boolean isAnyHost(String host) {
return Constants.ANYHOST_VALUE.equals(host);
}

// FIXME: should remove this method completely
public static boolean isInvalidLocalHost(String host) {
return host == null
|| host.length() == 0
Expand All @@ -110,6 +111,7 @@ public static boolean isInvalidLocalHost(String host) {
|| (LOCAL_IP_PATTERN.matcher(host).matches());
}

// FIXME: should remove this method completely
public static boolean isValidLocalHost(String host) {
return !isInvalidLocalHost(host);
}
Expand All @@ -120,9 +122,6 @@ public static InetSocketAddress getLocalSocketAddress(String host, int port) {
}

static boolean isValidV4Address(InetAddress address) {
if (address == null || address.isLoopbackAddress()) {
return false;
}
String name = address.getHostAddress();
return (name != null
&& IP_PATTERN.matcher(name).matches()
Expand All @@ -149,6 +148,10 @@ static boolean isValidV6Address(Inet6Address address) {
return false;
}

static boolean isValidPublicAddress(InetAddress address) {
return !address.isSiteLocalAddress() && !address.isLoopbackAddress();
}

/**
* normalize the ipv6 Address, convert scope name to scope id.
* e.g.
Expand Down Expand Up @@ -219,14 +222,16 @@ public static InetAddress getLocalAddress() {
}

private static Optional<InetAddress> toValidAddress(InetAddress address) {
if (address instanceof Inet6Address) {
Inet6Address v6Address = (Inet6Address) address;
if (isValidV6Address(v6Address)) {
return Optional.ofNullable(normalizeV6Address(v6Address));
if (isValidPublicAddress(address)) {
if (address instanceof Inet6Address) {
Inet6Address v6Address = (Inet6Address) address;
if (isValidV6Address(v6Address)) {
return Optional.ofNullable(normalizeV6Address(v6Address));
}
}
if (isValidV4Address(address)) {
return Optional.of(address);
}
}
if (isValidV4Address(address)) {
return Optional.of(address);
}
return Optional.empty();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,6 @@ public void testGetLocalSocketAddress() throws Exception {

@Test
public void testIsValidAddress() throws Exception {
assertFalse(NetUtils.isValidV4Address((InetAddress) null));
InetAddress address = mock(InetAddress.class);
when(address.isLoopbackAddress()).thenReturn(true);
assertFalse(NetUtils.isValidV4Address(address));
Expand All @@ -131,7 +130,6 @@ public void testGetLocalHost() throws Exception {
public void testGetLocalAddress() throws Exception {
InetAddress address = NetUtils.getLocalAddress();
assertNotNull(address);
assertTrue(NetUtils.isValidLocalHost(address.getHostAddress()));
}

@Test
Expand Down Expand Up @@ -209,4 +207,4 @@ public void testNormalizeV6Address() {
InetAddress normalized = NetUtils.normalizeV6Address(address);
assertThat(normalized.getHostAddress(), equalTo("fe80:0:0:0:894:aeec:f37d:23e1%5"));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -333,9 +333,6 @@ protected URL loadMonitor(URL registryURL) {
String hostToRegistry = ConfigUtils.getSystemProperty(Constants.DUBBO_IP_TO_REGISTRY);
if (StringUtils.isEmpty(hostToRegistry)) {
hostToRegistry = NetUtils.getLocalHost();
} else if (NetUtils.isInvalidLocalHost(hostToRegistry)) {
throw new IllegalArgumentException("Specified invalid registry ip from property:" +
Constants.DUBBO_IP_TO_REGISTRY + ", value:" + hostToRegistry);
}
map.put(Constants.REGISTER_IP_KEY, hostToRegistry);
appendParameters(map, monitor);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@
import java.util.Map;
import java.util.Properties;

import static org.apache.dubbo.common.utils.NetUtils.isInvalidLocalHost;

/**
* ReferenceConfig
Expand Down Expand Up @@ -108,7 +107,7 @@ public class ReferenceConfig<T> extends AbstractReferenceConfig {
* The interface class of the reference service
*/
private Class<?> interfaceClass;

/**
* client type
*/
Expand Down Expand Up @@ -299,8 +298,6 @@ private void init() {
String hostToRegistry = ConfigUtils.getSystemProperty(Constants.DUBBO_IP_TO_REGISTRY);
if (StringUtils.isEmpty(hostToRegistry)) {
hostToRegistry = NetUtils.getLocalHost();
} else if (isInvalidLocalHost(hostToRegistry)) {
throw new IllegalArgumentException("Specified invalid registry ip from property:" + Constants.DUBBO_IP_TO_REGISTRY + ", value:" + hostToRegistry);
}
map.put(Constants.REGISTER_IP_KEY, hostToRegistry);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,9 @@
import org.apache.dubbo.rpc.support.ProtocolUtils;

import java.lang.reflect.Method;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
Expand All @@ -62,7 +60,6 @@
import static org.apache.dubbo.common.Constants.LOCALHOST_VALUE;
import static org.apache.dubbo.common.utils.NetUtils.getAvailablePort;
import static org.apache.dubbo.common.utils.NetUtils.getLocalHost;
import static org.apache.dubbo.common.utils.NetUtils.isInvalidLocalHost;
import static org.apache.dubbo.common.utils.NetUtils.isInvalidPort;

/**
Expand Down Expand Up @@ -602,43 +599,20 @@ private String findConfigedHosts(ProtocolConfig protocolConfig, List<URL> regist
boolean anyhost = false;

String hostToBind = getValueFromConfig(protocolConfig, Constants.DUBBO_IP_TO_BIND);
if (hostToBind != null && hostToBind.length() > 0 && isInvalidLocalHost(hostToBind)) {
throw new IllegalArgumentException("Specified invalid bind ip from property:" + Constants.DUBBO_IP_TO_BIND + ", value:" + hostToBind);
}

// if bind ip is not found in environment, keep looking up
if (StringUtils.isEmpty(hostToBind)) {
hostToBind = protocolConfig.getHost();
if (provider != null && StringUtils.isEmpty(hostToBind)) {
hostToBind = provider.getHost();
}
if (isInvalidLocalHost(hostToBind)) {

if (StringUtils.isEmpty(hostToBind)) {
anyhost = true;
try {
hostToBind = InetAddress.getLocalHost().getHostAddress();
} catch (UnknownHostException e) {
logger.warn(e.getMessage(), e);
}
if (isInvalidLocalHost(hostToBind)) {
if (CollectionUtils.isNotEmpty(registryURLs)) {
for (URL registryURL : registryURLs) {
if (Constants.MULTICAST.equalsIgnoreCase(registryURL.getParameter("registry"))) {
// skip multicast registry since we cannot connect to it via Socket
continue;
}
try (Socket socket = new Socket()) {
SocketAddress addr = new InetSocketAddress(registryURL.getHost(), registryURL.getPort());
socket.connect(addr, 1000);
hostToBind = socket.getLocalAddress().getHostAddress();
break;
} catch (Exception e) {
logger.warn(e.getMessage(), e);
}
}
}
if (isInvalidLocalHost(hostToBind)) {
hostToBind = getLocalHost();
}
hostToBind = getLocalHost();

if (StringUtils.isEmpty(hostToBind)) {
hostToBind = findHostToBindByConnectRegistries(registryURLs);
}
}
}
Expand All @@ -647,9 +621,7 @@ private String findConfigedHosts(ProtocolConfig protocolConfig, List<URL> regist

// registry ip is not used for bind ip by default
String hostToRegistry = getValueFromConfig(protocolConfig, Constants.DUBBO_IP_TO_REGISTRY);
if (hostToRegistry != null && hostToRegistry.length() > 0 && isInvalidLocalHost(hostToRegistry)) {
throw new IllegalArgumentException("Specified invalid registry ip from property:" + Constants.DUBBO_IP_TO_REGISTRY + ", value:" + hostToRegistry);
} else if (StringUtils.isEmpty(hostToRegistry)) {
if (StringUtils.isEmpty(hostToRegistry)) {
// bind ip is used as registry ip by default
hostToRegistry = hostToBind;
}
Expand All @@ -659,6 +631,25 @@ private String findConfigedHosts(ProtocolConfig protocolConfig, List<URL> regist
return hostToRegistry;
}

private String findHostToBindByConnectRegistries(List<URL> registryURLs) {
if (CollectionUtils.isNotEmpty(registryURLs)) {
for (URL registryURL : registryURLs) {
if (Constants.MULTICAST.equalsIgnoreCase(registryURL.getParameter("registry"))) {
// skip multicast registry since we cannot connect to it via Socket
continue;
}
try (Socket socket = new Socket()) {
SocketAddress addr = new InetSocketAddress(registryURL.getHost(), registryURL.getPort());
socket.connect(addr, 1000);
return socket.getLocalAddress().getHostAddress();
} catch (Exception e) {
logger.warn(e.getMessage(), e);
}
}
}
return null;
}

/**
* Register port and bind port for the provider, can be configured separately
* Configuration priority: environment variable -> java system properties -> port property in protocol config file
Expand Down

0 comments on commit ade0cd7

Please sign in to comment.