eureka client獲取serviceUrls(eureka server地址)列表的過程:
- 1. 根據use-dns-for-fetching-service-urls屬性判斷是從dns還是從config獲取region和zone以及serviceUrl相關信息
- 2. 獲取過程首先從配置中獲取應用所在region,通過region屬性設置
- 3. 根據region獲取所有zone信息,dns與config獲取方式不一樣
- 3.1. dns會請求dns服務器獲取指定region的所有zone列表,如果沒有查詢到則拋出異常.使用該方式需要設定 eureka-server-d-n-s-name,eureka-server-u-r-l-context,eureka-server-port屬性,具體配置可參考另一篇文章《eureka集群基於DNS配置方式》
- 3.2. config則從配置文件的availabilityZones列表獲取,如果沒有配置,則返回defaultZone.使用該方式需要配置availability-zones(Map<region:zone>),service-url(Map<zone:serviceUrls>)
- 4. 獲取zone列表成功后需要對列表進行排序,排序根據prefer-same-zone-eureka而不同,該屬性意為是否將相同名稱的zone作為注冊首選
- 4.0. 這里有一個客戶端zone的概念,該zone為availabilityZones的第一個zone,如果沒有設置則為defaultZone
- 4.1. 如果設置true,則查詢zone列表,找到與客戶端zone同名的元素,並將其之前元素轉移到列表最后
- 4.2. 如果設置false,則查找zone列表,找到第一個與客戶端zone不同名的zone,並將其之前的元素轉移到列表最后
- 5. 然后循環獲取所有zone對應的serviceUrls並按順序追加到一個列表中
- 5.1. 如果是配置方式,獲取某個zone的serviceUrls為空則返回defaultZone的serviceUrl,而DNS方式不會進行任何處理
通過以上步驟可以獲取到region對應的zone的serviceUrls.
這里出現了region,zone,serviceUrl這幾個概念,可以簡單理解為region包含多個zone,zone包含多個serviceUrl.但需要注意的是,zone可以出現在多個region中,serviceUrl可以出現在多個zone中,也就是說他們三個概念兩兩之間的關系是多對多而非一對多.
#基於DNS的配置
eureka:
client:
#DNS域名,獲取其他信息將以該域名為根域名
eureka-server-d-n-s-name: relinson.com
#開啟DNS方式獲取serviceUrl,默認為false
use-dns-for-fetching-service-urls: true
#當前應用所在區域,默認為us-east-1
region: region1
#eureka服務根目錄
eureka-server-u-r-l-context: eureka
#服務所在端口
eureka-server-port: 9999
#獲取serviceUrl時候是否優先獲取相同zone的列表(如果獲取為空則獲取所在region第一個zone),如果為false則優先獲取不在相同zone的列表
prefer-same-zone-eureka: true
#是否獲取注冊信息到本地
fetch-registry: true
#是否將自己注冊到eureka
register-with-eureka: true
#基於CONFIG的配置
eureka:
client:
#開啟DNS方式獲取serviceUrl,默認為false
use-dns-for-fetching-service-urls: false
#當前應用所在區域,默認為us-east-1
region: region1
#獲取serviceUrl時候是否優先獲取相同zone的列表(如果獲取為空則獲取所在region第一個zone),如果為false則優先獲取不在相同zone的列表
#client所在zone為availabilityZones的第一個zone,如果未配置,則為defaultZone
prefer-same-zone-eureka: true
#是否獲取注冊信息到本地
fetch-registry: true
#是否將自己注冊到eureka
register-with-eureka: true
#與DNS獲取的方式相同,這里需要手工配置包含哪些region以及zone(Map類型),如果沒有給相關的region配置zone,則默認返回defaultZone
availability-zones:
region1: zone1-2,zone1-2,zone2-2
region2: zone2-2,zone2-2,zone2-3
#與DNS獲取數據方式類似,這里需要手工配置每個zone包含哪些URL,如果應用所在區域沒有zone,則默認返回defaultZone的數據
service-url:
zone1-1: http://xxx,http://xxx2
zone1-2: http://xxx,http://xxx2
zone2-1: http://xxx,http://xxx2
zone2-2: http://xxx,http://xxx2