4--SpringCloud搭建高可用的服務(wù)注冊(cè)中心
我們已經(jīng)介紹了1--SpringCloud的服務(wù)注冊(cè)與發(fā)現(xiàn)Eureka,其中,主要演示了如何構(gòu)建和啟動(dòng)服務(wù)注冊(cè)中心Eureka Server,以及如何將服務(wù)注冊(cè)到Eureka Server中,但是在之前的示例中,這個(gè)服務(wù)注冊(cè)中心是單點(diǎn)的,顯然這并不適合應(yīng)用于線上生產(chǎn)環(huán)境,那么下面在前文的基礎(chǔ)上,我們來看看該如何構(gòu)建高可用的Eureka Server集群。
準(zhǔn)備
如果您還不熟悉如何構(gòu)建服務(wù)中心和注冊(cè)服務(wù),請(qǐng)先閱讀1--SpringCloud的服務(wù)注冊(cè)與發(fā)現(xiàn)Eureka
Eureka Server的高可用
Eureka Server除了單點(diǎn)運(yùn)行之外,還可以通過運(yùn)行多個(gè)實(shí)例,并進(jìn)行互相注冊(cè)的方式來實(shí)現(xiàn)高可用的部署,所以我們只需要將Eureke Server配置其他可用的serviceUrl就能實(shí)現(xiàn)高可用部署。
下面以中1--SpringCloud的服務(wù)注冊(cè)與發(fā)現(xiàn)Eureka的eureka-server為基礎(chǔ),對(duì)其改造,構(gòu)建雙節(jié)點(diǎn)的服務(wù)注冊(cè)中心。
創(chuàng)建application-peer1.properties文件
作為peer1服務(wù)中心的配置,并將serviceUrl指向peer2
spring.application.name=eureka-server server.port=1111 eureka.instance.hostname=peer1 eureka.client.serviceUrl.defaultZone=http://peer2:1112/eureka/
創(chuàng)建application-peer2.properties文件
作為peer2服務(wù)中心的配置,并將serviceUrl指向peer1
spring.application.name=eureka-server server.port=1112 eureka.instance.hostname=peer2 eureka.client.serviceUrl.defaultZone=http://peer1:1111/eureka/
修改host文件
Windows:C:\Windows\System32\drivers\etc Linux:/etc/hosts
127.0.0.1 peer1
127.0.0.1 peer2

通過修改 application.properties里面的spring.profiles.active屬性來分別啟動(dòng)peer1和peer2

此時(shí)訪問peer1的注冊(cè)中心:http://localhost:1111/,如下圖所示,我們可以看到registered-replicas中已經(jīng)有peer2節(jié)點(diǎn)的eureka-server了。同樣地,訪問peer2的注冊(cè)中心:http://localhost:1112/,能看到registered-replicas中已經(jīng)有peer1節(jié)點(diǎn),并且這些節(jié)點(diǎn)在可用分片(available-replicase)之中。我們也可以嘗試關(guān)閉peer1,刷新http://localhost:1112/,可以看到peer1的節(jié)點(diǎn)變?yōu)榱瞬豢捎梅制╱navailable-replicas)。

服務(wù)注冊(cè)與發(fā)現(xiàn)
在設(shè)置了多節(jié)點(diǎn)的服務(wù)注冊(cè)中心之后,我們主需要簡(jiǎn)單需求服務(wù)配置,就能將服務(wù)注冊(cè)到Eureka Server集群中。我們以1--SpringCloud的服務(wù)注冊(cè)與發(fā)現(xiàn)Eureka中的eureka-service為基礎(chǔ),修改application.properties配置文件:
#指定微服務(wù)的名稱后續(xù)在調(diào)用的時(shí)候只需要使用該名稱就可以進(jìn)行服務(wù)的訪問。 spring.application.name=compute-service server.port=2222 #屬性對(duì)應(yīng)服務(wù)注冊(cè)中心的配置內(nèi)容,指定服務(wù)注冊(cè)中心的位置。 eureka.client.serviceUrl.defaultZone=http://peer1:1111/eureka/,http://peer2:1112/eureka/
上面的配置主要對(duì)eureka.client.serviceUrl.defaultZone屬性做了改動(dòng),將注冊(cè)中心指向了之前我們搭建的peer1與peer2。
下面,我們啟動(dòng)該服務(wù),通過訪問http://localhost:1111/和http://localhost:1112/,可以觀察到compute-service同時(shí)被注冊(cè)到了peer1和peer2上。若此時(shí)斷開peer1,由于compute-service同時(shí)也向peer2注冊(cè),因此在peer2上其他服務(wù)依然能訪問到compute-service,從而實(shí)現(xiàn)了高可用的服務(wù)注冊(cè)中心。

深入理解
雖然上面我們以雙節(jié)點(diǎn)作為例子,但是實(shí)際上因負(fù)載等原因,我們往往可能需要在生產(chǎn)環(huán)境構(gòu)建多于兩個(gè)的Eureka Server節(jié)點(diǎn)。那么對(duì)于如何配置serviceUrl來讓集群中的服務(wù)進(jìn)行同步,需要我們更深入的理解節(jié)點(diǎn)間的同步機(jī)制來做出決策。
Eureka Server的同步遵循著一個(gè)非常簡(jiǎn)單的原則:只要有一條邊將節(jié)點(diǎn)連接,就可以進(jìn)行信息傳播與同步。什么意思呢?不妨我們通過下面的實(shí)驗(yàn)來看看會(huì)發(fā)生什么。
- 場(chǎng)景一:假設(shè)我們有3個(gè)注冊(cè)中心,我們將peer1、peer2、peer3各自都將serviceUrl指向另外兩個(gè)節(jié)點(diǎn)。換言之,peer1、peer2、peer3是兩兩互相注冊(cè)的。啟動(dòng)三個(gè)服務(wù)注冊(cè)中心,并將compute-service的serviceUrl指向peer1并啟動(dòng),可以獲得如下圖所示的集群效果。
訪問http://localhost:1112/,可以看到3個(gè)注冊(cè)中心組成了集群,eureka-service服務(wù)通過peer1同步給了與之互相注冊(cè)的peer2和peer3。
通過上面的實(shí)驗(yàn),我們可以得出下面的結(jié)論來指導(dǎo)我們搭建服務(wù)注冊(cè)中心的高可用集群:
- 兩兩注冊(cè)的方式可以實(shí)現(xiàn)集群中節(jié)點(diǎn)完全對(duì)等的效果,實(shí)現(xiàn)最高可用性集群,任何一臺(tái)注冊(cè)中心故障都不會(huì)影響服務(wù)的注冊(cè)與發(fā)現(xiàn)


浙公網(wǎng)安備 33010602011771號(hào)