Eureka客戶端註冊多網絡卡下IP選擇問題
阿新 • • 發佈:2019-01-09
在使用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: # 指定此客戶端的ipdefault-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()方法。