1、簡介
Eureka叢集提供了分區功能,這種功能設計理念來源于亞馬遜雲AWS創造的兩個基礎概念region(地域)和zone(可用區):
- region:地域就是實體意義上的不同地域,在服務部署時會選擇在使用者需求大的區域建設多個機房并部署服務,這樣可以減少網絡不穩定帶來的問題
- zone:一個region下可以劃分為多個zone。也就是說一個區域的多個機房伺服器,按照一定規則劃分為不同的可用區(比如說一個區域有三個機房,這三個機房就可以劃分為三個zone)。通過劃分zone,可以達到容災的效果,如果一個zone故障,其他zone仍然可以對外提供服務。
結合上面兩個概念可知,當公司存在Eureka Server分地域部署的時候,我們可以采用Eureka叢集提供的分區功能。這樣可以保證某一個region中的zone注冊的服務優先于另一個zone中注冊的服務被調用,目前者不可用時,再去選擇其他zone中注冊的服務發起調用,這樣可以保證服務調用的延遲降低。
Region和Zone的關系圖:
2、叢集部署
2.1 資源清單
本次一共搭建四台Eureka Server服務,其資源清單如下所示:
application-name | zone | instance-hostname | prot |
Eureka-Ynatian | zone-yantian | eureka18881.com | 18881 |
Eureka-Luohu | zone-luohu | eureka18882.com | 18882 |
Eureka-Nanshan | eureka18883.com | 18883 | |
Eureka-Baoan | zone-baoan | eureka18884.com | 18884 |
Eureka Server Cluster叢集圖(Region-深圳、zone-羅湖、zone-鹽田、zone-南山、zone-寶安):
這裡搭建的Eureka Server Cluster 是單個Region,包含四個zone,如果公司的需要的Eureka Server高可用要求特别高,可以在Region的每個zone中部署多個Eureka Server伺服器。需要做分區域,參照Region Shenzhen配置多個Region即可。
2.2 配置檔案
Eureka-Ynatian的Eureka Server配置檔案
server:
port: 18881
spring:
application:
name: Eureka-Ynatian
eureka:
instance:
hostname: eureka18881.com
client:
prefer-same-zone-eureka: true
register-with-eureka: true
region: shenzhen
availability-zones:
shenzhen: zone-yantian,zone-luohu,zone-nanshan,zone-baoan
fetch-registry: true
service-url:
zone-yantian:
http://eureka18881.com:18881/eureka/zone-luohu:
http://eureka18882.com:18882/eureka/zone-nanshan:
http://eureka18883.com:18883/eureka/zone-baoan:
http://eureka18884.com:18884/eureka/Eureka-Luohu的Eureka Server配置檔案
port: 18882
name: Eureka-Luohu
hostname: eureka18882.com
shenzhen: zone-luohu,zone-yantian,zone-nanshan,zone-baoan
Eureka-Nanshan的Eureka Server配置檔案
port: 18883
name: Eureka-Nanshan
hostname: eureka18883.com
shenzhen: zone-nanshan,zone-luohu,zone-yantian,zone-baoan
Eureka-Baoan的Eureka Server配置檔案
port: 18884
name: Eureka-Baoan
hostname: eureka18884.com
shenzhen: zone-baoan,zone-nanshan,zone-luohu,zone-yantian
2.3 啟動叢集
依次啟動叢集中四個Eureka Server服務,等待叢集之間穩定後,通路Eureka Server的Dashboard,此時在四台Eureka Server中的任意一台都可以看到相同的服務注冊資訊Instance currently registered with Eureka,以及DS Replicaes資訊(這個不相同哦,不需要複制自己……),此時說明Eureka Server Cluster已經正常啟動了。
2.4 服務注冊
Eureka Server分區本質上除了達到高可用之外,最主要是為了給用戶端提供最優的服務,以此來達到服務的最快響應。在Eureka Server中注冊兩個服務Server-01和Server-02,Server-01中metadata-map zone選擇zone-yantian,Server-02中metadata-map zone選擇zone-louhu。(注意兩個服務的服務名均為Server)
Server-01配置檔案
port: 19991
name: Server
prefer-ip-address: true
metadata-map:
zone: zone-yantian
Server-01中提供一個Rest Api端點
@RestController
@RequestMapping("/zone")
public class ZoneController {
@GetMapping
public String zone() {
return "Server zone-yantian";
}
}
Server-02配置檔案
port: 19992
zone: zone-luohu
Server-02中提供一個Rest Api端點
return "Server zone-luohu";
此時通路Eureka dashboard可以看到Server 有兩個執行個體注冊到了Eureka Server Cluster中。
2.4 服務消費
建立一個服務消費者Consumer-01,用于測試服務調用分發的具體情況。
Consumer-01配置檔案,其中指定metadata-map.zone為zone-luohu
port: 17771
name: Consumer-01
提供一個Rest Api通路端點:
@RequestMapping("/consumer")
@Autowired
private RestTemplate restTemplate;
return restTemplate.getForObject("http://server/zone", String.class);
在浏覽器通路該端點,無論怎麼重新整理都會輸出Server zone-louhu,說明請求一直打到了Server-02
修改Consumer-01的配置檔案,修改metadata-map:zone為zone-yantian
重新通路浏覽器,請求Consumer-01提供的端點,此時無論怎麼重新整理都會輸出Server zone-yantian,說明請求一直打到了Server-01
2.5 配置詳解
在服務注冊和服務消費中有幾個非常重要的配置項prefer-same-zone-eureka和eureka.instance.metadata-map.zone
prefer-same-zone-eureka
- true:擷取eureka.client.availability-zones下的zone清單,選擇第一個zone進行服務注冊,如果第一個注冊失敗,依次選擇其他zone進行服務注冊
- false:擷取eureka.client.service-url清單,選擇第一個service-url位址進行服務注冊,如果第一個位址注冊失敗,依次選擇其他service-url服務位址注冊
eureka.instance.metadata-map.zone
eureka.instance.metadata-map.zone配置項用于辨別服務提供者和服務消費者屬于那個zone,服務消費者通過ribbon在Eureka Server中拉去服務清單。如果一個zone中有多個服務,則輪詢每個zone中的服務清單;如果zone中的服務均不能通路,則嘗試通路其他zone下的服務。