1

私はSpring HATEOASを使用してRESTサービスを構築し、アクセスしています。サービスはユーレカサーバに登録され、私はリボンを使って(@LoadBalanced RestTemplate経由で)呼び出す。Spring HATEOASとRibbon with Eureka - 作成されたリンクのホスト名

デフォルトでは、解決されたインスタンスのホスト名(Hostヘッダー)に対する要求が行われます。これにより、Spring HATEOASのLinkBuilderがこのホストのリンクを生成します。リボンがリンクをたどるように要求すると、それはユーレカのリンクホスト名を再度検索しようとしますが、もちろん結果は得られません。

この状況に対処するにはどのようなレベルが最適ですか?最初の結果とのリンクを受け取った後、直後のリクエストを同じサービスインスタンスに送ることは受け入れられるだろうと思うが、シンボリックサービス名へのすべての要求がより良くなると感じている。

Hostヘッダーにそのサービス名でリクエストを行うようにリボンを設定することはできますか(対象サービスに仮想ホスティングは存在しないと仮定しますが、これは正当な仮定のようです)。

それ以外の場合は、HATEOASのリンクビルダーの標準ベースURLを設定することはできますか? (すべてのリンクを完全な文字列として定義することはできません)

解決策/回避策は、ルートリソースを要求するときに明示的にX-Forwarded-Hostヘッダーを設定しています。これは動作しますが、少し冗長で面倒です。

Traverson traverson = new Traverson(URI.create("http://photo-store/"), MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON_UTF8, MediaTypes.HAL_JSON).setRestOperations(imageService); 
HttpHeaders httpHeaders = new HttpHeaders(); 
httpHeaders.set("X-Forwarded-Host", "photo-store"); 
String original = this.traverson.follow("image:original").withHeaders(httpHeaders).asTemplatedLink().expand(photoId).getHref(); 

(サイド質問:私はそのようなHostヘッダを上書きするか、それはリボンやRestTemplateに特別な治療であることができますか?)

を私が感じるより宣言や条約や構成に基づく方法があるべきことこれに対処する。ある?

+0

ルートサービスは正しいURLを知っていますか?ユーレカとRIbbonを使用するのはなぜですか?なぜ、リクエストを行うために通常の 'RestTemplate'を使用しないのですか? –

+0

わかりません。 1つの消費するサービスがあります。 eurekaサービス名を使用して、ロードバランスされたRestTemplateを使用してターゲットサービスのルートリソースを要求します。私の回避策がなければ、応答には応答するインスタンスの物理アドレスへのリンクが含まれています。これらのURLへのリクエストは、同じロードバランスのRestTemplateでは機能しません。 1つのアプローチは、別の通常のRestTemplateでこれらのURLへのリクエストを作成することです。私はユーレカのサービス名へのリンクを取得し、同じRestTemplateでリクエストすることを好みます。それはより弾力的です。私にそうでないと確信させてください:) – rainerfrey

+0

文脈は、私がSpring Cloudを探索する遊び場プロジェクトであり、生産を目的とするものではないことを指摘することは公正であるようです。 – rainerfrey

答えて

0

私も同じ問題に直面しました。私はすべてのリクエストにX-Forwarded-Hostヘッダーを追加するインターセプターを追加して解決しました。

@Bean 
@LoadBalanced 
RestTemplate restTemplate() { 
    RestTemplate restTemplate = new RestTemplate(); 
    restTemplate.setInterceptors(singletonList((ClientHttpRequestInterceptor) (request, body, execution) -> { 
     request.getHeaders().add("X-Forwarded-Host", request.getURI().getHost()); 
     return execution.execute(request, body); 

    })); 
    return restTemplate; 
} 
関連する問題