微服務實戰(zhàn)SpringCloud之Eureka實現(xiàn)類似異地多活

zone&region

eureka_region_zone

上圖是eureka高可用架構,也是Netflix推薦的用法。

上圖的us-east-1c、us-east-1d、us-east-1e各自是一個zone,每個zone內都有各自的eureka server & eureka client,就是說每個zone內都有服務注冊中心及微服務的提供者和消費者。

那么zone和region在eureka中的概念是什么呢?

AWS_regions
  • region和zone其實是來自于AWS亞馬遜云的概念,AWS有很多大的區(qū)域,比如說亞太區(qū),北美區(qū),歐洲去

  • region:區(qū)域,同一地理地區(qū)中的命名 AWS 資源集。一個區(qū)域包含至少兩個可用區(qū)。

  • zone:可用區(qū)。

AWS中,region有us-east-1、us-east-2等,分別表示為美國東部(弗吉尼亞北部)、美國東部(俄亥俄州)表示不同區(qū)域。

而us-east-1可能有us-east-1a、us-east-1b等不同的zone(可用區(qū)),類似我們的機房的概念。

eureka中的zone的使用

eureka server -zone1

server:
  port: 8761

eureka:
  instance:
    hostname: localhost
    metadata-map.zone: zone1
  client:
    region: cn-east
    service-url:
      defaultZone: http://localhost:8761/eureka,http://localhost:8762/eureka

spring:
  application:
    name: eureka
  profiles:
    active: ${boot.profile:dev}

eureka server -zone2

server:
  port: 8762

eureka:
  instance:
    hostname: localhost
    metadata-map.zone: zone2
  client:
    region: cn-east
    service-url:
      defaultZone: http://localhost:8761/eureka,http://localhost:8762/eureka

spring:
  application:
    name: eureka
  profiles:
    active: ${boot.profile:dev}

Zuul-zone1

spring:
  application:
    name: zuul
server:
  port: 8081

eureka:
  instance:
    metadata-map.zone: zone1
  client:
    region: cn-east
    service-url:
      defaultZone: http://localhost:8761/eureka,http://localhost:8762/eureka

Zuul-zone2

spring:
  application:
    name: zuul
server:
  port: 8082

eureka:
  instance:
    metadata-map.zone: zone2
  client:
    region: cn-east
    service-url:
      defaultZone: http://localhost:8761/eureka,http://localhost:8762/eureka

cart-zone1

server:
  port: 8091

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka,http://localhost:8762/eureka
    region: cn-east  
  instance:
    status-page-url-path: /info
    health-check-url-path: /health
    metadata-map.zone: zone1    

spring:
  application:
    name: cart
  profiles:
    active: ${boot.profile:dev}

Cart-zone2

server:
  port: 8092

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka,http://localhost:8762/eureka
    region: cn-east  
  instance:
    status-page-url-path: /info
    health-check-url-path: /health
    metadata-map.zone: zone2    

spring:
  application:
    name: cart
  profiles:
    active: ${boot.profile:dev}

上面的配置概括來說就是,有三個應用,分別是eureka、zuul、cart。每個應用通過指定不同的profile啟動,共啟動六個微服務。zone1有eureka server、zuul、cart,zone2有eureka server、zuul、cart。

通過zuul來調用cart應用的controller,原cart應用zone1的接口地址為:POST http://localhost:8091/cart/1

通過zuul網(wǎng)關來訪問,地址是POST http://localhost:8081/cart/1.

持續(xù)通過訪問zone1的zuul暴露出來的接口 http://localhost:8081/cart/1.發(fā)現(xiàn)始終路由到zone1的cart應用。

這時候,我們將zone1的cart應用下線,再次訪問,報錯,訪問出錯,過會再訪問,路由到zone2的cart應用。

總結:

  • 當一個region有多個zone是,微服務調用應用時優(yōu)先調用同一個zone內的應用。原因是eureka有個配置prefer-same-zone-eureka,默認為true。
  • 當同一個zone內的某個微服務下線時,其他微服務調用這個下線的應用,首先會報錯,那是因為eureka server中還保留這個應用的注冊信息(eureka client及server都有本地緩存),過一會再次訪問,發(fā)現(xiàn)已經(jīng)路由到同一個region的其他zone內的應用了。

eureka中region的使用

目前eureka server提供配置remoteRegionUrlsWithName,key為region的名稱,value為遠程eureka server list。僅當本地服務不可用時,從遠程(其他region)獲取服務列表。
eureka client 也提供了fetchRemoteRegionsRegistry用于從遠程獲取,它的值為region list 用逗號分隔開。

使用以上兩個配置可以實現(xiàn)類似于異地多活的功能。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容