最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Eureka注冊不上或注冊后IP不對(多網(wǎng)卡的坑及解決)

 更新時(shí)間:2023年11月20日 09:08:05   作者:樓蘭過客  
這篇文章主要介紹了Eureka注冊不上或注冊后IP不對(多網(wǎng)卡的坑及解決),具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一、問題發(fā)現(xiàn)

使用SpringCloud一套的微服務(wù)項(xiàng)目在開發(fā)測試環(huán)境都再正常不過了,到生產(chǎn)部署的時(shí)候啟動服務(wù)就死活無法啟動,去看啟動日志發(fā)現(xiàn),在獲取配置中心配置時(shí)連接不到配置中心了,報(bào)了一個(gè)Host Unreachable的錯(cuò)。


 

按道理來說這個(gè)錯(cuò)很簡單,就是網(wǎng)絡(luò)不通導(dǎo)致的。

但是問題就出現(xiàn)在這兒,我直接ping注冊中心和配置中心的IP是通的,沒有問題。

再仔細(xì)一看才發(fā)現(xiàn)事情并不簡單,我們生產(chǎn)環(huán)境開放的是一套10.21.xx.xx的網(wǎng)段IP,但是日志中卻去尋找29.192.xx.xx去了,打開eureka控制臺發(fā)現(xiàn)注冊到注冊中心上的配置中心確實(shí)是29.192.xx.xx,并且注冊中心顯示的自己的IP也是29.192.xx.xx。

配置中心啟動沒問題是因?yàn)樗妥灾行脑谝慌_機(jī)器上,所以用什么樣的ip都無關(guān)緊要,其他服務(wù)想要拉取配置中心所在機(jī)器的配置就拉不到了。

問題是我們其他服務(wù)在配置eureka client的時(shí)候填寫的eureka server地址確實(shí)都是10.21.xx.xx,為什么注冊中心會自動改成29.192.xx.xx。

咨詢了客戶方之后才知道,29.192.xx.xx這個(gè)IP是用來監(jiān)控服務(wù)器用的,各服務(wù)器之間都通過這個(gè)IP發(fā)送心跳來保持在線狀態(tài),不能做業(yè)務(wù)使用。

二、撥云見日

知道這個(gè)IP從哪兒來下一步就要分析解決了,先查看網(wǎng)絡(luò)配置

確實(shí)從網(wǎng)卡配置順序上來說eureka client選取了第一塊網(wǎng)卡配置的IP向注冊中心注冊,這就導(dǎo)致了無法連接的問題。

那么問題就指向了eureka client是如何選取網(wǎng)卡IP進(jìn)行注冊的以及如何能讓eureka client根據(jù)我們的意愿選擇我們想要的IP進(jìn)行注冊。

去官網(wǎng)查找并沒有找到關(guān)于eureka client是如何選取網(wǎng)卡IP的描述,那么就只能去扒源碼了。

最終找到是在com.netflix.appinfo包下的InstanceInfo類封裝了本機(jī)信息,其中就包括了IP地址的獲取方法。

在 Spring Cloud 環(huán)境下,Eureka Client并沒有自己實(shí)現(xiàn)探測本機(jī)IP的邏輯,而是交給Spring的InetUtils工具類的findFirstNonLoopbackAddress()方法完成的,下邊貼出這個(gè)方法的源碼:

