Реактивное программирование со Spring Boot 2. Часть 2
Информационный портал по безопасности
Реактивное программирование со Spring Boot 2. Часть 2
В первой части мы узнали, что такое реактивность и как с ней работать на базовом уровне. Если вы хотите продолжить изучение реактивного программирования с новым фреймворком от Spring, то добро пожаловать!
18 декабря. Он нам сильно облегчит работу и сэкономит много времени.
Все настройки и финальный проект можно посмотреть на github.
Если вы еще не подключили все зависимости, то можете сделать это прямо сейчас. В gradle выглядеть они будут так:
Итак, у нас все готово. Для начала создадим пользователя нашего приложения:
Напоминаю, что для успешной компиляции и работы в IntelliJ Idea необходимо выставить галочку в пункте enable annotation processing либо написать самостоятельно все сеттеры, гетеры и конструкторы.
Далее создадим репозиторий с нашими пользователями:
Здесь следует заметить, что мы наследуемся от особого интерфейса для работы в реактивном режиме. Если заглянуть в интерфейс ReactiveMongoRepository, то можно увидеть, что нам возвращаются объекты, обернутые в уже знакомые нам классы Mongo и Flux. Это значит, что при каком-либо обращении в БД, мы не получаем сразу же результат. Вместо этого мы получаем поток данных, из которого можно получить данные по мере готовности.
На данный момент многослойная архитектура является наиболее распространенным решением при работе с микросервисной архитектурой. Это действительно очень удобно. Давайте создадим сервисный слой. Для этого сделаем соответствующий интерфейс:
Наш сервис достаточно прост, поэтому сразу создаем несколько полезных методов. И тут же реализуем их:
Здесь стоит заметить, что внедрение зависимости UserRepository происходит через конструктор с помощью аннотации AllArgsConstructor. На всякий случай напомню, что с некоторой версии Spring 4 можно осуществлять автоматическое внедрение зависимостей через конструктор без аннотации Autowire.
И, наконец, сделаем контроллер:
Запустим наше приложение. Все должно работать. Теперь сделаем POST запрос на localhost:8080/users со следующим содержимым:
В ответ мы получим такой же объект, но с присвоенным ему id:
Отлично! Давайте сохраним еще пару пользователей и попробуем посмотреть, что у нас уже есть в БД. У меня такой результат GET запроса на localhost:8080/users:
Отлично! У нас есть целый сервис, который работает в асинхронном режиме! Но есть еще кое-что, о чем следует помнить. Работа с асинхронным репозиториями может очень сильно поменять вид сервиса, который получает данные из него.
Чтобы продемонстрировать это, создадим еще один обработчик URL метода в нашем контроллере:
Здесь все просто. Мы получаем фамилию пользователя и выводим всех людей с такой фамилией.
Конечно, такую логику можно возложить на базу данных, но здесь я хотел бы обратить внимание, как это будет выглядит в сервисе:
Обратите внимание, что есть разница в работе с данными и потоками данных. Обычно мы осуществляем какие-то действия над данными непосредственно. Здесь ситуация другая. Мы говорим, что следует сделать в потоке данных.
Попробуем сделать GET запрос по URL localhost:8080/users/Griffin. У меня такой результат:
В этой статье мы рассмотрели, как построить асинхронный сервис с новым фреймворком WebFlux и сервером Netty (он идет из коробки по умолчанию). Также мы убедились, как легко этого достичь со Spring Boot 2. Если у вас на проекте микросервисная архитектура, то скорее всего вы легко сможете при желании перевести свои приложения на WebFlux с выходом Spring Boot 2(если, конечно, в этом есть потребность).
Микросервисы со Spring Boot. Часть 2. Создание микросервиса Forex
Это вторая часть серии статей по основам микросервисных архитектур, в которой показывается, как создать микросервис с помощью Spring Boot и заставить его работать с Spring MVC, JPA, Hibernate и H2.
В этой серии статей вы познакомитесь с концепцией микросервисов и узнаете, как создавать микросервисы с помощью Spring Boot и Spring Cloud.
Это руководство поможет вам изучить основы микросервисных архитектур. Мы также начнем рассматривать базовую реализацию микросервиса со Spring Boot.
Мы создадим пару микросервисов и заставим их общаться друг с другом с помощью сервера имен Eureka (Eureka Naming Server) и Ribbon для балансировки нагрузки на стороне клиента.
Это статья входит в серию статей «Микросервисы со Spring Boot»:
- Часть 1. Начало работы с архитектурой микросервисов
- Часть 2. Создание микросервиса Forex
- Часть 3. Создание микросервиса конвертации валют
- Часть 4. Использование Ribbon для балансировки нагрузки
- Часть 5. Использование сервера имен Eureka
Вы изучите
- Как создать микросервис с помощью Spring Boot?
- Как создать JPA сущность и ресурс?
- Как заставить Spring MVC, Spring Boot, JPA, Hibernate и H2 работать вместе?
Обзор ресурсов
Forex Service (FS) является поставщиком услуг. Он обеспечивает значения курсов обмена валюты для различных валют. Давайте предположим, что он общается с Forex Exchange и предоставляет текущие значения курсов обмена различных валют.
Пример запроса и ответа показан ниже:
Запрос выше возвращает обменный курс евро к INR. В ответе получается, что коэффициент конвертации ConversionMultiple равен 75.
Структура кода проекта
На следующем скриншоте показана структура проекта, который мы создадим.
Некоторые элементы проекта:
- SpringBootMicroserviceForexServiceApplication.java — класс Spring Boot приложения, созданный с помощью Spring Initializer. Этот класс действует как точка запуска приложения.
- pom.xml — содержит все зависимости, необходимые для создания этого проекта. Мы будем использовать Spring Boot Starter Web и JPA.
- ExchangeValue.java — объект, содержащий количество валюты для обмена.
- ExchangeValueRepository.java — JPA репозиторий для ExchangeValue. Он создан с помощью Spring Data JpaRepository.
- ForexController.java — Spring REST контроллер, предоставляющий сервис конвертации форекс.
- data.sql — исходные данные для таблицы exchange_value. Spring Boot выполнит этот скрипт после того, как таблицы будут созданы из сущностей.
Вам понадобятся
- Maven 3.0+ — инструмент для сборки
- Ваш любимый IDE. Мы используем Eclipse.
- JDK 1.8+
Готовый проект Maven с примерами кода
Создание проекта с помощью Spring Initializr
Создание микросервиса с Spring Initializr — это легкая прогулка.
Spring Initializr: start.spring.io — отличный инструмент для быстрого создания ваших проектов Spring Boot.
С помощью Spring Initializr вы можете создавать самые разные проекты.
Следующие шаги нужно сделать для создания проекта разработки веб-сервисов:
- Запустите Spring Initializr и наберите следующее:
- Наберите com.in28minutes.springboot.microservice.example.forex в качестве группы.
- Наберите в качестве артефакта spring-boot-microservice-forex-service.
- Выберите следующие зависимости:
— Web
— DevTools
— Стартер JPA
— H2
2. Нажмите Generate Project.
3. Импортируйте проект в Eclipse: File -> Import -> Existing Maven Project.
Создание класса Exchange Value
Важные вещи, на которые стоит обратить внимание:
- @Entity: указывает, что класс является сущностью. Эта аннотация применяется к классу сущностей.
- @Id: Определяет первичный ключ объекта.
Создание JPA-репозитория Exchange Value
- public interface ExchangeValueRepository extends JpaRepository
расширяет JpaRepository, используя два дженерика: ExchangeValue и Long. ExchangeValue является объектом, которым управляют, а первичным ключом ExchangeValue является Long.
2. ExchangeValue findByFromAndTo (String from, String to)
определяет метод запроса стоимости конвертации из одной валюты в другую.
Создаем ресурс ForexController
Примечания:
1. @RestController public class ForexController <
создает контроллер для предоставления REST сервиса
2. @Autowired private Environment environment
возвращает порт (port) сервера. Это поможет определить, какой экземпляр сервиса возвращает ответ.
3. @Autowired private ExchangeValueRepository repository — автоматическое подключение репозитория.
4. ExchangeValue exchangeValue = repository.findByFromAndTo(from, to) — получаем значение курса обмена валют из базы данных.
5. exchangeValue.setPort(Integer.parseInt(environment.getProperty(«local.server.port»)))
получает атрибут порт (port) из объекта environment и устанавливает его в бин ответа.
Настройка Application Name и несколько других настроек
Назначаем порт 8000 для этого приложения и включаем ведение журнала для отладки.
Создание реактивных RESTFUL API с использованием Spring Boot / WebFlux
Build Reactive RESTFUL APIs using Spring Boot/WebFlux
Усвойте реактивное программирование в Spring с использованием WebFlux / Reactor и научитесь создавать сквозные неблокирующие RESTFUL APIs.
Этот курс структурирован так, чтобы дать вам как теоретический, так и программный аспект API-интерфейсов Reactive Programming и Reactive RestFul с использованием Spring WebFlux.
Если вы с нетерпением ждете, чтобы узнать ниже перечисленные вещи:
- Что такое реактивное программирование?
- Реактивное программирования с помощью Spring WebFlux.
- Реактивное программирования с БД.
- Создание реактивных API RestFul с помощью Spring WebFlux
Тогда это правильный курс для вас. Это чистый практический курс, где вы будете писать много кода.
К концу этого курса вы получите полное представление о программировании и реализации Reactive API с использованием Spring WebFlux.
Почему Реактивное Программирование?
- В этом разделе рассказывается о необходимости реактивного программирования и подробно объясняется текущая модель исполнения в Spring-MVC.
- В этом разделе рассказывается о недостатках spring-mvc .
- В этом разделе рассказывается о модели параллелизма в Spring-MVC.
Что такое реактивное программирование?
- В этом разделе говорится о том, что такое реактивное программирование?
- Как реактивное программирование работает в двух словах на простом примере.
- В этом разделе вы познакомитесь со спецификацией Reactive Streams.
- В этом разделе будет дано полное представление о «Реактивных библиотеках», которые существуют там.
Начало работы с Project Reactor
- В этом разделе вы ознакомитесь со всеми основами Project Reactor и рассмотрите его на нескольких примерах.
- В этом разделе подробно рассматриваются реактивные типы Flux и Mono.
Настройка проекта для этого курса
- В этом разделе мы создадим проект для этого курса, используя веб-сайт Spring Intializr.
Реактивное программирование (Flux и Mono) – практические занятия + тестирование Junit
- В этом разделе мы рассмотрим, как Flux и Mono работают через код.
- Мы сделаем живое программирование того, как писать тестовые примеры Junit, используя Flux и Mono.
- Мы рассмотрим множество различных операторов в Flux и Mono.
Создайте первый неблокирующий RESTFUL API с использованием аннотированных контроллеров – Hands On
- В этом разделе мы создадим первый неблокирующий API с использованием аннотированных контроллеров.
- В этом разделе рассматриваются основы работы реактивного API.
- В этих разделах также описывается аспект кодирования того, как вернуть Flux / Mono из конечной точки.
- В этом разделе также описывается, как писать контрольные примеры JUNIT с использованием WebTestClient.
Создание неблокирующего RESTFUL API с использованием функциональной сети – Hands On
- В этом разделе мы создадим неблокирующий API с помощью функционального веб-модуля.
- В этом разделе рассказывается о RouterFunction и HandlerFunction, которые составляют основу для функционального веб-модуля.
- В этом разделе также описывается, как писать контрольные примеры JUNIT с использованием WebTestClient.
Spring WebFlux & Netty – модель исполнения
- В этом разделе рассказывается о различных слоях WebFlux для обслуживания HTTP-запросов / ответов.
- В этих разделах рассматриваются концепции NETTY, такие как Channel, EventLoop и некоторые технические аспекты Netty.
Обзор Реактивного API
- В этом разделе представлен обзор Reactive API, который мы собираемся создать в рамках этого курса.
Реактивное программирование в базах данных – MongoDB – Hands On
- В этом разделе мы узнаем о том, как написать код реактивного программирования с MongoDB.
- Определите документ позиции для проекта.
- В этом разделе рассказывается о настройке различных профилей в Spring Boot.
- В этом разделе мы настроим адаптер ItemReactive Mongo DB.
- В этом разделе также описывается, как писать контрольные примеры JUNIT для реактивного репозитория.
Создайте конечную точку API реактивного элемента – с помощью RestController
- В этом разделе мы узнаем о том, как кодировать Реактивный API Item CRUD, используя подход @RestController.
- В этом разделе также описывается, как писать автоматизированные тесты с использованием JUNIT и неблокирующего тестового клиента WebTestClient.
Создайте конечную точку API Reactive Item – используя функциональную сеть
- В этом разделе мы узнаем о том, как кодировать Реактивный API Item CRUD, используя функциональный веб-подход.
- В этом разделе также описывается, как писать автоматизированные тесты с использованием JUNIT и неблокирующего тестового клиента WebTestClient.
Создайте неблокирующий клиент с помощью WebClient
- В этом разделе мы рассмотрим методы взаимодействия с Reactive API с помощью WebClient.
- Изучите методы вызова Reactive API с использованием методов exchange () и retrieve ().
- Мы изучим операции GET, PUT, POST и DELETE с помощью WebClient.
Обработка исключений в WebFlux – RestController
- В этом разделе мы будем писать и исследовать различные подходы для обработки исключений / ошибок, возникающих в реактивном API, построенном с использованием RestController.
- Обрабатывать исключения, используя @ExceptionHandler и @ControllerAdvice.
- В этом разделе также описывается, как писать тестовые случаи JUNIT для сценариев исключений.
Обработка исключений в WebFlux – Функциональный веб
- В этом разделе мы будем писать и исследовать различные подходы для обработки исключений / ошибок, возникающих в реактивном API, построенном с использованием Functional Web.
- Обрабатывать исключения, используя WebExceptionHandler.
- В этом разделе также описывается, как писать тестовые случаи JUNIT для сценариев исключений.
WebClient – обработка исключений
- В этом разделе мы будем писать и исследовать, как обрабатывать исключения с помощью WebClient.
- Изучите методы обработки исключений с помощью методов exchange () и retrieve ().
Потоковая передача данных в реальном времени с использованием WebFlux – событий на стороне сервера (SSE)
- В этом разделе мы будем писать код и узнавать о создании конечной точки для потоковой передачи данных в реальном времени с использованием Mongo DB и Spring WebFlux.
- В этом разделе рассказывается о доступных курсорах и ограниченных коллекциях в базе данных Mongo.
- Создайте неблокирующую потоковую конечную точку и взаимодействуйте с БД Mongo с помощью аннотации @Tailable.
- Научитесь писать автоматические тесты, используя JUNIT для потоковых конечных точек (SSE).