Spring Webflux - это последняя версия Spring, переработанная для создания неблокирующих приложений с использованием реактора проекта. Основное отличие заключается в сервере приложений: с Webflux ваше приложение будет работать под управлением Netty, который представляет собой структуру сетевых приложений, управляемых асинхронными событиями, вместо Tomcat .

Реактивное программирование

Если вы не знакомы с таким подходом к программированию, вы должны знать, что мы создаем приложения, основанные на потоке данных и распространении событий / изменений данных или условий.

Проектный реактор

Это интересный фреймворк, который приносит реактивное программирование на Java после javaRx. Основными элементами этой библиотеки являются два класса:

  • Mono ‹T› - это издатель, который производит от 0 до 1 значение T
  • Flux ‹T› - это издатель, который производит от 0 до N значений T

Оба класса следуют базовому, но фундаментальному принципу:

Ничего не произойдет, пока вы не подпишетесь

Это означает, что все операции ленивы и выполняются только при вызове метода подписки.

Наш пример

Чтобы понять суть реактора, мы собираемся попробовать простые операции CRUD с сохранением сущностей на MongoDB. Важно помнить, что на данный момент Spring Data Reactive поддерживает только: MongoDB, Cassandra и Redis.

Зависимости

Хранилища

Будет выглядеть так же, как Spring Data с небольшими изменениями:

Книжная служба

Создавать

Мы хотим вставить книгу только в том случае, если ее автор существует, иначе будет сгенерировано исключение.

  • flatMap () - это операция, аналогичная map (), но с максимальной глубиной, равной 1. Например, мы можем использовать ее для перехода от Mono<Mono<Book>> к Mono<Book>, как в строке 4 сути.
  • switchIfEmpty () или defaultIfEmpty () позволяет обрабатывать пустые значения, генерирующие ошибки или устанавливающие значения по умолчанию.

Читать

Первая суть очень проста: мы вызываем метод репозитория данных Spring. Ниже мы собираемся выполнить запрос для получения страницы из n элементов.

Мы вернем результаты в BookResult, описанные следующими атрибутами:

  • Список ‹Book› данных
  • Целочисленная страница
  • Целочисленные элементы

Чтобы составить наш результат, первым делом нужно подсчитать количество книг в БД, после чего мы заполним данные, выполняя запрос с помощью pageRequest. Если на странице 0 элементов, мы вернем ошибку.

  • flatMapMany () похож на flatMap (), но позволяет переключаться с Mono<Flux<Book>> на Flux<Book>.

Обновлять

Этот метод выполнит простое обновление, проверив, существует ли книга.

Удалить

Книжный контроллер

Без больших изменений, каждая конечная точка вернет aFlux<T> илиMono<T>

Предостережения

Spring WebFlux и проект-реактор - хорошие союзники для создания неблокирующих приложений с использованием минимального количества ресурсов без ущерба для производительности.

При создании сложных приложений, если вы «пристрастились» к Spring, вы обнаружите, что многие вещи не полностью совместимы.

  • Spring security несовместим, вам придется использовать webflux-security
  • В Spring Data Reactive не хватает некоторых вещей, хотя это стабильный проект и он несовместим с базами данных SQL.
  • При работе с Flux и Mono важно знать, что вы не можете выполнять операции блокировки (block (), blockLast (), blockFirst () ...), если метод возвращает реактивный тип
  • Но также хорошие новости ... если клиент поддерживает потоковую передачу, вы сможете с помощью CONTENT_TYPE = ”text / event-stream” возвращать результаты по мере их получения.