千家信息网

基于多网卡环境下Eureka服务注册IP怎么选择

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容介绍了"基于多网卡环境下Eureka服务注册IP怎么选择"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够
千家信息网最后更新 2026年11月03日基于多网卡环境下Eureka服务注册IP怎么选择

本篇内容介绍了"基于多网卡环境下Eureka服务注册IP怎么选择"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

多网卡环境下Eureka服务注册IP选择

问题场景

服务器上分别配置了eth0和eth2两块网卡,只有eth2的地址可供其它机器访问,在这种情况下,服务注册时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 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 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方案。

解决方案

A.忽略指定网卡

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

因通过配置application.properties让应用忽略无效的网卡。

B.配置host

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

C.手工指定IP

# 指定此实例的ipeureka.instance.ip-address=# 注册时使用ip而不是主机名eureka.instance.prefer-ip-address=true

D.启动时指定IP

java -jar -Dspring.cloud.inetutils.preferred-networks=192.168.20.123

E.禁用eth0

查看网卡的连接信息

[root@localhost ~]# nmcli con shNAME         UUID                                  TYPE            DEVICE System eth0  5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03  802-3-ethernet  eth0

禁用eth0

[root@localhost ~]# ifdown eth0Device 'eth0' successfully disconnected.

启用eth0

[root@localhost ~]# ifup eth0

在Eureka中使用IP注册服务

在将微服务放入docker部署在多个云服务器上的时候,发现eureka里显示的是机器名,然后弄了个spring boot admin监控平台,发现它就找不到各个微服务对应的主机了。

在网上查得eureka.instance.prefer-ip-address=true,使用这条配置eureka里显示的就是ip地址了,但是依然不够的,在监控平台里面还是连接不上。

还需要配置instance-和hostname才能使客户端访问到实例

效果应该是这样,点击ip后能访问到相应内容

eureka服务端配置

server.port=8666spring.application.name=eureka-server#服务注册中心实例的主机名eureka.instance.hostname=xxx.xxx.xxx.67#留存的服务示例低于多少比例进入保护模式eureka.server.renewal-percent-threshold=0.5#是否开启保护模式eureka.server.enable-self-preservation=true#是否向服务注册中心注册自己eureka.client.register-with-eureka=false#是否启用获取服务注册信息,因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,故而设为falseeureka.client.fetch-registry=false#注册和查询都需要依赖该地址,多个以逗号分隔eureka.client.serviceUrl.defaultZone=http://admin:password@xxx.xxx.xxx.67:8666/eureka/#使用ip替代实例名eureka.instance.prefer-ip-address=true#设置实例的ID为ip:porteureka.instance.instance-id=xxx.xxx.xxx.67:${server.port}#这里使用spring security对注册中心做一个基础的用户名密码登录security.basic.enabled=truesecurity.user.name=adminsecurity.user.password=password

注意到:

eureka.instance.hostname=xxx.xxx.xxx.67eureka.instance.instance-id=xxx.xxx.xxx.67:${server.port}

这里我直接手工指定了ip,而不是通过${spring.cloud.client.ipAddress}来获取本机的ip,因为使用docker后,发现获取的ip是docker0这张网卡上分配的ip,以172.16.xxx.xxx开头的ip,要使docker绑定外网ip网上也有很多资料,这里先简化操作,就直接手工指定ip了哈。。

客户端配置

eureka.client.service-url.defaultZone=http://admin:password@xxx.xxx.xxx.67:8666/eureka/eureka.instance.lease-renewal-interval-in-seconds=5eureka.instance.lease-expiration-duration-in-seconds=10eureka.client.healthcheck.enable=trueeureka.instance.hostname=xxx.xxx.xxx.67#设置实例的ID为ip:porteureka.instance.instance-id=xxx.xxx.xxx.67:${server.port}

注意客户端也要写上eureka.instance.instance-id和eureka.instance.hostname

这样在eureka上就显示的是ip地址了

要使spring boot admin正常工作,还需在spring boot admin上配置

admin服务端配置

spring.application.name=admin-monitorserver.port=7001#为了安全,以后可以把管理端口设置一下#management.port=7002#现在测试环境就关闭了身份认证,真实环境还是需要它的management.security.enabled=false

客户端配置

#关闭身份认证,以免发生401错误management.security.enabled=false#admin监控配置,连接到服务端spring.boot.admin.url=http://xxx.xxx.xxx.96:7001#在spring boot admin里以ip的形式注册显示spring.boot.admin.client.prefer-ip=true

这里比较关键的一步就是在客户端里配置spring.boot.admin.client.prefer-ip=true,这样spring boot admin就能通过ip来访问各个微服务端点,然后收集它们的信息,从而来监控各个微服务了

"基于多网卡环境下Eureka服务注册IP怎么选择"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

服务 网卡 配置 地址 环境 实例 本机 主机 客户 客户端 选择 信息 逻辑 监控 合适 内容 就是 手工 方案 索引 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 湖北九亚互联网络科技有限公司 互联网的科技 科技平台互联网 A股互联网金融科技公司 互联网科技财经 工业互联网科技新基建 中资互联网科技 百单互联网科技有限公司 天津摩尔互联网科技 互联网金融 科技创新 天速互联网络科技有限公司 创业天下互联网科技有限公司 广州恒生互联网科技有限 宁夏众和广鑫互联网科技有限公司 武汉健翔互联网络科技有限公司 电子科技大学互联网创业大赛 伍佰万互联网科技怎么赚钱 银川新华互联网科技学校是国营吗 保山互联网科技靠谱吗 马化腾互联网科技教学 华服互联网科技靠谱吗 互联网佳科技有限公司 互联网科技排名 掌上梦互联网科技 南山科技园互联网公司有哪些 河南猎农互联网科技有限公司 坤平互联网科技 互联网金融科技名词解释 南京一网一红互联网科技有限公司 江苏互联网智能科技产品出厂价
0