web-dev-qa-db-ja.com

Spring WebFlux WebClientsでHystrixを使用する方法は?

APIを作成するために関数型エンドポイントでSpringWebFluxを使用しています。必要な結果を提供するには、外部のRESTful APIを使用する必要があります。これを行うには、WebClient実装を使用している非同期の方法で行います。それはうまく機能し、次のようになります:

public WeatherWebClient() {
    this.weatherWebClient = WebClient.create("http://api.openweathermap.org/data/2.5/weather");
}

public Mono<WeatherApiResponse> getWeatherByCityName(String cityName) {
    return weatherWebClient
            .get()
            .uri(uriBuilder -> uriBuilder
                                .queryParam("q", cityName)
                                .queryParam("units", "metric")
                                .queryParam("appid", API_KEY)
                                .build())
            .accept(APPLICATION_JSON)
            .retrieve()
            .bodyToMono(WeatherApiResponse.class);
}

これはネットワークアクセスを実行するため、NetFlix OSSHystrixの優れた使用例です。上記のメソッドに@HystrixCommandを追加してspring-cloud-starter-netflix-hystrixを使用しようとしましたが、間違ったURL(404)または間違ったAPI_KEY(401)を設定しても、回路をトリップさせる方法はありません。 。

これはWebFlux自体との互換性の問題である可能性があると思いましたが、プロパティ@HystrixProperty(name = "circuitBreaker.forceOpen"、value = "true")を設定すると、フォールバックメソッドが強制的に実行されます。

私は何かが足りないのですか?このアプローチはSpringWebClientsと互換性がありませんか?

ありがとう!

8
Michel Nagme

@HystrixCommandは実際には機能しません。これは、HystrixがJavaプリミティブとは異なるMono/Fluxを脅かさないためです。

HystrixはMonoのコンテンツを監視しませんが、public Mono<WeatherApiResponse> getWeatherByCityName(String cityName)の呼び出しの結果のみを監視します。

リアクティブコールチェーンの作成は常に成功するため、この結果は常に問題ありません。

必要なのは、Hystrixの脅威をMono/Fluxとは異なるものにすることです。 Spring Cloudには、HystrixCommandでMono/Fluxをラップする builder があります。

Mono<WeatherApiResponse> call = this.getWeatherByCityName(String cityName);

Mono<WeatherApiResponse> callWrappedWithHystrix = HystrixCommands
                                .from(call)
                                .fallback(Mono.just(WeatherApiResponse.EMPTY))
                                .commandName("getWeatherByCityName")
                                .toMono();
15
Alex Derkach