одновременные звонки с использованием Spring Webflux и Hystrix - PullRequest
0 голосов
/ 31 января 2020

надеясь, что кто-то может направить меня в правильном направлении, превратив мой код в более оперативный сервисный вызов. для фона у меня есть предшествующая функция, которая сгенерирует список пользователей, затем будет использовать этот список для вызова этой функции getUserDetails для каждого пользователя в списке и возврата карты или списка пользователя + подробности.

@HystrixCommand(commandKey = "getUserDetails")
  public getUserResponse getUserDetails(userRequest request) {
    getUserResponse response = webClient.post()
        .uri(uri)
        .body(BodyInserters.fromObject(request))
        .retrieve()
        .onStatus(HttpStatus::isError, resp -> resp.bodyToMono(getUserError.class).map(errorHandler::mapRequestErrors))
        .bodyToMono(getUserResponse.class).block();

    return response;
  }

В идеале я бы также заменил / удалил отображение ошибок, поскольку оно касается только регистрации возвращенного ответа об ошибке и продолжения. до сих пор я думал, что-то вроде этого, но я не уверен, что webflux / hystrix будет играть хорошо?

@HystrixCommand(commandKey = "getUserDetails", fallbackMethod = "getUserFallback")
  public Mono<getUserResponse> getUserDetails(userRequest request) {
    return = webClient.post()
        .uri(uri)
        .body(BodyInserters.fromObject(request))
        .retrieve()
        .bodyToMono(getUserResponse.class);
  }

  @HystrixCommand
  public Mono<getUserResponse> getUserFallback(userRequest request, Throwable throwable) {
    log.error(//contents of error message returned)
    return mono.empty();
  }

public Flux<UserMap> fetchUserDetails(List<Integer> userIds) {
    return Flux.fromIterable(userIds)
        .parallel()
        .runOn(Schedulers.elastic())
    .flatMap(userDetailsRepository::getUserDetails);
}

1 Ответ

0 голосов
/ 31 января 2020

Hystrix устарела. Если у вас есть шанс, перейдите на resilience4j , который поддерживает Webflux / Reactor.

Spring также имеет специальную поддержку resilience4j.

Относительно обработку ошибок вы можете использовать богатый набор операторов из Mono / Flux API, таких как onErrorReturn или onErrorResume.

...