web-dev-qa-db-ja.com

単一のホストからSpringBootEurekaクライアントの複数のインスタンスを登録する

[〜#〜]更新[〜#〜]

README in this repo が更新され、受け入れられた回答の解決策が示されました。


このガイド に基づいたSpring BootEurekaサービスの登録と検出の簡単な例を使用しています。

1つのクライアントインスタンスを起動すると、正しく登録され、DiscoveryClientを通して自分自身を見ることができます。別の名前で2番目のインスタンスを起動すると、それも機能します。

しかし、同じ名前で2つのインスタンスを起動すると、ダッシュボードには実行中のインスタンスが1つだけ表示され、DiscoveryClientには2番目のインスタンスのみが表示されます。

2番目のインスタンスを強制終了すると、ダッシュボードと検出クライアントから1番目のインスタンスが再び表示されます。

これが私が取っているステップと私が見ているものについてのいくつかの詳細です:

Eurekaサーバー

サーバーを起動します

cd eureka-server
mvn spring-boot:run

Eurekaダッシュボードにアクセスしてください http:// localhost:8761

「インスタンス」はまだ登録されていないことに注意してください

Eurekaクライアント

クライアントを起動します

cd eureka-client
mvn spring-boot:run

http:// localhost:8080 / で直接クライアントにアクセスします

/whoamiエンドポイントは、アプリケーション名とポートに関するクライアントの自己認識を示します。

{
  "springApplicationName":"eureka-client",
  "serverPort":"8080"
}

/instancesエンドポイントは、更新に最大1分かかりますが、最終的には、Eureka DiscoveryClientに登録されているeureka-clientのすべてのインスタンスが表示されます。

[   
    {
      "Host":"hostname",
      "port":8080,
      "serviceId":"EUREKA-CLIENT",
      "uri":"http://hostname:8080",
      "secure":false   
    } 
]

また、Eureka dashoboardに再度アクセスして、そこにリストされていることを確認することもできます。

別の名前の別のクライアントをスピンアップします

次の手順を実行すると、別のクライアントが登録されることがわかります。

cd eureka-client
mvn spring-boot:run -Dspring.application.name=foo -Dserver.port=8081

/whoamiエンドポイントには、名前fooとポート8081が表示されます。

1分ほどで、/instancesエンドポイントにこのfooインスタンスに関する情報も表示されます。

Eurekaダッシュボードで、2つのクライアントが登録されます。

同じで別のクライアントを起動します

次に、ポートパラメータを上書きするだけで、eureka-clientの別のインスタンスを起動してみます。

cd eureka-client
mvn spring-boot:run -Dserver.port=8082

/whoamihttp://localhost:8082エンドポイントは、期待されるものを示しています。

1分ほどで、/instancesエンドポイントにポート8082で実行されているインスタンスも表示されるようになりましたが、何らかの理由で、ポート8080で実行されているインスタンスは表示されません。

また、/instanceshttp://localhost:8080エンドポイントを確認すると、8082で実行されているインスタンスのみが表示されます(明らかに、8080のインスタンスが実行されているのは、それが私たちが求めているものだからです。

Eurekaダッシュボードには、実行中のeureka-clientのインスタンスが1つだけ表示されます。

何が起きてる?

8082で実行されているインスタンスを強制終了して、何が起こるかを見てみましょう。

8080で/instancesをクエリすると、8082のインスタンスのみが表示されます。

しかし、1分後、それはなくなり、8080のインスタンスが再び表示されます。

問題は、両方が実行されているときにeureka-clientの両方のインスタンスが表示されないのはなぜですか。

8
mcwumbly

ローカル展開の場合は、eureka-client.propertiesで{namespace} .instanceIdプロパティを構成(またはSpring Cloudベースのセットアップの場合は適切なyamlファイルの場合はeureka.instance.metadataMap.instanceId)を試してください。これは、Eurekaサーバーがアプリケーションリストを計算し、PeerAwareInstanceRegistryImplのInstanceInfoを比較する方法に深く根ざしています-具体的なデータ(インスタンスメタデータが利用可能など)がなくなると、ホスト名からIDを取得しようとします。

AWSのデプロイにはお勧めしませんが、instanceIdをいじくり回すと、特定のサービスをホストしているマシンを特定するのに問題が発生します。一方、1つのマシンで2つの同一のサービスをホストすることはできないでしょう。

7
bad_habit

Eureka構成ファイルで一意のeuraka.instance.hostnameを設定して、すべてのインスタンスを管理者ポータルに表示するには。

ホスト名は、InstanceInfoをcom.netflix.discovery.shared.Applicationに保存するためのキーとして使用されます(UniqueIdentifierが設定されていないため)。したがって、一意のホスト名を使用する必要があります。このシナリオでリボンをテストすると、負荷のバランスが取れていないことがわかります。

次のapplication.ymlは例です:

server:
  port: ${PORT:0}

info:
  component: example.server

logging:
  level:
    com.netflix.discovery: 'OFF'
    org.springframework.cloud: 'DEBUG'

eureka:
  instance:
    leaseRenewalIntervalInSeconds: 1
    leaseExpirationDurationInSeconds: 1
    metadataMap:
      instanceId: ${spring.application.name}:${spring.application.instance_id:${random.value}}
    instanceId: ${spring.application.name}:${spring.application.instance_id:${random.value}}

これは以前のEurekaのバグです。詳細については、 https://github.com/codecentric/spring-boot-admin/issues/134 で確認できます。

5
Chuan CC