1. 程式人生 > >Eureka客戶端註冊多網絡卡下IP選擇問題

Eureka客戶端註冊多網絡卡下IP選擇問題

  在使用Spring Cloud多人協作開發時有一個場景:我本機啟動了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(未測試)
java -jar -Dspring.cloud.inetutils.preferred-networks=127.0.0.1

 

三、配置hosts檔案

  配置本機的主機名,然後再/etc/hosts檔案中將本機的主機名對映到指定有效的IP地址。

 

四、使用本地網絡卡

  這個方法在我測試的時候的無效的,但是看到很多文章有寫,不知道是不是我哪裡配置還有問題,所以在這裡也列出來

  在Eureka客戶端加上配置:

spring:
  cloud:
    inetutils:
      # 是否啟用本地迴環網絡卡
      use-only-site-local-interfaces: true

eureka:
  instance:
    #註冊時使用ip而不是主機名
    prefer-ip-address: true

 

  總結

  這些配置的目的就一個,使客戶端註冊時使用真實有效的IP。需要通過一些配置,使它註冊時使用我們理想的IP,這跟Eureka Client探測本機IP的邏輯有關。查詢資料,Eureka Client探測本機IP的實現是呼叫了Spring的InetUtils工具類的findFirstNonLoopbackAddress()方法。該方法會獲取所有網絡卡,取ip地址合理、索引值最小且不在忽略列表的網絡卡的IP地址作為結果。如果沒有找到合適的IP, 就呼叫InetAddress.getLocalHost()方法。