[解決済み] Spring Cloud Eureka Server の自己保存と更新閾値を理解する
質問
マイクロサービスについては、SpringのドキュメントとNetflixのドキュメントの両方を読んで、しばらく研究してきましたが、私はマイクロサービスを開発するのは初めてです。
私は簡単なプロジェクトを開始しました Githubで公開されている . 基本的にはEurekaサーバ(Archimedes)と3つのEurekaクライアントマイクロサービス(1つはパブリックAPI、2つはプライベートAPI)になっています。詳細な説明はgithubのreadmeを参照してください。
ポイントは、すべてが実行されているときに、プライベートなマイクロサービスの1つが殺された場合、Eurekaサーバーがそれを認識してレジストリから削除することです。
I
Stackoverflowでこの質問を見つけました。
で、解決策は
enableSelfPreservation:false
を使うことで解決しました。これを実行すると、しばらくして期待通り殺されたサービスが消えます。
しかし、以下のようなメッセージが表示されます。
自己保存モードはオフになっています。 の有効期限を保護できない可能性があります。
1. 自己保存の目的は何ですか?その doc に自己保存があることを明記しています。 "client can get the instances that no exist anymore" . では、どのような場合にオン/オフを切り替えるのが望ましいのでしょうか?
さらに、自己保存がオンになっていると、Eureka Serverのコンソールの警告に未解決のメッセージが表示されることがあります。
エマージェンシー! Eureka はインスタンスが稼働しているにもかかわらず、誤って稼働していると主張している可能性があります。 していません。更新がしきい値より少ないため、安全のため 更新が閾値より少ないため、念のため期限切れにならないようにしています。
さて、Spring Eureka Consoleのほうはというと。
Lease expiration enabled true/false
Renews threshold 5
Renews (last min) 4
Eureka Server単体で起動すると閾値が1になってしまうという、閾値カウントの奇妙な挙動に出くわしたことがあります。
2. Eurekaサーバは1台で、以下の構成になっています。
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サーバとインスタンスの仕組みについて少し貢献したいと思います。
各インスタンスは、30秒に1回の頻度でEurekaサーバへのリースを更新する必要があります。
eureka.instance.leaseRenewalIntervalInSeconds
.
ニュース (最終更新日) : 直前に Eureka インスタンスから受け取った更新の数を表します。
更新の閾値 : Eureka サーバが 1 分間に Eureka インスタンスから受け取ることを期待する更新回数です。
例えば
registerWithEureka
に設定されている場合
false
,
eureka.instance.leaseRenewalIntervalInSeconds
を30に設定し、Eurekaインスタンスを2台起動します。2台のEurekaインスタンスは
4
の更新を行い、Eurekaサーバの最小閾値は
1
(コードで書かれている)ため、閾値は
5
(となります(この数値に係数
eureka.server.renewalPercentThreshold
を掛けたもので、後述します)。
自己保存モード : もし 更新(最終分) が 更新のしきい値 を下回ると、自己保存モードが有効になります。
つまり、上の例では、閾値は5ですが、Eurekaサーバは4更新/分しか受信できないので、SELF PRESERVATION MODEが有効になります。
- 質問1:
SELF PRESERVATION MODEは、ネットワークの接続不良を回避するために設計されています。EurekaインスタンスAとBの接続は良好だが、BがEurekaサーバへのリース更新に短期間で失敗した場合、EurekaサーバはインスタンスBを簡単に追い出すことができません。これがSELF PRESERVATION MODEの目的であり、ONにしておいた方が良いということです。
- 質問2:
最小限の閾値1がコードに書かれています。
registerWithEureka
が false に設定されているため、Eureka インスタンスの登録はなく、閾値は 1 になります。
本番環境では、一般的に2台のEurekaサーバと
registerWithEureka
がtrueに設定されます。そのため、閾値は2であり、Eurekaサーバは自分自身に対して2回/分のリース更新を行うので
RENEWALS ARE LESSER THAN THRESHOLD
は問題ないでしょう。
- 質問3:
はい、その通りです。
eureka.instance.leaseRenewalIntervalInSeconds
は 1 分間にどれだけの更新がサーバに送られるかを定義しますが、その際に係数として
eureka.server.renewalPercentThreshold
を掛けたもので、デフォルトは 0.85 です。
- 質問4:
はい、正常です。閾値の初期値は1に設定されているので、もし
registerWithEureka
がfalseに設定されている場合、更新は常に閾値以下になります。
これには2つの提案があります。
-
2台のEurekaサーバーを導入し
registerWithEureka
. -
デモ/デブ環境にデプロイするだけなら
eureka.server.renewalPercentThreshold
を 0.49 に設定すると、Eureka サーバを単独で立ち上げたときに、閾値が 0 になります。
関連
-
[解決済み] クラスを@Componentでアノテートした場合、Spring BeanとSingletonということになるのでしょうか?
-
[解決済み] Spring @PostConstruct と init-method 属性の比較
-
[解決済み] SpringでLocalDateTime RequestParamを使用するには?StringからLocalDateTimeへの変換に失敗しました」と表示される。
-
[解決済み] Spring: 静的フィールドに値を注入するには?
-
[解決済み] Spring Securityをセッションなしで使用するにはどうすればよいですか?
-
[解決済み] Springは@Autowiredアノテーションを付けずにコンストラクタに依存性を注入する
-
[解決済み] Spring AOP: JoinPointとPointCutの違いは何ですか?
-
[解決済み] SpringアプリケーションのコンテキストをJunitのテストクラスで再利用する
-
[解決済み] Springの自動配線からサブパッケージを除外する?
-
[解決済み] RestController と @RepositoryRestResource の使い分けについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Spring Hibernate - 現在のスレッドでトランザクションに同期したセッションを取得できませんでした。
-
[解決済み] 複数のBeanが見つかった場合、Springはどのように名前による自動配線を行うのですか?
-
[解決済み] Maven依存性 spring-webとspring-webmvcの比較
-
[解決済み] 同じurlパターンに対して異なる引数で2つのメソッドを作成する
-
[解決済み] Spring BootとMongoDBへの接続設定方法
-
[解決済み] Spring DAOとSpring ORMとSpring JDBCの比較
-
[解決済み] Spring: 静的フィールドに値を注入するには?
-
[解決済み] Springは@Autowiredアノテーションを付けずにコンストラクタに依存性を注入する
-
[解決済み] Spring CORS 'Access-Control-Allow-Origin' ヘッダが存在しない。
-
[解決済み] URI [/WEB-INF/pages/apiForm.jsp] を持つ HTTP リクエストのマッピングが見つかりません [重複]。