zone®ion
上圖是eureka高可用架構(gòu)砚著,也是Netflix推薦的用法。
上圖的us-east-1c绘沉、us-east-1d赃绊、us-east-1e各自是一個zone,每個zone內(nèi)都有各自的eureka server & eureka client守问,就是說每個zone內(nèi)都有服務注冊中心及微服務的提供者和消費者匀归。
那么zone和region在eureka中的概念是什么呢?
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來調(diào)用cart應用的controller友驮,原cart應用zone1的接口地址為:POST http://localhost:8091/cart/1
通過zuul網(wǎng)關(guān)來訪問,地址是POST http://localhost:8081/cart/1.
持續(xù)通過訪問zone1的zuul暴露出來的接口 http://localhost:8081/cart/1.發(fā)現(xiàn)始終路由到zone1的cart應用驾锰。
這時候卸留,我們將zone1的cart應用下線,再次訪問椭豫,報錯耻瑟,訪問出錯,過會再訪問赏酥,路由到zone2的cart應用喳整。
總結(jié):
- 當一個region有多個zone是,微服務調(diào)用應用時優(yōu)先調(diào)用同一個zone內(nèi)的應用裸扶。原因是eureka有個配置prefer-same-zone-eureka框都,默認為true。
- 當同一個zone內(nèi)的某個微服務下線時姓言,其他微服務調(diào)用這個下線的應用瞬项,首先會報錯,那是因為eureka server中還保留這個應用的注冊信息(eureka client及server都有本地緩存)何荚,過一會再次訪問,發(fā)現(xiàn)已經(jīng)路由到同一個region的其他zone內(nèi)的應用了猪杭。
eureka中region的使用
目前eureka server提供配置remoteRegionUrlsWithName餐塘,key為region的名稱,value為遠程eureka server list皂吮。僅當本地服務不可用時戒傻,從遠程(其他region)獲取服務列表税手。
eureka client 也提供了fetchRemoteRegionsRegistry用于從遠程獲取,它的值為region list 用逗號分隔開需纳。
使用以上兩個配置可以實現(xiàn)類似于異地多活的功能芦倒。