1. 概述
在本教程中,我們將學習關於 Eureka 自我保存和更新機制。
首先,我們將創建一個 Eureka 服務器,並伴隨多個 Eureka 客户端實例。
然後,我們將註冊這些客户端與我們的 Eureka 服務器,以展示自我保存機制的工作原理。
2. Eureka 自我維護
在討論自我維護之前,我們先了解 Eureka 服務器如何維護客户端實例註冊表。
在啓動過程中,客户端會向 Eureka 服務器發起 REST 調用,以自我註冊到服務器的實例註冊表中。 當客户端在正常關閉後使用完畢時,客户端會發起另一個 REST 調用,以便服務器可以清除與調用者相關的所有數據。
為了處理非正常客户端關閉,服務器會期望客户端在特定間隔內發送心跳。這被稱為 續訂。如果服務器停止接收心跳超過指定時間,則它將開始驅逐過時的實例。
當心跳低於預期閾值時,阻止驅逐實例 的機制被稱為 自我維護。這可能發生在較差的網絡分區的情況下,此時實例仍在運行,但暫時無法被訪問,或者在客户端突然關閉時發生。
並且當服務器激活自我維護模式時,它會保留實例驅逐,直到續訂率恢復高於預期閾值。
讓我們看看這在行動中。
3. 創建服務器
首先,通過在我們的 Spring Boot 主類上註解 @EnableEurekaServer,創建 Eureka 服務器。
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}現在,讓我們添加基本的配置,以便啓動服務器:
eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false
eureka.instance.hostname=localhost由於我們不想讓 Eureka 服務器與自身註冊,因此我們設置了 eureka.client.registerWithEureka 屬性為 false。在此,eureka.instance.hostname=localhost 屬性尤為重要,因為我們是在本地機器上運行的。否則,我們可能會在 Eureka 服務器中創建不可用的副本,從而影響客户端的心跳計數。
現在,讓我們在下一部分中查看所有配置及其在自我保護方面的相關性。
<h3><strong>3.1. 自保存存配置</strong></h3
<p>默認情況下,Eureka 服務器啓用了自保存存功能。</p>
<p>為了便於理解,我們接下來將逐一分析這些配置項。</p>
<ul>
<li><em>eureka.server.enable-self-preservation</em>: 禁用自保存存的配置項,默認值為 <em>true</em></li
<li><em>eureka.server.expected-client-renewal-interval-seconds</em>: 服務器期望客户端心跳間隔配置,默認值為 <em>30</em></li
<li><em>eureka.instance.lease-expiration-duration-in-seconds</em>: Eureka 服務器在收到客户端最後心跳後等待的時間(秒),用於從其註冊表中刪除客户端——默認值為 <em>90</em></li
<li><em>eureka.server.eviction-interval-timer-in-ms</em>: 此屬性告訴 Eureka 服務器以該頻率運行一個任務,以清除過期的客户端——默認值為 <em>60</em> <em>秒</em></li
<li><em>eureka.server.renewal-percent-threshold</em>: 基於此屬性,服務器計算所有註冊客户端每分鐘的預期心跳次數——默認值為 <em>0.85</em></li
<li><em>eureka.server.renewal-threshold-update-interval-ms</em>: 此屬性告訴 Eureka 服務器以該頻率運行一個任務,以在每分鐘計算所有註冊客户端的預期心跳次數——默認值為 <em>15 分鐘</em></li>
</ul>
<p>在大多數情況下,默認配置已經足夠。但是,對於特定要求,我們可能需要修改這些配置項。 在這些情況下,需要格外小心,以避免出現意外後果,例如 <strong >錯誤的續訂閾值計算或自保存存模式激活延遲</strong ></p>
4. 註冊客户端
現在,我們創建一個 Eureka 客户端並啓動六個實例:
@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}以下是客户端的配置:
spring.application.name=Eurekaclient
server.port=${PORT:0}
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka
eureka.instance.preferIpAddress=true
eureka.instance.lease-renewal-interval-in-seconds=30此配置允許我們使用 PORT 程序參數啓動多個相同的客户端實例。配置項 eureka.instance.lease-renewal-interval-in-seconds 指示客户端向服務器發送的心跳間隔。默認值為 30 秒,這意味着客户端將每 30 秒發送一次心跳。
現在,讓我們使用從 8081 到 8086 的端口號啓動這六個客户端實例,並導航到 http://localhost:8761 以檢查這些實例是否已註冊到 Eureka 服務器。
從截圖中可以看出,我們的 Eureka 服務器有六個已註冊的客户端實例,總續訂閾值為 11。閾值計算基於三個因素:
- 已註冊的客户端實例總數 – 6
- 配置的客户端續訂間隔 – 30 秒
- 配置的續訂百分比閾值 – 0.85
考慮到所有這些因素,在本例中,閾值為 11。
5. 測試自保機制
為了模擬臨時網絡問題,請將客户端的 eureka.client.should-unregister-on-shutdown 屬性設置為 false,並停止其中一個客户端實例。由於我們設置了 should-unregister-on-shutdown 標誌為 false,因此客户端不會調用註銷調用,服務器認為這是一個不優雅的關閉。
現在,讓我們等待 90 秒,這由我們的 eureka.instance.lease-expiration-duration-in-seconds 屬性設置,然後再次導航到 http://localhost:8761。 粗體紅色文本表明 Eureka 服務器現在處於自保模式,並且已停止驅逐實例。
現在,讓我們檢查已註冊的實例部分,看看停止的實例是否仍然可用。正如我們所見,它仍然可用,但狀態為 DOWN:
服務器只能通過啓動停止的實例或禁用自保機制來退出自保模式。 如果我們重複相同的步驟,將標誌 eureka.server.enable-self-preservation 設置為 false,則在配置的租約過期持續時間屬性後,Eureka 服務器將從註冊表中驅逐停止的實例。
6. 結論
在本教程中,我們學習了 Eureka 自保機制的工作原理,以及如何配置與自保相關的不同選項。