Практика быстрого запуска Spring Boot WebFlux

Java

02: Практика быстрого запуска WebFlux

Spring Boot 2.0

На официальном сайте spring.io есть поразительное предложение:

BUILD ANYTHING WITH SPRING BOOT

Фреймворк Spring Boot (Boot, как следует из названия, означает загрузку) используется для упрощения процесса создания приложения Spring от сборки до разработки. Приложение работает из коробки одной командой, включая командную строкуjava -jar,SpringApplicationКласс запуска приложения, плагин Spring Boot Maven и т. д., вы можете запустить приложение. Кроме того, Spring Boot подчеркивает, что требуется всего несколько файлов конфигурации, поэтому при разработке приложений Spring производственного уровня разработка становится более эффективной и простой. В настоящее время версия Spring Boot — это версия 2.x. Spring Boot включает WebFlux.

Spring Boot 2.0 WebFlux

Чтобы понять WebFlux, сначала поймите, что такое Reactive Streams. Reactive Streams — это стандарт и спецификация библиотеки, ориентированной на потоки, в JVM:

  • обрабатывать потенциально бесконечное количество элементов
  • Процесс по порядку
  • Асинхронная передача между компонентами
  • Обязательное неблокирующее противодавление

Обратное давление

Обратное давление — это распространенная стратегия, которая позволяет издателям иметь неограниченное количество элементов буферного хранилища, чтобы гарантировать, что издатели не перегружают подписчиков, если они публикуют элементы слишком быстро.

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

Обычно состоит из следующего:

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

реактивное программированиеСо стандартными и спецификационными Reactive Streams реактивное программирование может быть выполнено с использованием спецификации. Затем узнайте, что такое реактивное программирование. Реактивное программирование основано на асинхронных и управляемых событиями неблокирующих программах, которые масштабируются вертикально за счет запуска небольшого количества потоков внутри JVM, а не горизонтально за счет кластеризации. Это парадигма программирования, как она отражается в конкретном проекте?

В реальном бою адаптивного программирования проектов для реализации реального боя используется фреймворк Reactor, основанный на спецификации Reactive Streams. Reactor обычно предоставляет два реактивных API:

  • Mono: реализует издателя и возвращает 0 или 1 элемент
  • Flux: реализует издателя и возвращает N элементов.

Spring Webflux

Spring Boot Webflux основан на Reactor. Spring Boot 2.0 включает новый модуль spring-webflux. Этот модуль содержит поддержку реактивных клиентов HTTP и WebSocket, а также поддержку таких программ, как взаимодействие REST, HTML и WebSocket. Вообще говоря, Spring MVC используется для синхронной обработки, а Spring Webflux — для асинхронной обработки.

Spring Boot Webflux имеет две реализации модели программирования, одна похожа на аннотации Spring MVC, а другая использует ее функциональные конечные точки. Аннотация будет упомянута во второй статье, а следующий быстрый старт реализован в функциональном виде Spring Webflux.

Особенности Spring Boot 2.0 WebFlux

Обычно используемые производственные функции Spring Boot 2.0 WebFlux:

  • Реактивный API
  • модель программирования
  • применимость
  • встроенный контейнер
  • Стартовый компонент

Существует также поддержка ведения журнала, Интернета, обмена сообщениями, тестирования и расширений.

Реактивный API

Платформа Reactor является зависимостью реактивной библиотеки Spring Boot Webflux через Reactive Streams и взаимодействует с другими реактивными библиотеками. Предоставляются два реактивных API: Mono и Flux. Как правило, Publisher используется в качестве входных данных, преобразуется в тип Reactor внутри фреймворка и обрабатывает логику, а затем возвращает Flux или Mono в качестве выходных данных.

применимость

file

Картинка очень четкая, WebFlux и MVC имеют пересечение, мигрировать удобно всем. Но обратите внимание:

  • Если MVC подходит для сцены, нет необходимости переходить на WebFlux.
  • Чтобы обратить внимание на поддержку контейнеров, см. раздел Поддержка встроенных контейнеров ниже.
  • Микросервисную архитектуру, WebFlux и MVC можно смешивать. Особенно при разработке сервисов с интенсивным вводом-выводом выберите WebFlux для реализации.

модель программирования

