Eureka客户端注册多网卡下IP选择问题

1.注册服务到eureka,并添加动态路由信息进行访问。
爆ip访问异常
经排查是ip地址不对 使用的是虚拟机ip vmvare net1

解决办法:
在 bootstrap.yml 中添加如下配置:

spring:
  cloud:
    inetutils:
      ignored-interfaces: ['VMware.*']
      use-only-site-local-interfaces: true

注:一定是添加到 bootstrap.yml 中,而不是添加到 application.yml 中,原因如下:

因为 InetUtils 获取ip的方法 findFirstNonLoopbackHostInfo() 会被调用多次,最先的调用是在 HostInfoEnvironmentPostProcessor, 而这个类执行的时候还没加载 application.yml, 因此配置并不生效。而 bootstrap.yml 是在SpringBoot启动前就加载的。

2.本机启动了Eureka注册中心,其他人机器需要将服务注册到我本机的Eureka。(服务端和客户端在不同机器上)

  这时出现了一个问题:服务成功注册到Eureka,但是该服务接口无法访问。

  查看日志:gateway下的日志显示服务找不到。

  查找问题:尝试telnet该服务的IP地址,发现网络不通。为了确认IP地址无误,找到那台机器,发现机器上还启动了虚拟机,存在多个网卡。服务启动在PC本地,注册时将虚拟机的IP注册到了Eureka,所以无法访问。

有以下几种方案:

一、忽略指定网卡

  在Eureka客户端加上配置:

spring:
  cloud:
    inetutils:
      # 忽略指定网卡,支持正则表达式(这里使用正则表达式忽略所有虚拟机网卡)
      ignoredInterfaces: ['VMware.*']

eureka:
  instance:
    #注册时使用ip而不是主机名
    prefer-ip-address: true

二、客户端指定IP

指定IP有三种方式:

在Eureka客户端加上配置:

eureka:
  instance:
    #注册时使用ip而不是主机名
    prefer-ip-address: true
    # 指定此客户端的ip
    ip-address: 127.0.0.1

spring:
  cloud:
    inetutils:
      # 指定此客户端的ip
      default-ip-address: 127.0.0.1
eureka:
  instance:
    #注册时使用ip而不是主机名
    prefer-ip-address: true

这些配置的目的就一个,使客户端注册时使用真实有效的IP。需要通过一些配置,使它注册时使用我们理想的IP,这跟Eureka Client探测本机IP的逻辑有关。查找资料,Eureka Client探测本机IP的实现是调用了Spring的InetUtils工具类的findFirstNonLoopbackAddress()方法。该方法会获取所有网卡,取ip地址合理、索引值最小且不在忽略列表的网卡的IP地址作为结果。如果没有找到合适的IP, 就调用InetAddress.getLocalHost()方法。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值