xuxueli / xxl-rpc

A high performance, distributed RPC framework.(分布式服务框架XXL-RPC)
http://www.xuxueli.com/xxl-rpc/
Apache License 2.0
620 stars 404 forks source link

遍历网卡获取IP时,优先获取本地站点IP或第一个可用IP #6

Closed CecilJxSu closed 5 years ago

CecilJxSu commented 5 years ago

前一次的逻辑是:getLocalHost()先获取本地站点IP,其次遍历网卡和IP优先获取第一个合法的IP; 目前的逻辑是:遍历网卡和IP优先获取第一个合法的IP,其次getLocalHost()获取本地站点IP;

我的修改:直接在遍历网卡和IP中,优先获取isSiteLocalAddress()本地站点IP,其次再是第一个合法的IP。 以及修改getAddress()方法中可能会导致NPE问题。

这次修改的原因是,在kubernetes和docker环境中运行时,调用InetAddress.getLocalHost()方法会报以下错误:

2018-10-19 10:12:16.901 [Thread-5] [ERROR] IpUtil - Failed to retriving ip address, dockerd: dockerd: Name or service not known
java.net.UnknownHostException: dockerd: dockerd: Name or service not known
at java.net.InetAddress.getLocalHost(InetAddress.java:1505)
at com.xxl.job.core.util.IpUtil.getFirstValidAddress(IpUtil.java:47)
at com.xxl.job.core.util.IpUtil.getAddress(IpUtil.java:92)
at com.xxl.job.core.util.IpUtil.getIp(IpUtil.java:102)
at com.xxl.job.core.util.IpUtil.getIpPort(IpUtil.java:115)
at com.xxl.job.core.thread.ExecutorRegistryThread.start(ExecutorRegistryThread.java:44)
at com.xxl.job.core.rpc.netcom.jetty.server.JettyServer$1.run(JettyServer.java:50)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.net.UnknownHostException: dockerd: Name or service not known
at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:928)
at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1323)
at java.net.InetAddress.getLocalHost(InetAddress.java:1500)
... 7 common frames omitted

kubernetes有自己的dns,所以localhost就不一定能获取得到了;而且,在遍历网卡中也包含本地站点IP,因此直接在遍历网卡中获取,就不再一次调用InetAddress.getLocalHost()获取了。

xuxueli commented 5 years ago

你好,master分支IP获取逻辑已经优化,兼容对 Inet6Address 的支持,可以pull master代码体验下有没有修复你的问题。