マイクロサービスの開発は初めてですが、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
@codependentが出会ったのと同じ質問を受け、たくさんグーグルで調べて実験しました。ここで、Eurekaサーバーとインスタンスがどのように機能するかについての知識を提供するようになりました。
すべてのインスタンスは、eureka.instance.leaseRenewalIntervalInSeconds
で定義できる30秒に1回の頻度でEureka Serverへのリースを更新する必要があります。
更新(最後の分):直前にユーレカインスタンスから受信した更新の数を表します
更新しきい値:Eurekaサーバーが1分あたりのEurekaインスタンスからの受信を期待する更新。
たとえば、registerWithEureka
がfalseに設定されている場合、eureka.instance.leaseRenewalIntervalInSeconds
は30に設定され、2つのEurekaインスタンスが実行されます。 2つのEurekaインスタンスが4を1分ごとにEurekaサーバーに更新します。Eurekaサーバーの最小しきい値は1(コードで記述)です。したがって、しきい値は5です。 =(この数値は係数eureka.server.renewalPercentThreshold
に乗算されます。これについては後で説明します)。
自己保存モード:更新(最後の分)が更新しきい値より小さい場合、自己保存モードがアクティブになります。
したがって、上の例では、しきい値が5であるため、SELF PRESERVATION MODEがアクティブになりますが、Eurekaサーバーは1分間に4つの更新しか受信できません。
SELF PRESERVATION MODEは、ネットワーク接続の不良を防ぐ設計です。 EurekaインスタンスAとBの間の接続は良好ですが、接続障害のためにBはEurekaサーバーへのリースを短期間に更新できません。現時点では、Eurekaサーバーは単にインスタンスBをキックアウトすることはできません。 Bは利用可能ですが、AはEurekaサーバーから利用可能な登録サービスを取得しません。したがって、これが自己保存モードの目的であり、有効にすることをお勧めします。
最小しきい値1はコードに記述されています。 registerWithEureka
はfalseに設定されているため、Eurekaインスタンスレジスタはありません。しきい値は1です。
実稼働環境では、通常2つのEurekaサーバーをデプロイし、registerWithEureka
をtrueに設定します。したがって、しきい値は2になり、Eurekaサーバーは1分間に2回それ自体へのリースを更新するため、RENEWALS ARE LESSER THAN THRESHOLD
は問題になりません。
はい、あなたは正しいです。 eureka.instance.leaseRenewalIntervalInSeconds
は、1分間にサーバーに送信される更新の数を定義しますが、上記のeureka.server.renewalPercentThreshold
係数を乗算します。デフォルト値は0.85です。
はい、しきい値の初期値が1に設定されているため、正常です。したがって、registerWithEureka
がfalseに設定されている場合、更新は常にしきい値を下回ります。
これには2つの提案があります。
registerWithEureka
を有効にします。eureka.server.renewalPercentThreshold
を0.49に設定することができます。そのため、Eurekaサーバーのみを起動すると、しきい値は0になります。私は、Eureka here の詳細を含むブログ投稿を作成しました。これは、Spring docまたはNetflixブログから欠落している詳細を埋めます。これは、数日間のデバッグとソースコードの掘り下げの結果です。外部URLにリンクするよりもコピーペーストする方が望ましいと理解していますが、コンテンツはSO回答には大きすぎます。
Eurekaサーバーのプロパティで更新のしきい値制限を設定してみてください。 eurekaに登録する約3〜4個のマイクロサービスがある場合は、これに設定できます。
eureka.server.renewalPercentThreshold=0.33