SpringCloud--構建高可用Eureka註冊中心

(如無特殊說明,本文中hostname特指eureka.instance.hostname,defaultZone特指eureka.client.serviceUrl.defaultZone)

先說一下我們採用的最終方案

spring:
  application:
    name: eureka
 
server:
  port: 8761
 
eureka:
  instance:
    hostname: ${spring.cloud.client.ipAddress}
    prefer-ip-address: true
  client:
    serviceUrl:
      defaultZone: http://127.0.0.1:8762/eureka/,http://localhost:8763/eureka/

實際使用中,只要把defaultZone裏的127.0.0.1 和 localhost換成相應的IP地址就可以。

打開Eureka監控http://127.0.0.1:8761/出現下圖說明配置正確。
在這裏插入圖片描述

說幾點原因:

  1. 許多高可用的Eureka配置裏都要設置hosts文件,它是必須的嗎?

不是必須的,配置hosts文件的目的是使各個Eureka的eureka.instance.hostname不同。

Eureka互相註冊要求各個Eureka實例的eureka.instance.hostname不同,如果相同,則會被Eureka標記爲unavailable-replicas。我們最終把eureka.instance.hostname取了${spring.cloud.client.ipAddress}的值,這個值取的是當前啓動Eureka的機器的IP,這樣雖然配置一樣但卻自動區分了每臺機器的Eureka,這時我們再取prefer-ip-address: true,就可以確保機器優先使用IP而不是到hosts解析域名。

2.prefer-ip-address是做什麼用的?

直觀來說,如果點擊下面註冊中心的可用實例列表中的地址,訪問結果會分以下幾個情況:
在這裏插入圖片描述

1)hostname和prefer-ip-address都沒有配置,則訪問 主機名:服務名:端口號,

     如:http://desktop-1fkok7b:8761/info

2)配置了hostname而沒有配置prefer-ip-address,則訪問 hostname:服務名:端口號,

     如:http://myhostname:8761/info

3) 一旦配置了prefer-ip-address,則訪問 ipAddress:服務名:端口號,

     如:http://172.20.10.3:8761/info

 在最終方案裏我們已經把hostname設置爲當前機器IP(${spring.cloud.client.ipAddress}),可以想見prefer-ip-address並不是必須的,但是合理使用它可以避免因爲訪問主機名而請求不到服務的情況,當然或許還節約了地址解析的損耗(雖然比較小)。
  1. 爲什麼把hostname設置爲當前機器IP?

(這一段的前提是微服務規模在幾十個以內)當然也可以設置爲域名,但是你要配置hosts(如果配置到所有Docker鏡像中顯然龐大不夠靈活),或者搭建內網DNS服務器(爲高可用增加了一層負擔),而隨着統一配置中心的到來,或許直接使用IP倒是一個相當不錯的選擇。另外,如果你配置了hostname,那麼其它服務註冊到你的時候,其它服務的defaultZone要填寫defaultZone: http://yourhostname:8761/eureka/ 以確保沒有問題,但如果你的hostname配置的就是IP,那其它服務的defaultZone裏直接填寫IP就可以,如defaultZone:http://172.20.10.3:8761/eureka/ 。

  1. 上面說的都是在不同機器上啓動Eureka,能在同一臺機器上啓動多個Eureka嗎?

當然可以,但是一定要保證各個Eureka的hostname不同,一種辦法是常用的配置hosts文件,還有一種,是使用當前機器IP、127.0.0.1和localhost分別作爲三個Eureka的hostname,事實證明也是可以的,在文末的Github的項目的no_hosts分支裏有相應的實現。但是如果你使用127.0.0.1或localhost,注意一定要設置prefer-ip-address: false 。

  1. 我在同一臺機器上配置hosts,啓動三個Eureka實例並設置prefer-ip-address: true,爲什麼顯示unavailable-replicas?
    在這裏插入圖片描述

一種原因是,你設置了prefer-ip-address: true,其它服務註冊你時應該使用defaultZone:http://yourIP:8761/eureka/,圖中使用的仍然是hostname名,導致錯誤發生。

另一種原因是,三個Eureka都設置了prefer-ip-address: true,導致最後解析出來的hostname都是相同的IP,使副本不可用。這也是4中爲什麼要設置prefer-ip-address: false的原因。
————————————————
版權聲明:本文爲CSDN博主「wangfei0904306」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/wangfei0904306/article/details/79056083

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章