獲取服務器真實ip
InetAddress.getLocalHost().getHostAddress():根據服務器名稱獲取服務器ip,在linux系統下***可能***存在問題
public static String getIp() {
try{
if (isWindowsOS()) {
logger.info("windows Ip --->{}", InetAddress.getLocalHost().getHostAddress());
return InetAddress.getLocalHost().getHostAddress();
} else {
logger.info("linux Ip --->{}", getLinuxLocalIp());
return getLinuxLocalIp();
}
}catch (Exception e){
logger.error("getIp error--->{}", e.getMessage());
return "127.0.0.1";
}
//注意:此處爲之前獲取ip的方式,
//InetAddress.getLocalHost()是根據服務器名稱來獲取ip,
//當服務器ect/hostname下未配置服務器ip對應的服務器名稱時,
//則本地windows系統開發可以,但在linux系統下找不到服務器ip.如ps 圖1
// String hostAddress ="";
// try {
// InetAddress address = InetAddress.getLocalHost();//獲取的是本地的IP地址
// hostAddress = address.getHostAddress();
// } catch (UnknownHostException e) {
// e.printStackTrace();
// }
// return hostAddress;
}
private static boolean isWindowsOS() {
boolean isWindowsOS = false;
String osName = System.getProperty("os.name");
if (osName.toLowerCase().indexOf("windows") > -1) {
isWindowsOS = true;
}
return isWindowsOS;
}
private static String getLinuxLocalIp() throws SocketException {
String ip = "";
try {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
NetworkInterface intf = en.nextElement();
String name = intf.getName();
if (!name.contains("docker") && !name.contains("lo")) {
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) {
String ipaddress = inetAddress.getHostAddress().toString();
if (!ipaddress.contains("::") && !ipaddress.contains("0:0:") && !ipaddress.contains("fe80")) {
ip = ipaddress;
System.out.println(ipaddress);
}
}
}
}
}
} catch (SocketException ex) {
logger.error("getLinuxLocalIp error--->{}", ex.getMessage());
ip = "127.0.0.1";
ex.printStackTrace();
}
logger.error("getLinuxLocalIp ip--->{}", ip);
return ip;
}
ps 圖1:linux系統中,etc/hostname下沒有配置服務器ip對應的服務名稱,則導致代碼中的問題
首先在運維層面講,這個配置是否應該去掉,我不太清楚,但是如果註釋掉,項目中持續出現問題
如下:
有更瞭解的同學,希望幫助解答疑惑