web-dev-qa-db-ja.com

Spring Cloud Eureka Serverの自己保存と更新のしきい値について

マイクロサービスの開発は初めてですが、SpringのドキュメントとNetflixのドキュメントの両方を読んで、しばらくの間それについて調査してきました。

シンプルなプロジェクトを開始しました Githubで利用可能 。基本的には、Eurekaサーバー(Archimedes)と3つのEurekaクライアントマイクロサービス(1つのパブリックAPIと2つのプライベート)です。詳細については、githubのreadmeを確認してください。

ポイントは、すべてが実行されているときに、プライベートマイクロサービスの1つが強制終了されると、Eurekaサーバーがそれを認識し、レジストリから削除することです。

I Stackoverflowでこの質問を見つけました で、ソリューションはEureka Server構成でenableSelfPreservation:falseを使用して合格します。しばらくすると、これを行うと、強制終了されたサービスは予想どおりに表示されなくなります。

ただし、次のメッセージが表示されます。

自己保存モードISがオフになりました。これは、ネットワーク/その他の問題の場合にインスタンスの有効期限を保護しない場合があります。

1。自己保存の目的は何ですか? doc は、の自己保存を使用すると、「クライアントはもう存在しないインスタンスを取得できる」ことを示しています。それで、いつオン/オフにすることをお勧めしますか?

さらに、自己保存がオンになっていると、Eureka Serverコンソールの警告に未解決のメッセージが表示される場合があります。

緊急! EUREKAは、インスタンスが存在しないときに、インスタンスが誤って起動する場合があります。更新はしきい値よりも少ないため、インスタンスは安全であるために期限切れになりません。

次に、Spring Eureka Consoleを使用します。

Lease expiration enabled    true/false
Renews threshold    5
Renews (last min)   4

しきい値カウントの奇妙な動作に遭遇しました:Eureka Serverを単独で起動すると、しきい値は1です。

2。単一のEurekaサーバーがあり、registerWithEureka: falseで構成されているため、別のサーバーに登録できません。では、なぜしきい値カウントに表示されるのですか?

3。クライアントごとに、しきい値カウントが+2ずつ増加し始めます。私は彼らが1分あたり2つの更新メッセージを送信するためだと思います、私は正しいですか?

4。 Eurekaサーバーは更新を送信しないため、最後の最小更新は常にしきい値を下回っています。これは正常ですか?

renew threshold 5
rewnews last min: (client1) +2 + (client2) +2 -> 4

サーバーcfg:

server:
  port: ${PORT:8761}

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  server:
    enableSelfPreservation: false
#   waitTimeInMsWhenSyncEmpty: 0

クライアント1 cfg:

spring:
  application:
    name: random-image-microservice

server:
  port: 9999

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
    healthcheck:
      enabled: true
72
codependent

@codependentが出会ったのと同じ質問を受け、たくさんグーグルで調べて実験しました。ここで、Eurekaサーバーとインスタンスがどのように機能するかについての知識を提供するようになりました。

すべてのインスタンスは、eureka.instance.leaseRenewalIntervalInSecondsで定義できる30秒に1回の頻度でEureka Serverへのリースを更新する必要があります。

更新(最後の分):直前にユーレカインスタンスから受信した更新の数を表します

更新しきい値:Eurekaサーバーが1分あたりのEurekaインスタンスからの受信を期待する更新。

たとえば、registerWithEurekafalseに設定されている場合、eureka.instance.leaseRenewalIntervalInSecondsは30に設定され、2つのEurekaインスタンスが実行されます。 2つのEurekaインスタンスが4を1分ごとにEurekaサーバーに更新します。Eurekaサーバーの最小しきい値は1(コードで記述)です。したがって、しきい値は5です。 =(この数値は係数eureka.server.renewalPercentThresholdに乗算されます。これについては後で説明します)。

自己保存モード更新(最後の分)更新しきい値より小さい場合、自己保存モードがアクティブになります。

したがって、上の例では、しきい値が5であるため、SELF PRESERVATION MODEがアクティブになりますが、Eurekaサーバーは1分間に4つの更新しか受信できません。

  1. 質問1:

SELF PRESERVATION MODEは、ネットワーク接続の不良を防ぐ設計です。 EurekaインスタンスAとBの間の接続は良好ですが、接続障害のためにBはEurekaサーバーへのリースを短期間に更新できません。現時点では、Eurekaサーバーは単にインスタンスBをキックアウトすることはできません。 Bは利用可能ですが、AはEurekaサーバーから利用可能な登録サービスを取得しません。したがって、これが自己保存モードの目的であり、有効にすることをお勧めします。

  1. 質問2:

最小しきい値1はコードに記述されています。 registerWithEurekaはfalseに設定されているため、Eurekaインスタンスレジスタはありません。しきい値は1です。

実稼働環境では、通常2つのEurekaサーバーをデプロイし、registerWithEurekaをtrueに設定します。したがって、しきい値は2になり、Eurekaサーバーは1分間に2回それ自体へのリースを更新するため、RENEWALS ARE LESSER THAN THRESHOLDは問題になりません。

  1. 質問3:

はい、あなたは正しいです。 eureka.instance.leaseRenewalIntervalInSecondsは、1分間にサーバーに送信される更新の数を定義しますが、上記のeureka.server.renewalPercentThreshold係数を乗算します。デフォルト値は0.85です。

  1. 質問4:

はい、しきい値の初期値が1に設定されているため、正常です。したがって、registerWithEurekaがfalseに設定されている場合、更新は常にしきい値を下回ります。

これには2つの提案があります。

  1. 2つのEurekaサーバーを展開し、registerWithEurekaを有効にします。
  2. Demo/dev環境にデプロイする場合は、eureka.server.renewalPercentThresholdを0.49に設定することができます。そのため、Eurekaサーバーのみを起動すると、しきい値は0になります。
54
Nie Xing

私は、Eureka here の詳細を含むブログ投稿を作成しました。これは、Spring docまたはNetflixブログから欠落している詳細を埋めます。これは、数日間のデバッグとソースコードの掘り下げの結果です。外部URLにリンクするよりもコピーペーストする方が望ましいと理解していますが、コンテンツはSO回答には大きすぎます。

26
Abhijit Sarkar

Eurekaサーバーのプロパティで更新のしきい値制限を設定してみてください。 eurekaに登録する約3〜4個のマイクロサービスがある場合は、これに設定できます。

eureka.server.renewalPercentThreshold=0.33
0
Vivek Sahu