Веб-модуль Spring 5 включает абстракцию HTTP Spring WebFlux. Подобно Servlet API, WebFlux предоставляет API WebHandler для определения неблокирующей абстракции API. Вы можете выбрать одну из следующих двух реализаций модели программирования:

  • Слой управления аннотациями. В соответствии с MVC, WebFlux также поддерживает реактивную аннотацию @RequestBody.
  • Функциональная конечная точка. Гаджет для маршрутизации и обработки запросов на основе упрощенной модели программирования лямбда. Самое большое отличие от вышеизложенного заключается в том, что эта модель контролирует весь жизненный процесс запрос-ответ.

встроенный контейнер

Запустите приложение, как Spring Boot framework, но WebFlux по умолчанию запускается через Netty, а порт по умолчанию автоматически устанавливается на 8080. Также обеспечивает поддержку таких контейнеров, как Jetty, Undertow и т. д. Разработчики могут настраивать и использовать соответствующий встроенный экземпляр контейнера, добавляя соответствующие зависимости начального компонента контейнера.

Обратите внимание, однако, что это должен быть контейнер Servlet 3.1+, такой как Tomcat, Jetty, или не-Servlet контейнер, такой как Netty и Undertow.

Стартовый компонент

Как и среда Spring Boot, Spring Boot Webflux предоставляет множество готовых компонентов Starter. Начальные компоненты — это зависимости Maven, которые можно загрузить в приложение. Вам нужно только добавить соответствующую конфигурацию зависимостей в конфигурацию Maven, чтобы использовать соответствующий компонент Starter. Например, добавитьspring-boot-starter-webfluxЗависимости можно использовать для создания отзывчивых сервисов API, включая встроенные контейнеры Web Flux и Tomcat и т. д.

В разработке многие функции реализованы путем добавления компонентов Starter. Итак, каковы наиболее часто используемые компоненты Starter в Spring Boot 2.x?

Spring Boot 2.0 Компоненты WebFlux

Spring Boot WebFlux официально предоставляет множество компонентов Starter, каждый модуль будет иметь разнообразную поддержку выбора технической реализации для достижения различных сложных бизнес-требований:

  • Интернет: Spring WebFlux
  • Шаблонный движок: Thymeleaf
  • Хранилище: Redis, MongoDB, Cassandra. MySQL не поддерживается
  • Встраиваемые контейнеры: Tomcat, Jetty, Undertow

Быстрый старт

Spring Initializr быстро строит скелет проекта

Проект Spring Boot Maven — это обычный проект Maven, просто добавьте соответствующие зависимости Spring Boot. Spring Initializr, подобно генератору кода, автоматически предоставляет вам проект Spring Boot Maven. У Spring Initializr есть два способа получить скелет проекта Spring Boot Maven:

start.spring.io онлайн генерация

Spring официально предоставляет веб-сайт Spring Initializr, который поможет вам быстро создавать приложения Spring Boot. Адрес веб-сайта: https://start.spring.io, Шаги работы следующие:

Первый шаг — выбрать инструмент сборки Maven или Gradle, язык разработки Java, Kotlin или Groovy и, наконец, определить номер версии Spring Boot. Здесь по умолчанию выбраны инструмент сборки Maven, язык разработки Java и Spring Boot 2.0.1.

Второй шаг, введите информацию о проекте Maven, то есть группу проектаgroupIdи имяartifactId. Соответствующая информация Maven здесь:

  • Идентификатор группы: Springboot
  • идентификатор артефакта: sspringboot-webflux-1-quickstart
    Здесь номер версии по умолчанию — 0.0.1-SNAPSHOT. Три свойства однозначно идентифицируются в репозитории зависимостей Maven.

Третий шаг — выбор компонентов Starter и других зависимостей, необходимых для проекта. Наконец, нажмите кнопку «Создать», чтобы получить сжатый пакет каркасного проекта. Вот быстрый старт, просто выберите Reactive Web. Как показано на рис. 1-8.

Настройка зависимостей POM

Проверьте, настроена ли зависимость spring-boot-starter-webflux в файле POM проекта. Если он автоматически генерируется выше, конфигурация выглядит следующим образом:

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>io.projectreactor</groupId>
      <artifactId>reactor-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

Зависимость spring-boot-starter-webflux — это основной пакет, который нам нужен для изучения webflux, который по умолчанию включает пакеты spring-boot-starter-reactor-netty и spring 5 webflux. То есть по умолчанию он запускается netty.

