(如無特殊說明,本文中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/出現下圖說明配置正確。
說幾點原因:
- 許多高可用的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並不是必須的,但是合理使用它可以避免因爲訪問主機名而請求不到服務的情況,當然或許還節約了地址解析的損耗(雖然比較小)。
- 爲什麼把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/ 。
- 上面說的都是在不同機器上啓動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 。
- 我在同一臺機器上配置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