Что такое Spring MVC на основе Reactor?

Я только что прочитал все, что мог, о Spring и Reactor и понял, что Reactor должен быть включен в грядущую Spring Framework 5 (кстати, кто-нибудь использует это в производстве?)

Меня интересует использование его в Spring MVC, поскольку в настоящее время он не является частью фреймворка, как можно использовать Reactor в Spring MVC? Из онлайн-примеров видно, что использовать Reactor в Spring сейчас, ожидая выхода Framework 5, означает использовать реактор-шину.

Является ли Spring MVC + Reactor в его текущем состоянии просто добавлением шины реактора в приложение MVC?

Взгляд на Github показывает, что реактор-шина, похоже, находится в устаревшем режиме?

Каков текущий способ дать реактивные возможности существующему Spring MVC?


person fobius    schedule 28.07.2017    source источник


Ответы (1)


Spring 5 и WebFlux дадут вам наибольшую выгоду, потому что сама структура использует реактивное программирование и полностью не блокирует, с возможностями сквозной асинхронности, если ваша БД также поддерживает асинхронность (например, Cassandra, Redis, MongoDB). , Couchbase вместе с реактивным Spring Data Kay).

Тем не менее, такая библиотека, как Reactor, может иметь преимущества, даже если ваше приложение не является полностью реактивным. Например, если у вас есть сервисный уровень, требующий большого количества оркестровки. Если эти сервисы представляют задачи как асинхронные типы (в идеале Flux/Mono/Publisher, но также и Future), вы можете связать их с Reactor и использовать мощные операторы для создания сложных конвейеров асинхронной обработки.

Последняя часть — позволить Spring 4.x работать с этими асинхронными результатами. Фреймворк имеет форму поддержки для типа DeferredResult<T>, которую вы можете получить из Flux или Mono (пример ниже упрощен и не показывает ту композицию операторов, о которой я упоминал выше, которая была бы скрыта в сервисе ):

@GetMapping()
public DeferredResult<User> getCurrentUser() {
    DeferredResult<User> result = new DeferredResult();
    Mono<User> mono = myService.getCurrentUser();
    mono.subscribe(
      value -> result.setResult(value),
      error -> result.setErrorResult(error)
    );
    return result;
}
person Simon Baslé    schedule 01.08.2017