Как использовать Hystrix с Spring WebFlux WebClients? - PullRequest
0 голосов
/ 04 июня 2018

Я использую Spring WebFlux с функциональными конечными точками для создания API.Чтобы получить желаемые результаты, мне нужно использовать внешний 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 OSS Hystrix.Я попытался использовать spring-cloud-starter-netflix-hystrix, добавив @HystrixCommand к описанному выше методу, но нет способа заставить его отключить схему, даже если я установил неверный URL (404) или неправильный API_KEY (401).

Я думал, что это может быть проблемой совместимости с самим WebFlux, но установка свойства @HystrixProperty (name = "circuitBreaker.forceOpen", value = "true") действительно заставляет работать резервный метод.

Я что-то упустил?Является ли этот подход несовместимым с Spring WebClients?

Спасибо!

1 Ответ

0 голосов
/ 15 июля 2018

@ HystrixCommand действительно не будет работать, потому что Hystrix не угрожает Mono / Flux ничем не отличается от примитивов Java.

Hystrix не контролирует содержимое Mono, а только результат вызова public Mono<WeatherApiResponse> getWeatherByCityName(String cityName).

Этот результат всегда в порядке, потому что создание цепочки реактивных вызовов всегда будет успешным.

Что вам нужно, так это сделать Hystrix угрозой Mono / Flux по-другому.В Spring Cloud есть компоновщик , чтобы обернуть Mono / Flux с помощью HystrixCommand.

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

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