1. 程式人生 > 實用技巧 >SpringCloud03-Eureka 叢集搭建

SpringCloud03-Eureka 叢集搭建

Eureka 叢集搭建

我們都知道,一個註冊中心來接收服務,如果這個註冊中心崩了,放在這個註冊中心裡邊的所有服務都會有故障;所以我們可以搭建叢集的方式來避免這個問題,如下圖,有三個註冊中心,他們分別關聯。接下來分別來搭建一下

​ 1)分別建立7001,7002,7003埠(當然,這邊用的是虛擬遠端,嘻嘻嘻嘻)

server:
  port: 7001

#Eureka配置
eureka:
  instance:
    hostname: eureka7001.com   #Eureka服務端的例項名稱
  client:
    register-with-eureka: false #表示是否向Eureka註冊中心註冊自己
    fetch-registry: false  #fetch-registry如果為false,則表示自己為註冊中心
    service-url: #監控頁面
      defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
server:
  port: 7002

#Eureka配置
eureka:
  instance:
    hostname: eureka7002.com  #Eureka服務端的例項名稱
  client:
    register-with-eureka: false #表示是否向Eureka註冊中心註冊自己
    fetch-registry: false  #fetch-registry如果為false,則表示自己為註冊中心
    service-url: #監控頁面
      #單機  defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
      #叢集 (關聯)
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7003.com:7003/eureka/
server:
  port: 7003

#Eureka配置
eureka:
  instance:
    hostname: eureka7003.com    #Eureka服務端的例項名稱
  client:
    register-with-eureka: false #表示是否向Eureka註冊中心註冊自己
    fetch-registry: false  #fetch-registry如果為false,則表示自己為註冊中心
    service-url: #監控頁面
      defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7001.com:7001/eureka/

主啟動類都是一樣的

package com.mjh.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer   //@EnableEurekaServer  服務端啟動類,可以接受別人註冊進來(即註冊中心)
public class EurekaServer_7003 {
    /**
     * 啟動之後,訪問http://localhost:7001/
     */
    public static void main(String[] args) {
        SpringApplication.run(EurekaServer_7003.class,args);
    }
}

之後開啟任意一個埠,我們都能發現其中兩個埠都掛載進來了

最後我們開啟服務提供者,讓其把資訊註冊進來,當然我們服務提供者也要關聯他們三個埠

#Eureka配置,服務註冊到哪裡
eureka:
  client:
    service-url:
      defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7001.com:7001/eureka/,http://eureka7003.com:7003/eureka/
  instance:
    instance-id: springcloud-privider-dept8001  #修改Eureka的狀態描述

由此可見,Eureka搭建叢集的好處就是如果其中一個註冊中心崩了,我們的服務還是會正常執行,只要有一個Eureka還在,就能保住註冊服務的可用性,因為一邊沒有了服務,還有另一邊;也不排除三個註冊中心都同時崩(這是少見)。

CPA原則與zookeeper對比

ACID是什麼

  • A(Atomicity)原子性
  • B(Consistency)一致性
  • I(Isolation)隔離性
  • D(Durability)永續性

CAP是什麼

  • C(consistency)一致性
  • A(Availability) 可用性
  • P(Partition tolerance)分割槽容錯性

CAP理論的核心

  • 一個分散式系統不可能同時很好的滿足一致性,可用性和分割槽容錯性這三個要求
  • 根據CAP原理,將NoSQL資料庫分成了滿足CA原則,滿足CP原則和AP原則三大類
  • CA:單點叢集,滿足一致性,可用性的系統,通常可擴充套件性較差
  • CP:滿足一致性,分割槽容錯性的系統,通常效能不是特別高
  • AP:滿足可用性,分割槽容錯性的系統,通常可能對一致性要求低一些

作為服務註冊中心,Eureka和Zookeeper好在哪裡

著名的CAP理論指出,一個分散式系統不可能同時滿足C(一致性)A(可用性)P(分割槽容錯性)

由於分割槽容錯性P在分散式系統中是必須要保證的,因此我們只能在A和C之間進行權衡

  • Zookeeper保證的是CP
  • Eureka保證的是AP

Zookeeper保證的是CP

當向註冊中心查詢服務列表時,我們可以容忍註冊中心返回的是幾分鐘以前的註冊資訊,但不能接受服務直接Down掉不可用。也就是說,服務註冊功能對可用性的要求高於一致性。但是Zookeeper會出現這樣一種情況,當master節點因為網路故障與其他節點數去聯絡時,剩餘節點會重新進行Leader選舉,問題在於,選舉Leader的時間太長,30S——40S ,且選舉期間整個Zookeeper叢集都是不可用的,這就導致了在選舉期間註冊服務癱瘓。在雲部署的環境下,因為網路問題使得Zookeeper叢集失去master節點是較大概率會發生的失去,雖然服務最終能夠恢復,但漫長的時間選舉時間導致的註冊長期不可用是能容忍的

Eureka保證的是AP

Eureka看明白了這一點,因此在設計時就有限保證可用性。Eureka各個節點都是平等的,幾個節點掛掉不會影響正常節點的工作,剩餘的節點依然可以提供註冊和查詢服務,而Eureka的客戶端在想某個Eureka註冊時,如果發現連線失敗,則會自動切換到至其他節點,只要有一臺EUreka還在,就能保證註冊服務的可用性,只不過查詢到的資訊可能不是最新的,除此之外,Eureka還有一種自我保護機制,如果在15分鐘內超過85%的節點都沒有正常的心跳,那麼Eureka就認為客戶端與註冊中心出現了網路故障,此時會出現以下幾種情況:

1.Eureka不再從註冊列表中移除因為長時間沒有收到心跳而應該過期的服務

2.Eureka仍然能夠接受新服務的註冊和查詢請求,但是不會被同步到其他節點上(即保證當前節點依舊可用)

3.當網路穩定時,當前例項行的註冊資訊會被同步到其他節點中

因此,Eureka可以很好的應對因為網路故障導致部分節點失去聯絡的情況,而不會像Zookeeper那樣使整個註冊服務癱瘓