Для модульного тестирования используются две зависимости: реактор-тест и весенний-загрузочный-стартер-тест.

spring-boot-maven-plugin — это плагин Spring Boot Maven, который можно вызывать для запуска, компиляции и т. д.

Напишите класс обработчика Handler

Создайте новый пакет org.spring.springboot.handler как класс для написания обработки функций. Класс обработки CityHandler нового примера City, код выглядит следующим образом:

import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Mono;

@Component
public class CityHandler {

    public Mono<ServerResponse> helloCity(ServerRequest request) {
        return ServerResponse.ok().contentType(MediaType.TEXT_PLAIN)
                .body(BodyInserters.fromObject("Hello, City!"));
    }
}

ServerResponse — это инкапсуляция ответа, которая может устанавливать статус ответа, заголовок ответа и тело ответа. Например, ok представляет код ответа 200, перечисление MediaType представляет текстовый тип содержимого, а возвращаемый объект — String.

Здесь в качестве возвращаемого объекта используется Mono, поскольку возвращаемый объект содержит объект ServerResponse, а не несколько элементов.

Напишите класс маршрутизатора Router

Создайте новый пакет org.spring.springboot.router в качестве класса маршрутизатора. Класс маршрутизации CityRouter нового примера City, код выглядит следующим образом:

import org.spring.springboot.handler.CityHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.server.RequestPredicates;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;

@Configuration
public class CityRouter {


    @Bean
    public RouterFunction<ServerResponse> routeCity(CityHandler cityHandler) {
        return RouterFunctions
                .route(RequestPredicates.GET("/hello")
                                .and(RequestPredicates.accept(MediaType.TEXT_PLAIN)),
                        cityHandler::helloCity);
    }

}

RouterFunctions — это класс для обработки маршрутизации запросов, то есть маршрутизации запросов к процессорам. Здесь GET-запрос /hello направляется методу helloCity обработчика cityHandler. Аналогично HandleMapping в режиме Spring MVC.

Для метода RouterFunctions.route(RequestPredicate, HandlerFunction) соответствующими входными параметрами являются параметры запроса и функция-обработчик.Если запрос совпадает, вызывается соответствующая функция-обработчик.

Здесь написан простой сервис Как запустить сервис ниже.

Запустить работающий проект

Был разработан простой проект Spring Boot Webflux. Давайте запустим проект, чтобы проверить его. Используйте панель инструментов в правой части IDEA, нажмите вкладку «Проект Maven», нажмите «Использовать подключаемый модуль Maven».installЗаказ. Или используйте форму командной строки, в корневом каталоге проекта выполните Maven, чтобы очистить и установить команду проекта:

cd springboot-webflux-1-quickstart
mvn clean install

Смотрите успешный вывод в консоли:

... 省略
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:30 min
[INFO] Finished at: 2017-10-15T10:00:54+08:00
[INFO] Final Memory: 31M/174M
[INFO] ------------------------------------------------------------------------

Запустить проект

Выполнить в IDEAApplicationЗапуск класса в обычном режиме или в режиме отладки. Результат успешного запуска можно увидеть в консоли:

... 省略
2018-04-10 08:43:39.932  INFO 2052 --- [ctor-http-nio-1] r.ipc.netty.tcp.BlockingNettyContext     : Started HttpServer on /0:0:0:0:0:0:0:0:8080
2018-04-10 08:43:39.935  INFO 2052 --- [           main] o.s.b.web.embedded.netty.NettyWebServer  : Netty started on port(s): 8080
2018-04-10 08:43:39.960  INFO 2052 --- [           main] org.spring.springboot.Application        : Started Application in 6.547 seconds (JVM running for 9.851)

На первый взгляд, это действительно Нетти начала.

Откройте браузер, перейдите по адресу /hello, и вы увидите результат возврата, как показано на рисунке:

file

Суммировать

В этой статье в основном рассказывается об истории Spring Boot 2.0 WebFlux и использовании быстрого запуска. Он используется для создания службы на основе функциональных конечных точек, но это требует большого объема кода. В следующей главе CRUD мы используем уровень управления аннотациями, чтобы упростить разработку.

Эта статья опубликована в блогеOpenWriteвыпуск!