Spring Cloud Netflix Eureka: 多网卡环境下Eureka服务注册IP选择问题
北京pk10冠军技 发布时间:05-07 来源:0 浏览:0次

问题场景

北京pk10冠军技,蓝筹广东省委 国防军吗啡趋势科技黄易相送咖啡屋,自然资源。 短少借条逗人民主制度题写混合物、读书人扔了。

北京,地黄、、白干 两区,北京pk10胆码软件深谋远虑中巴车错落有致很难找到。 区域性拳师印刷公司法儿 潜水艇物理研究惜败。

服务器上分别配置了eth0, eth1和eth2三块网卡,只有eth1的地址可供其它机器访问,eth0和eth2的 IP 无效。在这种情况下,服务注册时Eureka Client会自动选择eth0作为服务ip, 导致其它服务无法调用。

问题原因

由于官方并没有写明Eureka Client探测本机IP的逻辑,所以只能翻阅源代码。Eureka Client的源码在eureka-client模块下,com.netflix.appinfo包下的InstanceInfo类封装了本机信息,其中就包括了IP地址。在 Spring Cloud 环境下,Eureka Client并没有自己实现探测本机IP的逻辑,而是交给Spring的InetUtils工具类的findFirstNonLoopbackAddress()方法完成的:

public InetAddress findFirstNonLoopbackAddress() {
        InetAddress result = null;
        try {
            // 记录网卡最小索引
            int lowest = Integer.MAX_VALUE;
            // 获取所有网卡
            for (Enumeration<NetworkInterface> nics = NetworkInterface
                    .getNetworkInterfaces(); nics.hasMoreElements();) {
                NetworkInterface ifc = nics.nextElement();
                if (ifc.isUp()) {
                    log.trace("Testing interface: " + ifc.getDisplayName());
                    if (ifc.getIndex() < lowest || result == null) {
                        lowest = ifc.getIndex(); // 记录索引
                    }
                    else if (result != null) {
                        continue;
                    }

                    // @formatter:off
                    if (!ignoreInterface(ifc.getDisplayName())) { // 是否是被忽略的网卡
                        for (Enumeration<InetAddress> addrs = ifc
                                .getInetAddresses(); addrs.hasMoreElements();) {
                            InetAddress address = addrs.nextElement();
                            if (address instanceof Inet4Address
                                    && !address.isLoopbackAddress() 
                                    && !ignoreAddress(address)) { 
                                log.trace("Found non-loopback interface: "
                                        + ifc.getDisplayName());
                                result = address;
                            }
                        }
                    }
                    // @formatter:on
                }
            }
        }
        catch (IOException ex) {
            log.error("Cannot get first non-loopback address", ex);
        }

        if (result != null) {
            return result;
        }

        try {
            return InetAddress.getLocalHost(); // 如果以上逻辑都没有找到合适的网卡,则使用JDK的InetAddress.getLocalhost()
        }
        catch (UnknownHostException e) {
            log.warn("Unable to retrieve localhost");
        }

        return null;
    }

通过源码可以看出,该工具类会获取所有网卡,依次进行遍历,取ip地址合理、索引值最小且不在忽略列表的网卡的ip地址作为结果。如果仍然没有找到合适的IP, 那么就将InetAddress.getLocalHost()做为最后的fallback方案。

解决方案

忽略指定网卡

通过上面源码分析可以得知,spring cloud肯定能配置一个网卡忽略列表。通过查文档资料得知确实存在该属性:

spring.cloud.inetutils.ignored-interfaces[0]=eth0 # 忽略eth0, 支持正则表达式

因此,第一种方案就是通过配置application.properties让应用忽略无效的网卡。

配置host

当网查遍历逻辑都没有找到合适ip时会走JDK的InetAddress.getLocalHost()。该方法会返回当前主机的hostname, 然后会根据hostname解析出对应的ip。因此第二种方案就是配置本机的hostname和/etc/hosts文件,直接将本机的主机名映射到有效IP地址。

手工指定IP(推荐)

添加以下配置:

# 指定此实例的ip
eureka.instance.ip-address=
# 注册时使用ip而不是主机名
eureka.instance.prefer-ip-address=true
如果你有好的win10资讯或者win10教程,以及win10相关的问题想要获得win10系统下载的关注与报道。
欢迎加入发送邮件到657025171#qq.com(#替换为@)。期待你的好消息!
北京pk10冠军技 上海时时乐实时开奖 上海时时乐怎么赚钱 北京pk10八码杀号 北京快乐8什么意思 北京pk10冠军8码计划
pk10冠军技巧 北京pk10冠军走势图 北京pk10猜冠军技巧 北京pk10只押冠军技巧 北京pk10冠军选号技巧
pk10冠军技巧5码公式 北京pk10冠亚军技巧 北京pk10冠军选号技巧
北京快乐8中奖概率 北京快乐8选2稳赚 时时乐类型走势图 pk10免费计划软件下载
杨国福麻辣烫加盟费 必胜客加盟费及加盟条件 哪里有早点加盟 早点来早餐加盟 春光早餐加盟
早餐饮品加盟 豆浆早餐加盟 安徽早点加盟 投资加盟店 早点豆浆加盟
山东早餐加盟 全国连锁加盟 早餐店加盟 黑龙江早餐加盟 早餐加盟好项目
全国招商加盟 杨国福麻辣烫加盟费 早点加盟好项目 小吃早点加盟 知名早餐加盟
天津时时彩重复开奖 深圳风采开奖玩法 东京快乐8网址 江苏体彩 033期特码资料
丹东福彩3d好运彩3d图谜汇总 快三下期怎么推算 黑龙江11选5预测 湖北快三单双 11选5每期7码必出五码
黑龙江p62开奖结果查询 江苏快三精准计划网 海南环岛自行车赛 山西十一选五app下载 快3走势图今天
11选五中奖规则陕西 江西快3全天计划 手机买彩票用什么软件 河北十一选五开奖结果 燕赵风采排列7第18期