public InetAddress findFirstNonLoopbackAddress() {
  InetAddress result = null;
  try {
    int lowest = Integer.MAX_VALUE;
    for (Enumeration<NetworkInterface> 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<InetAddress> addrs = ifc
               .getInetAddresses(); addrs.hasMoreElements();) {
            InetAddress address = addrs.nextElement();
            if (address instanceof Inet4Address
                && !address.isLoopbackAddress()
                && isPreferredAddress(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();
  }
  catch (UnknownHostException e) {
    log.warn("Unable to retrieve localhost");
  }
  return null;
}

這個(gè)方法中通過NetworkInterface接口獲取到網(wǎng)卡的列表信息進(jìn)行循環(huán)獲取,首先判斷是否啟用(如果網(wǎng)卡禁用再獲取IP自然就沒意義),在啟用狀態(tài)下拿到網(wǎng)卡的索引值(目的是為了獲取網(wǎng)卡的最小索引值),最后還要判斷是否在忽略列表中,如果不在忽略列表才能選用。在這一系列的操作過后如果沒能獲取到最終結(jié)果,那么最后就會調(diào)用jdk的getLocalHost()方法來獲取IP地址并返回。

總體來說,這個(gè)工具類會獲取所有網(wǎng)卡,依次進(jìn)行遍歷,取ip地址合理、索引值最小、已經(jīng)啟動且不在忽略列表的網(wǎng)卡的ip地址作為結(jié)果。如果仍然沒有找到合適的IP, 那么就將InetAddress.getLocalHost()做為最后的fallback方案。

三、開刀治病

? 有了源碼的加持,想要達(dá)到我們最終獲取指定IP的目的就條條大路通羅馬了。

1、忽略指定網(wǎng)卡

? 在bootstrap.yml中添加忽略屬性

spring.cloud.inetutils.gnored-interfaces[0]=ens161 # 忽略ens161, 支持正則表達(dá)式 

注意,不能在application.yml中添加,玩過SpringCloud的應(yīng)該都懂。

2、禁用無關(guān)網(wǎng)卡

? 如上面網(wǎng)卡信息圖即禁用掉ens161和ens256,最終只保留ens224網(wǎng)卡生效,這樣一來獲取到啟用的網(wǎng)卡也就只有一塊了。

查看網(wǎng)卡信息(生產(chǎn)環(huán)境最終沒敢禁用,以下拿我本地環(huán)境測試)

[melonrind@melonrind ~]$ ifconfig
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255
        inet6 fe80::9ee2:1871:6417:19a9  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:75:08:94  txqueuelen 1000  (Ethernet)
        RX packets 44098  bytes 59104330 (56.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 21246  bytes 1370966 (1.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp0s8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.56.200  netmask 255.255.255.0  broadcast 192.168.56.255
        inet6 fe80::1c58:28df:b483:fb7a  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:f3:69:ec  txqueuelen 1000  (Ethernet)
        RX packets 333237  bytes 148991996 (142.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 396257  bytes 138439800 (132.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 224153  bytes 56176690 (53.5 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 224153  bytes 56176690 (53.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[melonrind@melonrind ~]$ nmcli con sh
NAME    UUID                                  TYPE      DEVICE
enp0s3  e0a2f8ed-112e-41ed-9f35-89502e325c18  ethernet  enp0s3
enp0s8  221018b1-6e99-48fc-8c3d-fe7dee581328  ethernet  enp0s8
 

這里就可以禁用掉enp0s3網(wǎng)卡,保留enp0s8

[root@melonrind ~]# ifdown enp0s3
Device 'enp0s3' successfully disconnected.

啟用可以用如下命令

[root@melonrind ~]# ifup enp0s3

3、配置host

? 當(dāng)網(wǎng)查遍歷邏輯都沒有找到合適ip時(shí)會走JDK的InetAddress.getLocalHost()。該方法會返回當(dāng)前主機(jī)的hostname, 然后會根據(jù)hostname解析出對應(yīng)的ip。

因此如果確認(rèn)沒有找到合適的IP的情況下,可以配置本機(jī)的hostname和/etc/hosts文件,直接將本機(jī)的主機(jī)名映射到指定IP地址。

4、手工指定實(shí)例IP

eureka client在啟動時(shí)可以對該eureka client的實(shí)例進(jìn)行配置,因此這里也可以自己指定IP地址。

可以添加如下配置:

# 指定此實(shí)例的ip
eureka.instance.ip-address=${你指定的ip地址}
# 注冊時(shí)使用ip而不是主機(jī)名
eureka.instance.prefer-ip-address=true

不過該配置需要添加在eureka client配置之上,形如:

eureka:
  instance:
    ip-address: 192.168.56.1
    prefer-ip-address: true
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://192.168.56.1:9130/eureka
    registry-fetch-interval-seconds: 30
    eureka-server-connect-timeout-seconds: 5
    eureka-server-read-timeout-seconds: 5
    filter-only-up-instances:  true
    eureka-connection-idle-timeout-seconds: 30
    eureka-server-total-connections: 200
    eureka-server-total-connections-per-host: 50

5、服務(wù)啟動時(shí)指定IP

在不方便修改配置文件時(shí)可以選用此方式(我就是用此方式解決),在服務(wù)啟動時(shí)添加參數(shù):

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

總結(jié)

至此,該問題得到解決,又是驚心動魄的一天。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

平顺县| 霍山县| 黑河市| 宕昌县| 双流县| 汉源县| 三亚市| 梁平县| 名山县| 天峨县| 新化县| 吉安县| 凌海市| 历史| 白朗县| 稻城县| 璧山县| 湖南省| 尚志市| 新竹县| 达州市| 盈江县| 吉木乃县| 新密市| 固镇县| 长子县| 通山县| 甘泉县| 绥中县| 南皮县| 南充市| 铜川市| 濮阳县| 襄城县| 土默特右旗| 乐都县| 罗甸县| 建瓯市| 绥德县| 孝义市| 县级市|