知識庫 / Spring / Spring Boot RSS 訂閱

Eureka 自保與再生指南

Cloud,Spring Boot
HongKong
5
01:07 PM · Dec 06 ,2025

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 自保機制的工作原理,以及如何配置與自保相關的不同選項。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.