1. 程式人生 > 實用技巧 >3、SpringCloud之服務註冊中心Eureka

3、SpringCloud之服務註冊中心Eureka

SpringCloud之Eureka註冊中心高可用叢集概述

對於微服務這種分散式系統,要充分考慮每個微服務元件的高可用性問題,不能用單點故障。

註冊中心本身也是一個服務,如果只有一個節點(伺服器),則有可能發生故障而導致無法使用註冊和查詢服務(單點故障),為保證服務註冊中心的高可用,通過服務註冊中心叢集來解決。

Eureka Server 本身也是服務,既是Provider 也是 Consumer;

Eureka實現高可用

Eureka Server 的高可用實際上就是將自己作為服務向其他服務註冊自己,形成一個互相註冊的服務註冊中心,實現服務清單之間的同步,A註冊中心上註冊的服務,可以被複制同步到B註冊中心上,任何一臺註冊中心上都能查詢到已經註冊的服務,從而實現高可用。

Eureka 註冊中心高可用叢集搭建

  • 擁有兩個以上的Eureka 服務註冊中心
  • A服務中心指向B服務中心,B服務中心指向A服務中心(在配置檔案設定service-url)

第一步,兩個服務註冊中心

有兩種方式可以實現(這裡選擇第二種)
1、通過建立兩個springboot專案來獲取兩個Eureka服務註冊中心
2、通過指定不同的配置檔案啟動兩次程式應用程式來獲得兩個服務註冊中心。

建立專案

新增依賴

<!-- 新增Eureka依賴-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>

<dependencyManagement>
 <!--新增依賴管理-->
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Hoxton.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
      </dependencies>
</dependencyManagement>

編寫配置檔案

配置檔案1:Application8761.properties

# 應用服務 WEB 訪問埠
server.port=8761
#配置該服務註冊中心的hostname(填ip)
eureka.instance.hostname=eureka8761
#由於我們目前建立的應用是一個服務註冊中心,而不是普通的應用。
# 預設情況下,這個應用會向註冊中心(也是它自己)註冊它自己,設定為false表示禁止這種自己向自己註冊的預設行為
eureka.client.register-with-eureka=false
#表示不去檢索其他的服務,因為服務註冊中心本身的職責就是維護服務例項,它不需要檢索其他服務
eureka.client.fetch-registry=false
#指定服務註冊中心的位置
eureka.client.service-url.defaultZone=http://eureka8762:8762/eureka

配置檔案2:Application8762.properties

server.port=8762
#配置該服務註冊中心的hostname(填ip)
eureka.instance.hostname=eureka8762
#由於我們目前建立的應用是一個服務註冊中心,而不是普通的應用。
# 預設情況下,這個應用會向註冊中心(也是它自己)註冊它自己,設定為false表示禁止這種自己向自己註冊的預設行為
eureka.client.register-with-eureka=false
#表示不去檢索其他的服務,因為服務註冊中心本身的職責就是維護服務例項,它不需要檢索其他服務
eureka.client.fetch-registry=false
#指定服務註冊中心的位置
eureka.client.service-url.defaultZone=http://eureka8761:8761/eureka

配置對映
在電腦的C:\Windows\System32\drivers\etc開啟hosts檔案進行配置,如下:

127.0.0.1 eureka8761
127.0.0.1 eureka8762

多環境下指定程式配置檔案
建立兩個啟動類,並指定啟動類使用哪個配置檔案執行

@SpringBootApplication
@EnableEurekaServer //開啟Eureka註冊中心服務端
public class Application8762 {

    public static void main(String[] args) {
        SpringApplication.run(Application8762.class, args);
    }

}


另一個啟動類也是這樣配置

測試
啟動該程式的兩個啟動類,啟動成功後獲得兩個服務註冊中心
訪問後如下:

當複製選項出現了另一臺伺服器的hostname時,說明Eureka的高可用叢集已經搭建成功了,這兩個Eureka Server之間就可以相互同步資料

服務消費者和服務提供者添修改訪問Eureka Server的訪問路徑

#eureka的訪問地址
eureka.client.service-url.defaultZone=http://eureka8761:8761/eureka,http://eureka8762:8762/eureka

啟動服務消費者程式和服務提供者程式
重新整理

Eureka服務註冊中心自我保護機制

自我保護機制是Eureka註冊中心的重要特性,當Eureka註冊中心進入自我保護模式是,在Eureka Server首頁會輸出如下:

在沒有Eureka自我保護的情況下,如果Eureka Server在一定時間內沒有接收到某個微服務例項的心跳,Eureka Server將會登出該例項,認為該服務宕機了。但是如果是因為網路問題微服務例項無法與Eureka Server正常通訊,而微服務本身是正常的,在這種“網路分割槽故障”的情況下,Eureka可能會錯殺了一個服務,將其註冊資訊進行銷燬。這時Eureka的自我抱回模式就顯得非常重要了。

Eureka Server進入“自我保護模式”時,當Eureka Server節點在短時間內丟失過多客戶端時,Eureka Server 會認為可能該服務節點出現網路分割槽故障,那麼就會把這個微服務節點保護起來,一旦進入自我保護模式,Eureka Server就會保護服務登錄檔中的資訊,也就不會對該服務進行登出。當網路恢復後,該Eureka server節點會再自動退出自我保護模式,這種模式編碼了因網路分割槽故障導致服務不可用。

自我保護機制是一種應對網路異常的安全保護措施,寧願保留所有微服務,也不盲目登出任何健康的服務;自我保護模式讓Eureka叢集更加的健壯,穩定;

如果想禁用保護模式,可以使用eureka.server.enable-self-preservation=false禁用自我保護模式。

Eureka Server的自我保護模式讓叢集變得健壯,穩定的同時,也會帶來一些困擾,如果在保護期內,某個服務提供者剛好下線,此時的消費者就拿到一個無效的服務例項,此時會呼叫失敗。關於這個問題需要服務消費者端具有一些容錯機制,如重試,斷路由等策略。

Eureka Client 配置

#每間隔30秒,向服務端傳送一次心跳,證明自己依然“存活”(預設30秒)
eureka.instance.lease-renewal-interval-in-seconds=30
#告訴服務端,如果90s內沒有傳送心跳,就代表該服務故障了,讓服務端登出該服務(預設90秒)
eureka.instance.lease-expiration-duration-in-seconds=90

要讓該配置看見效果,最好是讓服務端的保護機制禁掉
eureka.server.enable-self-preservation=false