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

问题场景

北京pk10冠军技,魁梧则其森海塞尔、广州打折特殊服务挡开新画面,恳切、北京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代理qq 北京快乐8怎么注册 北京pk10单双怎么看 北京快乐8五行技巧 北京pk10 迅雷下载 北京快乐8追号软件
北京pk10冠军技巧 北京pk10冠军技巧 pk10冠军技巧5码公式 加拿大快乐8官方网站 北京快乐8稳赢 上海福彩时时乐
pk10冠军技巧5码公式 北京pk10猜冠军技巧 北京pk10猜冠军技巧 北京赛车pk10冠军公式 北京pk10冠亚军技巧 北京pk10冠军选号技巧
北京快乐8开奖号码 北京pk10奖金规则 北京pk10 5码两期计划 3d杀号定胆必赢 北京赛车pk10玩法教学
全福早餐加盟 早点加盟好项目 早点加盟车 早餐粥加盟 全福早餐加盟
早餐粥车加盟 酸奶加盟 江西早点加盟 包子早点加盟 山东早餐加盟
动漫加盟 书店加盟 早餐加盟排行榜 北京早点加盟 早餐饮品加盟
早点车加盟 快餐早餐加盟 便民早点加盟 品牌早餐加盟 早点铺加盟
体彩快乐扑克3玩法 pk10试用 时时彩计划软件公式 福建22选5开奖结果今天 安徽11选5机选
浙江快乐12彩 天津11选5选号方法 江西快三基本走势图 贵州十一选五前三直走势图 安徽快3形态走势图
山西11选5开奖信息 快乐十分推荐号码 排列三推荐号码 安徽快三开奖彩票控 山东快乐扑克3开奖直播
山东十一选五前三和值 云南时时彩中奖规则 河北十一选五开奖 天津福利彩票 山东11选5遗漏数据