単一のホストから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
/whoami
のhttp://localhost:8082
エンドポイントは、期待されるものを示しています。
1分ほどで、/instances
エンドポイントにポート8082で実行されているインスタンスも表示されるようになりましたが、何らかの理由で、ポート8080で実行されているインスタンスは表示されません。
また、/instances
のhttp://localhost:8080
エンドポイントを確認すると、8082で実行されているインスタンスのみが表示されます(明らかに、8080のインスタンスが実行されているのは、それが私たちが求めているものだからです。
Eurekaダッシュボードには、実行中のeureka-client
のインスタンスが1つだけ表示されます。
何が起きてる?
8082で実行されているインスタンスを強制終了して、何が起こるかを見てみましょう。
8080で/instances
をクエリすると、8082のインスタンスのみが表示されます。
しかし、1分後、それはなくなり、8080のインスタンスが再び表示されます。
問題は、両方が実行されているときにeureka-client
の両方のインスタンスが表示されないのはなぜですか。
ローカル展開の場合は、eureka-client.propertiesで{namespace} .instanceIdプロパティを構成(またはSpring Cloudベースのセットアップの場合は適切なyamlファイルの場合はeureka.instance.metadataMap.instanceId)を試してください。これは、Eurekaサーバーがアプリケーションリストを計算し、PeerAwareInstanceRegistryImplのInstanceInfoを比較する方法に深く根ざしています-具体的なデータ(インスタンスメタデータが利用可能など)がなくなると、ホスト名からIDを取得しようとします。
AWSのデプロイにはお勧めしませんが、instanceIdをいじくり回すと、特定のサービスをホストしているマシンを特定するのに問題が発生します。一方、1つのマシンで2つの同一のサービスをホストすることはできないでしょう。
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 で確認できます。