spring cloud配置高可用eureka時遇到的一些坑


  考慮到注冊中心的高可用,今天搭建一下eureka集群,並在中途遇到一些小的坑,前前后后花了兩個小時來排除,在這里記錄一下,以供后面查看。

  首先,貼上要達到的效果:

  一、起兩個eureka模擬集群,在DS Replicas中顯示集群中的其他成員。

  二、在注冊服務列表中正確顯示我們注冊了兩個注冊中心。

  三、available-replicas中正確顯示集群中的其他注冊中心。

  

  

 

  1、用IP而非主機名配置注冊服務。

  最開始,我並不想使用主機名來注冊服務中心,我想直接使用IP,然后在服務的status一欄顯示ip和端口信息,而不是顯示電腦用戶名。這一欄的顯示由參數eureka.instance.instance-id控制。我按照之前的做法將這個屬性設置為

  ${spring.cloud.client.ipAddress}:${server.port}

  但在啟動服務后發現status中描述變成了“${spring.cloud.client.ipAddress}:8762”,${spring.cloud.client.ipAddress}屬性並沒有讀取到,經過查閱發現在Finchley版本中,這個變量改名為了spring.cloud.client.ip-address。配置之后,成功顯示了ip:port的形式。

  但在后續的配置中,無論如何配置其他選項,上面提到要達到的目標中的第一點和第三點都無法正常完成,所以只能放棄用IP配置的想法,后續有時間仔細學習源碼的時候再來看這一點吧。就修改hosts將IP映射為主機名eureka1和eureka2。

  2、第二個發生的問題是,available-replicas不正常顯示。(已經是采用的服務主機名的形式注冊了,非IP形式)

  這個問題出在eureka.instance.appname這個參數,集群每個副本的這個屬性必須一樣。我在網上看到有的文章講的是application配置文件中的spring.application.name屬性要一樣,這個說法應該是不完全正確的。當用戶未配置appname時,spring cloud會優先使用spring.application.name來覆蓋此值,所以造成了這個誤解。

  后面我也做了實驗,當兩個副本spring.application.name不同,但appname相同時,也會被識別為可用的並正常顯示。此種情況下eureka也會將這兩個不同spring.application.name的服務識別為同一個服務的不同副本,而不會根據spring.application.name將其視為不同服務。

  接下來的這一點,也是available-replicas正常顯示的條件之一。

  3、為實現高可用,注冊中心必須注冊自己。

  即eureka.client.registerWithEureka和eureka.client.fetchRegistry兩個屬性,不能設置為false。這兩個屬性默認為true,只要不手動設置為false,服務就會想注冊中心注冊自己。

  所有的服務注冊時,eureka.client.serviceUrl.defaultZone必須指向所有的注冊中心,不然部署高可用的中心就沒有意義了。當注冊中心注冊自己的時候,這個屬性可以不包含自身的地址。

  另外需要注意的是,第一個注冊中心啟動的時候,會拋出一個錯誤:

  com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server

  這是因為它在試圖向指定的注冊中心注冊自己的時候,目標中心還沒有啟動。這個錯誤無傷大雅,因為eureka的注冊是有心跳的,等目標中心啟動之后,這個服務會在下一次心跳的時候自動注冊進去。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM