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” возвращать результаты по мере их получения.