web-dev-qa-db-ja.com

REST APIを使用したレジストリとしてのEurekaの使用

SpringBootアプリケーションでEurekaを使用して数か月になります。 @DiscoveryClientアノテーションを使用してアプリケーション間のサービスルックアップを有効にしました。登録、リースの更新、登録解除は期待どおりに機能します。

最近、Java以外のアプリケーションコンポーネント(C++で記述)があり、SpringBootの多くが3 RESTサービスエンドポイントを公開している)というシナリオに遭遇しましたJavaアプリケーションが使用します。C++コンポーネントがEurekaサーバーのREST APIを使用して、起動時に自身を登録できるかどうかを確認しようとしています。これにより、Spring Boot Javaアプリケーションは、Eurekaを介して通常のルックアップを実行し、C++コンポーネントと連絡を取ることができます。

C++コンポーネントでEurekaクライアントを使用できないため(明らかに)、Postmanを使用して直接REST API(説明 ここ ))のテストを開始しました。登録は何もしなくても機能しました。 POSTメソッドを使用してJSONペイロードを http:// eurekaserver:8761/eureka/apps/FOO-APP (instanceId = 1111およびhostName = foo)に送信することによる問題-app)。クエリを実行できます http:// eurekaserver:8761/eureka/apps そしてFOO-APPが期待どおりにリストされているのを確認できます。

ただし、DELETEメソッドを使用してキャンセル操作を試行すると http:// eurekaserver:8761/eureka/apps/FOO-APP/1111 または http:// eurekaserver:8761/eureka/apps/FOO-APP/foo-app 、404エラーが発生します。

InstanceIdの場合:

{
  "timestamp": 1447479397996,
  "status": 404,
  "error": "Not Found",
  "message": "Not Found",
  "path": "/eureka/apps/FOO-APP/1111"
}

または(hostNameでも同じ結果):

{
  "timestamp": 1447479397996,
  "status": 404,
  "error": "Not Found",
  "message": "Not Found",
  "path": "/eureka/apps/FOO-APP/foo-app"
}

いろいろな組み合わせを試しましたが、うまくいきません。明らかな何かが欠けているような気がします-何か小さなものかもしれません。これに関する助けをいただければ幸いです。

PS:Eureka RESTエンドポイントのドキュメントではURLに「v2」と記載されていますが、私の場合は機能しません。登録(私にとってはうまくいく)は、上記のように「v2」を使用しません。誰かがこれを検証できれば、それも役に立ちます。これに関する十分な資料がないようです。

7
Bloodysock

最後に、EurekaサーバーのREST URLを使用してcancel操作を呼び出す方法を理解しました。これはSpringCloud Eurekaサーバーで機能しますが、Netflixでも機能するはずです。 Eurekaサーバー。

cancel操作のURLパターンは次のとおりです。

DELETE http://eureka_Host:eureka_port/eureka/apps/<appName>/<instanceId>

これは Eureka REST操作 ページで文書化されている方法ですが、<instanceId>が何であるかについてはほとんど明確ではありません。ドキュメント、<instanceId>は、Eurekaクライアントを実行するホストのhostnameです。notwork(IPアドレスまたはホスト名)。GETURLが指定したのと同じ値(たとえば、192.168.55.55)またはlocalhostを渡してみました。 。それも機能しませんでした。また、instanceId出力からGET値を渡してみました(これはeureka.instance.metadataMap.instanceIdプロパティの値と同じです)。これも、文字通りさまざまな組み合わせを試してみなければなりませんでした。<instanceId>は、ホスト名とインスタンスIDを:で区切って連結したものです。たとえば、192.168.55.55:foo-app-some-random-str

Eurekaに登録されているアクティブなインスタンスを一覧表示するGET操作の出力例を次に示します。

<instance>
  <hostName>192.168.55.55</hostName>
  <app>FOO-APP</app>
  ...
  <metadata>
    <instanceId>foo-app-f4ea7b06fc03a05a06900713f7526a5d</instanceId>
  </metadata>
  ...
</instance>

この場合、cancelcURLコマンドは次のようになります。

$ curl -X "DELETE" http://eureka_Host:eureka_port/eureka/apps/FOO-APP/192.168.55.55:foo-app-f4ea7b06fc03a05a06900713f7526a5d

これにより、期待どおりにインスタンスの登録が解除されます。

そうは言っても、私はEurekaサーバーのログにあまり注意を払っていなかったことを告白しなければなりません。 Eurekaクライアントを登録すると、ログにインスタンスの完全修飾名(FOO-APP/192.168.55.55:foo-app-f4ea7b06fc03a05a06900713f7526a5d)が出力されます。これは、推測として使用できます。

Eurekaドキュメント で誰かがこれを修正することを願っています。

12
Bloodysock