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と互換性がありませんか?
ありがとう!
@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();