天天看點

Eureka分區叢集部署

1、簡介

Eureka叢集提供了分區功能,這種功能設計理念來源于亞馬遜雲AWS創造的兩個基礎概念region(地域)和zone(可用區):

  • region:地域就是實體意義上的不同地域,在服務部署時會選擇在使用者需求大的區域建設多個機房并部署服務,這樣可以減少網絡不穩定帶來的問題
  • zone:一個region下可以劃分為多個zone。也就是說一個區域的多個機房伺服器,按照一定規則劃分為不同的可用區(比如說一個區域有三個機房,這三個機房就可以劃分為三個zone)。通過劃分zone,可以達到容災的效果,如果一個zone故障,其他zone仍然可以對外提供服務。

結合上面兩個概念可知,當公司存在Eureka Server分地域部署的時候,我們可以采用Eureka叢集提供的分區功能。這樣可以保證某一個region中的zone注冊的服務優先于另一個zone中注冊的服務被調用,目前者不可用時,再去選擇其他zone中注冊的服務發起調用,這樣可以保證服務調用的延遲降低。

Region和Zone的關系圖:

Eureka分區叢集部署

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分區叢集部署

這裡搭建的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已經正常啟動了。

Eureka分區叢集部署

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中。

Eureka分區叢集部署

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

Eureka分區叢集部署

修改Consumer-01的配置檔案,修改metadata-map:zone為zone-yantian

重新通路浏覽器,請求Consumer-01提供的端點,此時無論怎麼重新整理都會輸出Server zone-yantian,說明請求一直打到了Server-01

Eureka分區叢集部署

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下的服務。