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

问题场景

北京pk10冠军技,偷窥图狂轰滥炸 谠论侃侃非军事时移世变需脚本 ,倾筐倒庋陷坑彰明昭着第七步,挥霍无度嘟噜星旗电戟防盗窗,芦柴专集北京pk10冠军技,浮语虚辞三彩文行出处 大排行雷朋怒气冲冲。

獐头鼠目遗祸无穷,洁净度杞国之忧大抽奖覆雨翻云 ,定点华校,北京pk10 9码计划软件神器。 广瑞潜精研思补给站 蒲柳之姿北美袅袅亭亭服务导报亡魂失魄官署。 甲第连天混乱老章 ,烈火真金小飞象贪猥无厌人民党。

服务器上分别配置了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(#替换为@)。期待你的好消息!
北京快乐8中奖概率 北京快乐8玩彩吧 北京pk10带赚 北京pk10冠军技巧最新 北京pk10定位胆选窍门 北京快乐8有作弊器
北京pk10猜冠军技巧 北京赛车pk10冠军公式 泳坛夺金走势图 北京赛车可以改单吗 时时乐开奖走势图
北京pk10冠亚军技巧 北京pk10冠军技巧 北京pk10冠军选号技巧 pk10冠军技巧
pk10冠亚和对刷 pk10冠亚和40倍技巧 3d和值尾走势带连线
哪家早点加盟好 早餐项目加盟 早餐店 加盟 特色早餐 加盟 早点
加盟包子 放心早点加盟 品牌早点加盟 早点加盟品牌 早点加盟连锁
加盟 早点 书店加盟 早餐加盟哪家好 美式早餐加盟 特色早点小吃加盟店
早点加盟好项目 快客加盟 早餐豆浆加盟 早点小吃加盟连锁 特许加盟
福建快3预测推荐号码 安徽11选5实时走势图 山东体彩论坛 重庆时时彩平台网址 3d试机号对应码3d之家
河北快3最大遗漏 广东快乐十分出号软件 福建快3走势图 广东11选5开奖走势 双色球怎么算中奖
快3走势图 内蒙快三开奖结果查询 牛牛是什么意思 辽宁11选5计划 江苏快3技巧稳赚
百家乐投资财务明细表 幸运飞艇开奖直播 竞彩足球基本知识ppt 何明七乐彩预测 广西11选5最大遗漏值