9

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

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

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

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

インスタンス ID を使用:

{
  "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」を使用しません。誰かがこれを検証できれば、それも役に立ちます。これについては、十分な資料がないようです。

4

1 に答える 1

16

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

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

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

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

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

<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のドキュメントでこれを修正してくれることを願っています。

于 2015-12-16T19:18:22.870 に答える