3

ドキュメントに記載されているように、RestTemplate クライアントが Eureka を使用してリモート サービスを検出し、Ribbon を使用して呼び出しを転送することに成功しました。基本的には、Application クラスに次の注釈を追加するだけで、残りは Spring-Boot の魔法に任せることができました。

@Configuration
@ComponentScan
@EnableAutoConfiguration
@EnableDiscoveryClient

(PS: 1.0.0.M3 ではなく spring-cloud:1.0.0-SNAPSHOT-BUILD を使用していることにお気付きでしたか?しかし、これは私の問題には影響していないようです)。

2 つのサービス インスタンスが開始されると、rest-template クライアントは 2 つの間で要求の負荷を正常に分散します。ただし、Eureka ロード バランサーが通知する前に最初のインスタンスが停止した場合、クライアントは 2 番目のインスタンスにフォールバックせず、代わりに例外がスローされます。

したがって、私の質問: 最初に選択したインスタンスが使用できない場合に、別のインスタンスへの呼び出しを自動的に再試行するように RestTemplate/Ribbon/Eureka スタックを構成する方法はありますか? Zuulプロキシと偽装クライアントはこれを「すぐに」実行できるため、ライブラリには必要な機能が含まれていると思います...

アイデア/ヒントはありますか?

Thx、/ベルトラン

4

2 に答える 2

4

サポート自体は再試行のRestTemplate方法を認識していません (お気づきのように、Spring Cloud の Feign クライアントとプロキシ サポートは認識しています)。自分で追加するオプションが提供されるため、これはおそらく良いことだと思います。たとえば、Spring Retryを使用すると、単純な宣言型スタイルで実行できます。

@Retryable
public Object doSomething() {
   // use your RestTemplate here
}

(そしてあなたに追加@EnableRetryします@Configuration)。@HystrixCommand(Spring Cloud / Javanicaから)との素晴らしい組み合わせになります:

@HystrixCommand
@Retryable
public Object doSomething() {
   // use your RestTemplate here
}

この形式では、再試行が成功した場合でも、すべての失敗がサーキット ブレーカーのメトリックにカウントされます (変更できる場合もあれば、そのままにしておくことが理にかなっている場合もあります)。

于 2014-12-15T06:25:28.487 に答える
0

インターセプターの順序が原因で、 @Configuration クラスまたは @Retryable メソッドのアノテーションの順序に関係なく、@HystrixCommand と @Retryable の両方で動作させることができませんでした。一致する一連のメソッドを持つ別のクラスを作成することでこれを解決し、@HystrixCommand アノテーション付きメソッドを 2 番目のクラスの対応する @Retryable メソッドに委譲させました。おそらく、2 つのクラスに同じインターフェースを実装させることができます。これは厄介な問題ですが、注文を構成できるようになるまでは、これしか考えられませんでした。Dave Syer と spring cloud の連中からの実際の解決策をまだ待っています。

public class HystrixWrapper {
    @Autowired
    private RetryableWrapper retryableWrapper;

    @HystrixCommand
    public Response doSomething(...) {
        return retryableWrapper.doSomething(...);
    }
}

public class RetryableWrapper {
    @Autowired
    private RestTemplate restTemplate;

    @Retryable
    public Response doSomething(...) {
        // do something with restTemplate;
    }
}
于 2015-10-12T19:18:43.210 に答える