SpringCloud實踐(三) 高可用的Eureka註冊中心

虎糾衛發表於2018-06-02
       微服務的一個重要的特性就是去中心化,在上一節中,建立了一個微服務的demo,但是在上面例子中,很明顯註冊中心存在單點失效問題。當單一的註冊中心失效後,對整個微服務來說,就會崩潰。好在SpringCloud提供了註冊中心高可用配置的方案,下面就看一下如果實現高可用的Eureka註冊中心。

        註冊中心的高可用是以叢集的方式來解決註冊中心的單點問題,用下面的圖來表示高可用的架構:


    下面通過例子,是看一下的微服務高可用實現:

    一、實踐背景

    1、基於上一節例子

    2、通過配置和啟動多個節點,進行驗證

    二、工程配置

    1、Eureka 註冊中心

    在上一節的註冊中心基礎上,我們通過配置的方式,來讓註冊中心支援高可用:

    首先將原工程的application.properties 複製為 application-center1.properties和application-center2.properties兩個配置檔案,在配置檔案中,最重要的是修改配置,讓註冊中心可以想另外一個註冊中心註冊服務,起到關鍵作用的配置項是:

eureka.client.register-with-eureka=true

eureka.client.fetch-registry=true

下面貼出center1和center2 的配置檔案,application-center1.properties配置如下

server.port=11111

spring.application.name=Eureka-Server
eureka.instance.hostname=center1
#true表示將自己註冊為一個服務,否則是啟動了一個註冊中心
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true

#這裡寫的center1 的埠,為的是向其進行註冊自己
eureka.client.service-url.defaultZone=http://center2:11112/eureka/

#關閉自我保護,並設定剔除時間為30秒
#eureka.server.enable-self-preservation=false
#eureka.server.eviction-interval-timer-in-ms=15000
application-center2.properties的配置如下:
server.port=11112

spring.application.name=Eureka-Server
eureka.instance.hostname=center2
#true表示將自己註冊為一個服務,否則是啟動了一個註冊中心
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true

#這裡寫的center1 的埠,為的是向其進行註冊自己
eureka.client.service-url.defaultZone=http://center1:11111/eureka/

#關閉自我保護,並設定剔除時間為30秒
#eureka.server.enable-self-preservation=false
#eureka.server.eviction-interval-timer-in-ms=15000

 在這兩個配置檔案裡面, eureka.instance.hostname對應分別是center1和center2,所以在系統host檔案中,我們配置上這兩個主機名,本例是本機配兩個主機名,實際場景下是多個ip配置主機名。C:\Windows\System32\drivers\etc\ 下有一個hosts檔案,在hosts檔案中,新增

127.0.0.1   center1
127.0.0.1   center2

注:Eureka也支援配置ip,需要進行一個引數eureka.instance.perferIpAddress=true

eureka.client.service-url.defaultZone引數需要注意一下,如果是center1,需要配置為 http://center2:11112/eureka/

意思是向center2 註冊自己,center2正好相反。

還有兩個引數設計關閉自我保護,暫時不管

兩個配置檔案有了,還需要控制啟動時呼叫的是哪個配置檔案,我們將application.properties修改一下:

spring.profiles.active=center2

只有一行,通過spring.profiles.active 來控制啟動的是哪個配置檔案。通過修改這個配置項,我們啟動起兩個註冊中心。由於啟動先後,第一個啟動的,會打一段異常日誌,不用擔心,因為它在向第二個註冊中心註冊,第二個註冊中心還沒啟動好,所以會報錯。啟動後通過http://localhost:11111/ 檢視


注意http://localhost:11111/ 看到DS Replicas 是 center2, 在11112 埠的url下,看到是center1,兩個節點時互為HA。這個時候,如果我們關掉 11112埠的程式,發現http://localhost:11111/ 並沒有變化,等過了一小段時間後,這個頁面重新整理一下:


出現紅色的警告,但是status 並沒有變化。這個是因為Eureka的自我保護預設開啟,會保持一段註冊資訊。將上面的兩個配置檔案中的註釋掉的配置放開,再次正常啟動後,關閉11112埠的程式:


註冊中心同樣啟動,但是會提示自我保護關閉

2、服務的配置

兩個註冊中心節點建立起來後,我們修改一下原來的兩個服務的配置檔案,這些服務分別向兩個註冊中心進行註冊服務

同樣,我們需要修改服務的配置檔案:

server.port=21111

eureka.instance.hostname=localhost
eureka.client.service-url.defaultZone=http://center1:11111/eureka/,http://center2:11112/eureka/
# 重點需要注意spring.application.name,這個是在以後服務與服務之間相互呼叫是根據這個name
spring.application.name=service-sayHello

#服務失效後的保持
eureka.instance.lease-renewal-interval-in-seconds=10
eureka.instance.lease-expiration-duration-in-seconds=30

eureka.client.service-url.defaultZone=http://center1:11111/eureka/,http://center2:11112/eureka/,這裡說明服務是向兩個註冊中心進行註冊。我們啟動兩個服務,port分別是 21111和 31111,啟動後,http://localhost:11111/如下:


3、消費者

同樣,修改一下消費者的配置檔案:

eureka.client.service-url.defaultZone=http://center1:11111/eureka/,http://center2:11112/eureka/,

啟動起來後,如下圖:


4、驗證高可用,關閉註冊中心2

消費者http://localhost:31311/hi 並沒有受到影響,註冊中心2的URL http://localhost:11112/已經打不開了,我們看一下http://localhost:11111/,還能顯示(注:這裡要等待一下段時間)


註冊中心(本身也是服務)在應用服務註冊列表中已經看不到了。11112註冊中心2關閉後,服務(註冊中心1)沒有辦法註冊,所以不在註冊列表中,但是服務SAYHELLO和消費服務,因為有向註冊中心1註冊,所以還可以看到和使用。在General Info中也可以看到http://center2:11112/eureka 是 unavaliable狀態。


通過雙節點或者更多節點來保障註冊中心和服務不會全部崩潰和失效,大大提高了服務的健壯性和可擴充套件性。


相關文章