diff --git a/common/src/main/java/org/apache/seata/common/util/NetUtil.java b/common/src/main/java/org/apache/seata/common/util/NetUtil.java index 2043f85c79a..4d7d20b12e3 100644 --- a/common/src/main/java/org/apache/seata/common/util/NetUtil.java +++ b/common/src/main/java/org/apache/seata/common/util/NetUtil.java @@ -31,6 +31,8 @@ import java.util.Enumeration; import java.util.LinkedHashSet; import java.util.Set; +import java.util.List; +import java.util.ArrayList; /** @@ -367,4 +369,27 @@ private static String removeBrackets(String str) { } return str.replaceAll("[\\[\\]]", ""); } + + public static List getHostByName(String ipOrDomain) { + if (ipOrDomain == null) { + return null; + } + List ipAddressList = new ArrayList<>(); + if (isValidIPv4(ipOrDomain) || isValidIPv6(ipOrDomain)) { + ipAddressList.add(ipOrDomain); + return ipAddressList; + } else { + try { + InetAddress[] allByName = InetAddress.getAllByName(ipOrDomain); + for (InetAddress address : allByName) { + ipAddressList.add(address.getHostAddress()); + } + return ipAddressList; + } catch (UnknownHostException e) { + LOGGER.warn("Failed to resolve ip address, {}", e.getMessage()); + ipAddressList.add(ipOrDomain); + return ipAddressList; + } + } + } } diff --git a/server/src/main/java/org/apache/seata/server/cluster/raft/RaftServerManager.java b/server/src/main/java/org/apache/seata/server/cluster/raft/RaftServerManager.java index 47e7ee4432b..e62acdb1274 100644 --- a/server/src/main/java/org/apache/seata/server/cluster/raft/RaftServerManager.java +++ b/server/src/main/java/org/apache/seata/server/cluster/raft/RaftServerManager.java @@ -22,6 +22,7 @@ import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import com.alipay.remoting.serialization.SerializerManager; @@ -39,6 +40,7 @@ import org.apache.seata.common.ConfigurationKeys; import org.apache.seata.common.XID; import org.apache.seata.common.store.SessionMode; +import org.apache.seata.common.util.NetUtil; import org.apache.seata.common.util.StringUtils; import org.apache.seata.config.ConfigurationFactory; import org.apache.seata.core.serializer.SerializerType; @@ -115,12 +117,16 @@ public static void init() { if (port <= 0) { // Highly available deployments require different nodes for (PeerId peer : initConf.getPeers()) { - if (StringUtils.equals(peer.getIp(), host)) { - if (serverId != null) { - throw new IllegalArgumentException( - "server.raft.cluster has duplicate ip, For local debugging, use -Dserver.raftPort to specify the raft port"); + List peerIps = NetUtil.getHostByName(peer.getIp()); + for (String peerIp : peerIps) { + if (StringUtils.equals(peerIp, host)) { + if (serverId != null) { + throw new IllegalArgumentException( + "server.raft.cluster has duplicate ip, For local debugging, use -Dserver.raftPort to specify the raft port"); + } + serverId = peer; + break; } - serverId = peer; } } } else { diff --git a/server/src/main/java/org/apache/seata/server/cluster/raft/RaftStateMachine.java b/server/src/main/java/org/apache/seata/server/cluster/raft/RaftStateMachine.java index 6ba9d66673b..de990bb0eec 100644 --- a/server/src/main/java/org/apache/seata/server/cluster/raft/RaftStateMachine.java +++ b/server/src/main/java/org/apache/seata/server/cluster/raft/RaftStateMachine.java @@ -364,7 +364,7 @@ public RaftClusterMetadata changeOrInitRaftClusterMetadata() { if (leaderNode == null || (leaderNode.getInternal() != null && !cureentPeerId.equals(new PeerId(leaderNode.getInternal().getHost(), leaderNode.getInternal().getPort())))) { Node leader = - raftClusterMetadata.createNode(XID.getIpAddress(), XID.getPort(), raftServer.getServerId().getPort(), + raftClusterMetadata.createNode(cureentPeerId.getIp(), XID.getPort(), raftServer.getServerId().getPort(), Integer.parseInt( ((Environment)ObjectHolder.INSTANCE.getObject(OBJECT_KEY_SPRING_CONFIGURABLE_ENVIRONMENT)) .getProperty("server.port", String.valueOf(7091))), @@ -407,7 +407,7 @@ private void syncCurrentNodeInfo(PeerId leaderPeerId) { if (leader != null && StringUtils.isNotBlank(leader.getVersion())) { RaftServer raftServer = RaftServerManager.getRaftServer(group); PeerId cureentPeerId = raftServer.getServerId(); - Node node = raftClusterMetadata.createNode(XID.getIpAddress(), XID.getPort(), cureentPeerId.getPort(), + Node node = raftClusterMetadata.createNode(cureentPeerId.getIp(), XID.getPort(), cureentPeerId.getPort(), Integer.parseInt( ((Environment)ObjectHolder.INSTANCE.getObject(OBJECT_KEY_SPRING_CONFIGURABLE_ENVIRONMENT)) .getProperty("server.port", String.valueOf(7091))),