问题场景
服务器上分别配置了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()
方法完成的。
解决方案
通过上面源码分析可以得知,spring cloud肯定能配置一个网卡忽略列表。通过查文档资料得知确实存在该属性:
因此,第一种方案就是通过配置application.properties
让应用忽略无效的网卡。
配置host
当网查遍历逻辑都没有找到合适ip时会走JDK的InetAddress.getLocalHost()
。该方法会返回当前主机的hostname, 然后会根据hostname解析出对应的ip。因此第二种方案就是配置本机的hostname和/etc/hosts
文件,直接将本机的主机名映射到有效IP地址。
手工指定IP(推荐)
添加以下配置:
eureka:instance:
hostname: 192.168.100.201
# 指定此实例的ip
ip-address: 192.168.100.201
# 注册时使用ip而不是主机名
prefer-ip-address: true