Рубрики
Без рубрики

Spring Web flux – Реактивные Java-приложения – Часть 1

В последнее время реактивное программирование расширяется все больше и больше, оно уже решается… Помеченный как spring, web flux, reactive, java.

В последнее время реактивное программирование расширяется все больше и больше, им уже занимаются несколько языков, но в Java это что-то новое для вас? Тогда эта серия статей для вас!

В этой серии статей я рассмотрю такие вопросы, как реактивное программирование, Spring Web flux, Project Reactor и Netty.

В этом первом я расскажу о некоторых общих концепциях, прежде чем углубляться в каждую из них, поехали:

Проблема:

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

Чтобы решить это, у нас было создание обратных вызовов и фьючерсов: обратные вызовы нелегко читать и сложно поддерживать, они сложны (они могут образовывать адский обратный вызов), через который невозможно вернуть какое-либо значение.

Будущее: возвращает экземпляр типа future, и его трудно масштабировать для нескольких асинхронных операций, в качестве альтернативы из Java 8 появилось завершаемое будущее, которое поддерживает функциональное и простое программирование с использованием нескольких асинхронных операций, однако, поскольку ничто не идеально, не является хорошим вариантом для асинхронных вызовов с несколькими элементами.

Альтернативный способ разработки API

  • Асинхронный и неблокирующий
  • За пределами модели потоков по требованию
  • Уменьшает количество созданных потоков

И тут появляется реактивное программирование, хорошо, но чем оно отличается?

  • асинхронный и неблокирующий
  • Поток данных как поток, управляемый событиями/сообщениями
  • Код поддерживает функциональный стиль программирования.
  • Противодавление в потоках данных

Давайте уделим больше внимания части потока данных:

Данные могут поступать из баз данных, внешних файлов, интегрированных сервисов, других приложений и т.д. Для каждого элемента этого источника данных у нас есть событие или сообщение, которое запускается, после выполнения этого события/сообщения у нас появляется сообщение об ошибке или о том, что оно было завершено. Например, для запроса на сохранение данных у нас есть событие on Next(Продукт):

Список <Продукт>.Получить все продукты();

Например, когда мы вызываем данные из базы данных, вызов возвращается, и для каждого элемента запускается onNext(Продукт), а когда мы заканчиваем перечисление, у нас появляется событие onComplete(), сообщающее, что наш запрос завершен.

Что делать, если в вашем запросе содержится ошибка? Вместо возврата события onComplete() у нас будет событие onError(), и у нас не будет ожидаемого содержимого.

Спецификация реактивного потока

это набор спецификаций для использования потоков, созданных такими компаниями, как Pivotal и Netflix, среди этих спецификаций у нас есть:

  • Издатели: Интерфейс издателя является поставщиком неограниченного количества элементов последовательным образом и публикует их в соответствии с запросом, который он получает от своих Подписчиков (я объясню, что будет дальше). Один и тот же издатель может динамически обслуживать нескольких Подписчиков в разное время. Издатели являются нашими источниками данных.

издатель общедоступного интерфейса{ публичная недействительная подписка (Подписчик супер T> s); }

  • Подписчик: Вы получаете приглашение отказаться от подписки только после того, как передадите экземпляр Subscriber в Publisher.subscribe (Подписчик). Уведомление не будет получено до тех пор, пока не будет вызван запрос на подписку (длинный). После инициирования вызова: Один или несколько вызовов on Next (Объект) запускаются до тех пор, пока не будет достигнуто максимальное количество, определенное подпиской.запрос (длинный). Одиночный вызов ошибки onError(вызываемый) или запрос завершения onComplete(). Это требование может быть передано через Subscription.request(long) всякий раз, когда экземпляр подписчика может обрабатывать больше.

подписчик общедоступного интерфейса{ публичная недействительность при подписке (подписках); публичная пустота в следующем (T t); публичный недействительный onError(выбрасываемый t); публичная пустота onComplete(); }

И подписка:

подписка на общедоступный интерфейс{ публичный недействительный запрос (длинный n); публичная отмена недействительности (); }

  • Процессор: Он представляет собой этап обработки, который одновременно является Подписчиком и Издателем, который принимает оба стандарта.

процессор открытого интерфейса расширяет Подписчика ,Издателя { }

быть таким: T- тип элемента, который сигнализируется Абоненту. R – тип элемента, который передается издателю.

Это была первая часть серии статей, в которой мы говорили о некоторых моментах и преимуществах реактивного программирования, в следующей я рассмотрю причины, которые привели к созданию Webflux и его отличиям от Spring MVC Вопросы или отзывы?

Ниже приведены некоторые интересные ссылки и материалы по этому вопросу:

Реактивный манифест

Реактивные Потоки

Реактивные Потоки

Курс Weblux

Изображение с: https://docs.spring.io/spring-framework/docs/5.0.0.M1/spring-framework-reference/html/images/web-reactive-overview.png

Увидимся в следующих статьях!

Оригинал: “https://dev.to/kamilahsantos/spring-webflux-reactive-java-applications-part-1-330j”