2015-11-14 29 views
5

ここ数ヶ月間、EurekaをSpringブートアプリケーションで使用しています。 @DiscoveryClientアノテーションを使用してアプリケーション間のサービス検索を有効にしました。登録、リースの更新、および登録解除は、期待通りに機能します。EurekaをREST APIを使用したレジストリとして使用

最近では、Spring以外のJavaアプリケーションコンポーネント(C++で書かれています)があり、Spring Boot Javaアプリケーションの多くが使用する3つのRESTサービスエンドポイントを公開しています。 C++コンポーネントがEurekaサーバーのREST APIを使用して自身を登録することができるかどうかを確認しようとしています。そのため、SpringブートJavaアプリケーションはEurekaを介してC++コンポーネントと連絡を取り合うことができます。

私はC++コンポーネント(明らかに)でEureka Clientを使うことができないので、Postmanを使って直接REST APIを(hereのように)テストし始めました。 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" 
} 

OR(ホスト名の同じ結果):

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

私はさまざまな組み合わせを試してみましたが、私はこの仕事をすることはできませんよ。私は何かが分かりにくいと感じています - 小さなものかもしれません。これについての助けに感謝します。

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

+1

代わりにサイドカーを使用したことはありますか? C++アプリケーションが他のデプロイされたサービスに接続したい場合は、登録を扱い、逆プロキシとしても機能します。アプリケーションでは、定義済みの形式で状態を公開するだけです。 –

+0

これはオプションです。しかし、私はストレートRESTエンドポイントを呼び出すことによってこれを達成しようとしています。私の意見では、cURL呼び出しが機能するはずです。しかし、それは起こっていない。 – Bloodysock

+0

spring-cloudにはv2が含まれていませんでした。おそらく間違ったinstanceIdを使用しています。あなたはどの春の雲のバージョンを使用していますか?アプリケーションのどこかで 'instanceId'を設定していますか? – spencergibb

答えて

5

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

cancel操作用のURLパターンは以下の通りである:

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

これは、それがEureka REST operationsページで文書化されている方法ですが、<instanceId>をすることになったものとのような非常に小さな透明度があります。ドキュメントに従って、<instanceId>は、ユーレカクライアントを実行するホストのホスト名です。それはではなく、の仕事(IPアドレスまたはホスト名)でした。 URLがGET(192.168.55.55など)またはlocalhostと同じ値を渡してみました。それはどちらもうまくいかなかった。また、GET出力(これはeureka.instance.metadataMap.instanceIdプロパティの値と同じになる)からinstanceIdの値を渡してみました。それも働きませんでした。私は文字通りこれを見つけるためにさまざまな組み合わせを試さなければなりませんでした。 <instanceId>は、:で区切られたホスト名とインスタンスIDの連結です。たとえば、192.168.55.55:foo-app-some-random-strです。ここで

はユーレカに登録アクティブなインスタンスリストGET操作の出力例です:この場合

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

を、cancelのcURLコマンドは次のようになります。

解除う
$ curl -X "DELETE" http://eureka_host:eureka_port/eureka/apps/FOO-APP/192.168.55.55:foo-app-f4ea7b06fc03a05a06900713f7526a5d 

期待どおりにインスタンスを登録します。

つまり、私はユーレカのサーバーログに多くの注意を払っていなかったと告白する必要があります。ユーレカクライアントを登録すると、ログはインスタンスの完全修飾名(FOO-APP/192.168.55.55:foo-app-f4ea7b06fc03a05a06900713f7526a5d)を出力しました。私はこれを推測として使用できました。

誰かがEureka documentationにこれを修正してもらいたいと思います。

関連する問題