雲計算

SpringCloud–Eureka集群與原理

Eureka集群與原理

原理

Eureka Server註冊中心的集群和Dubbo的ZooKeeper註冊中心集群在結構上有很大的不同。

  Eureka Server註冊中心集群中每個節點都是平等的,集群中的所有節點同時對外提供服務的發現和註冊等功能。同時集群中每個Eureka Server節點又是一個微服務,也就是說,每個節點都可以在集群中的其他節點上註冊當前服務。又因為每個節點都是註冊中心,所以節點之間又可以相互註冊當前節點中已註冊的服務,並發現其他節點中已註冊的服務。

  • CAP理論指出,一個分佈式系統不可能同時滿足C(一致性)、A(可用性)和P(分區容錯性)。
    由於分佈式系統中必須保證分區容錯性,因此我們只能在A和C之間進行權衡。

Zookeeper保證的是CP, 而Eureka則是保證AP。


組件調用關係

搭建Eureka註冊中心集群,實現負載均衡+故障容錯。

Eureka集群:==相互註冊,相互守望。==

服務提供者

1、啟動後,向註冊中心發起register請求,註冊服務

2、在運行過程中,定時向註冊中心發送renew心跳,證明“我還活著”。

3、停止服務提供者,向註冊中心發起cancel請求,清空當前服務註冊信息。

服務消費者

1、啟動後,從註冊中心拉取服務註冊信息

2、在運行過程中,定時更新服務註冊信息。

3、服務消費者發起遠程調用


數據存儲結構

既然是服務註冊中心,必然要存儲服務的信息,我們知道ZK是將服務信息保存在樹形節點上。而下面是Eureka的數據存儲結構:

在這裡插入圖片描述

  • Eureka的數據存儲分了兩層:數據存儲層和緩存層。Eureka Client在拉取服務信息時,先從緩存層獲取(相當於Redis),如果獲取不到,先把數據存儲層的數據加載到緩存中(相當於Mysql),再從緩存中獲取。值得注意的是,數據存儲層的數據結構是服務信息,而緩存中保存的是經過處理加工過的、可以直接傳輸到Eureka Client的數據結構。

集群

在這裡插入圖片描述
我們使用筆記本 配置 Eureka 集群

  • 修改映射配置添加進hosts文件

mac系統的,接下來寫的步驟是mac的。打開終端,輸入sudo vim /etc/hosts來修改hosts文件。(權限不夠需要加上sudo並輸入密碼)
在最後一行加入:

127.0.0.1       eureka7001.com
127.0.0.1       eureka7002.com
127.0.0.1        eureka7003.com

然後:wq!保存退出。

  • 修改 Eureka 7001 的 yml 配置
eureka:
  instance:
    hostname: eureka7001.com  #eureka服務端的實例名稱
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      #集群版  相互註冊,相互守望
      defaultZone: http://eureka7002.com:7002/eureka/, http://eureka7003.com:7003/eureka/ 
      
  • 修改 Eureka 7002 的 yml 配置
eureka:
  instance:
    hostname: eureka7002.com  #eureka服務端的實例名稱
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      #集群版  相互註冊,相互守望
      defaultZone: http://eureka7001.com:7001/eureka/, http://eureka7003.com:7003/eureka/ #相互註冊,相互守望
  • 修改 Eureka 7003 的 yml 配置
eureka:
  instance:
    hostname: eureka7003.com  #eureka服務端的實例名稱
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      #集群版  相互註冊,相互守望
      defaultZone: http://eureka7001.com:7001/eureka/, http://eureka7002.com:7002/eureka/ #相互註冊,相互守望

在這裡插入圖片描述
在這裡插入圖片描述

  • 將客戶端註冊到 eureka 集群
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka

在這裡插入圖片描述


actuator微服務信息完善

修改 eureka client 的yml文件:

# client:    
#     ...    instance要和client對齊
  instance:
    instance-id: payment8001
    prefer-ip-address: true   #訪問路徑可以顯示ip地址

修改前:

在這裡插入圖片描述

修改後:
在這裡插入圖片描述


Eureka自我保護

保護模式主要用於一組客戶端和Eureka Server 之間存在網絡分區場景下的保護。一旦進入保護模式,Eureka Server將會嘗試保護其註冊表的信息,不再刪除服務註冊表的數據,也就是不會註銷任何微服務
在這裡插入圖片描述
導致原因 :某時刻某一個微服務不可用了 ,Eureka不會立刻清理,依舊會對該微服務對信息進行保存,屬於CAP裡面對AP分支

  • Eureka自我保護機制

      為了防止EurekaClient 可以正常運行,但是Server 在網絡不通對情況下,Server不會立即剔除Client 
    
    ![在默認的情況下,如果EurekaServer 在一定時間內沒有接收到某個微服務的實例心跳,EurekaServer將註銷該實例  (默認90秒)。](https://img-blog.csdnimg.cn/20200819225642530.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxOTc3ODM4,size_16,color_FFFFFF,t_70#pic_center)

    只有在一定時間內丟失大量服務的心跳才開啟自我保護模式。

在這裡插入圖片描述

禁止自我保護

  server:
    #關閉自我保護,默認為true
    enable-self-preservation: false
    #心跳的間隔時間,單位毫秒
    eviction-interval-timer-in-ms: 2000
   #Eureka客戶端向服務端發送心跳的時間間隔,單位秒(默認30秒)
   lease-renewal-interval-in-seconds: 1
   #Eureka服務端在收到最後一次心跳後等待的時間上限,單位秒(默認90秒),超時剔除服務
   lease-expiration-duration-in-seconds: 2

Leave a Reply

Your email address will not be published. Required fields are marked *