1. 概要

このチュートリアルでは、Eurekaの自己保存と更新について学習します。

まず、複数のEurekaクライアントインスタンスと一緒にEurekaサーバーを作成します。

次に、これらのクライアントをEurekaサーバーに登録して、自己保存がどのように機能するかを示します。

2. ユーレカ自己保存

自己保存について説明する前に、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.registerWithEurekafalseとして設定しました。 ここで、プロパティ eureka.instance.hostname = localhost は、ローカルマシンで実行しているため、特に重要です。 そうしないと、Eurekaサーバー内に使用できないレプリカが作成され、クライアントのハートビート数が台無しになる可能性があります。

次のセクションでは、自己保存のコンテキストですべての構成とその関連性を見てみましょう。

3.1. 自己保存構成

デフォルトでは、Eurekaサーバーは自己保存を有効にして実行されます。

ただし、理解を深めるために、サーバー側でこれらの各構成を確認してみましょう。

  • eureka.server.enable-self-preservation :自己保存を無効にするための構成–デフォルト値は true
  • eureka.server.expected-client-renewal-interval-seconds :サーバーは、このプロパティで構成された間隔でクライアントのハートビートを予期しています。デフォルト値は30です。
  • eureka.instance.lease-expiration-duration-in-seconds :Eurekaサーバーがクライアントから最後のハートビートを受信してから、そのクライアントをレジストリから削除する前に待機する時間を秒単位で示します。デフォルト値は90です。
  • eureka.server.eviction-interval-timer-in-ms :このプロパティは、Eurekaサーバーにこの頻度でジョブを実行して、期限切れのクライアントを削除するように指示します。デフォルト値は60です。
  • eureka.server.renewal-percent-threshold :このプロパティに基づいて、サーバーは登録されているすべてのクライアントから1分あたりの予想心拍数を計算します。デフォルト値は 0.85
  • eureka.server.renewal-threshold-update-interval-ms :このプロパティは、Eurekaサーバーにこの頻度でジョブを実行して、この分に登録されているすべてのクライアントからの予想心拍数を計算するように指示します。これはデフォルト値です。は15分

ほとんどの場合、デフォルトの構成で十分です。 ただし、特定の要件については、これらの構成を変更したい場合があります。 これらの場合は、更新しきい値の計算の誤りや自己保存モードのアクティブ化の遅延などの予期しない結果を回避するために、細心の注意を払う必要があります

4. クライアントの登録

それでは、Eurekaクライアントを作成し、6つのインスタンスを起動してみましょう。

@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秒ごとに1つのハートビートを送信することを意味します。

次に、8081から8086までのポート番号でこれらの6つのクライアントインスタンスを起動し、 http:// localhost:8761 に移動して、これらのインスタンスがEurekaサーバーに登録されているかどうかを調べます。

スクリーンショットから、Eurekaサーバーに6つの登録済みクライアントインスタンスがあり、合計更新しきい値が11であることがわかります。 しきい値の計算は、次の3つの要素に基づいています。

  • 登録されたクライアントインスタンスの総数– 6
  • 構成されたクライアント更新間隔–30秒
  • 構成された更新パーセンテージのしきい値– 0.85

これらすべての要因を考慮すると、この場合、しきい値は11です。

5. 自己保存のテスト

一時的なネットワークの問題をシミュレートするために、クライアント側でプロパティeureka.client.should-unregister-on-shutdownfalseとして設定し、クライアントインスタンスの1つを停止しましょう。 。 should-unregister-on-shutdownフラグをfalseに設定したため、クライアントは登録解除呼び出しを呼び出さず、サーバーはこれが不正なシャットダウンであると見なします

eureka.instance.lease-expiration-duration-in-seconds プロパティで設定された90秒間待ってから、 http:// localhost:8761に再度移動します。 赤い太字のテキストは、Eurekaサーバーが自己保存モードになり、インスタンスの削除を停止したことを示します。

次に、登録済みインスタンスのセクションを調べて、停止したインスタンスがまだ使用可能かどうかを確認します。 ご覧のとおり、利用可能ですが、ステータスはDOWNです。

サーバーが自己保存モードから抜け出す唯一の方法は、停止したインスタンスを起動するか、自己保存自体を無効にすることです。フラグを設定して同じ手順を繰り返す場合 eureka.server.enable-self-preservation as false の場合、Eurekaサーバーは、構成されたリース有効期限プロパティの後に、停止したインスタンスをレジストリから削除します。

6. 結論

このチュートリアルでは、Eurekaの自己保存がどのように機能するか、および自己保存に関連するさまざまなオプションを構成する方法を学習しました。

ここで示したすべての例は、GitHubにあります。