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

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

先說一下我們採用的

最終方案


<code>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/
/<code>

實際使用中,只要把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是做什麼用的?

直觀來說,如果點擊下面註冊中心的可用實例列表中的地址,訪問結果會分以下幾個情況:


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

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並不是必須的,但是合理使用它可以避免因為訪問主機名而請求不到服務的情況,當然或許還節約了地址解析的損耗(雖然比較小)。

3. 為什麼把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/

4. 上面說的都是在不同機器上啟動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 。

5.我在同一臺機器上配置hosts,啟動三個Eureka實例並設置prefer-ip-address:

true,為什麼顯示unavailable-replicas?


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

一種原因是,你設置了prefer-ip-address:

true,其它服務註冊你時應該使用defaultZone:http://yourIP:8761/eureka/,圖中使用的仍然是hostname名,導致錯誤發生。

另一種原因是,三個Eureka都設置了prefer-ip-address:

true,導致最後解析出來的hostname都是相同的IP,使副本不可用。這也是4中為什麼要設置prefer-ip-address:

false的原因。

JAVA進階架構程序員福利:我這裡還總結整理了比較全面的JAVA相關的面試資料,都已經整理成了

PDF版,這些都可以分享給大家,關注私信我:【806】,免費領取!


分享到:


相關文章: