В последната пета версия на популярната платформа за разработка на уеб и ентерпрайз приложения Spring има редица новости, които значително улесняват разработчиците. Ето моите фаворити:

  • Нов реактивен модел за програмиране, базиран върху проекта Reactor (https://projectreactor.io/).
  • Spring WebFlux – реактивна алтернатива на популярната уеб платформа Spring Web MVC, позволяваща постепенен преход към реактивния подход за разработка чрез смесване на компоненти реализирани с класическия подход базиран на анотации (като @RestControler, @GetMapping, @PostMapping и др.) с новия функционално-реактивен стил.
  • Реактивни хранилища за данни (Reactive DB repositories) и интеграции – сред поддържаните от Spring 5 реактивни интеграции са: MongoDB, CouchDB, Redis, Cassandra, Kafka. Те дават възможност за получаване на резултатите от базата поточно (streaming) в реално време, вместо на по-големи порции (batches).
  • JDK 8 и Java EE 7 са актуализираните минимални изисквания за съвместимост на Spring Поддържа се и Java 9.
  • Подобрения при тестването на уеб услуги и приложения с WebTestClient (базиран на WebFlux WebClient)
  • Нов функционален Domain Specific Language (DSL), базиран на езика Kotlin.

В този блог ще реализираме проста уеб услуга  в стил Representational State Transfer (REST) с използване на  Spring Web Flux и Reactor.


 

Събитие на фокус:

Continuous Integration on AWS

 


Създаване и конфигуриране на проекта

Най-лесният начин да създадем нов проект със Spring 5 е да отворим сайта: https://start.spring.io/

От там избираме първо вида на проекта (Maven или Gradle) и езика за програмиране (Java, Kotlin или Groovy), както и версията на Spring Boot. Ние ще изберем Gradle билд система, с Java като език за програмиране и последна версия на  Spring Boot. Няколко думи за Spring Boot – технологията позволява много лесно и бързо да създаваме и подкарваме нови Spring проекти, чрез просто комбиниране на Spring Boot starter модули. Например за нашия проект ще използваме следната комбинация от модули:

  • Reactive Web – дава възможност да създаваме реактивни уеб приложения със Spring WebFlux;
  • DevTools – прави по-приятен опита ни при разработка на уеб приложения, чрез подходящо настроени стойности по подразбиране и автоматично рестартиране на приложението при промяна на кода.

Изберете групата на проекта – например: org.iproduct.spring и името на артефакта (проекта): webflux

След като изберете посочените по-горе зависимости (dependencies) натискате бутона Generate Project”, сваляте проекта и го разархивирате в избрана от вас директория. За работа по проекта можете да използвате различни среди са разработка – например IntelliJ IDEA или Eclipse. Тук ще илюстрираме използването с IntelliJ.

Завършеният проект е достъпен за сваляне от GitHub repository на IPT курса Spring 5: Hibernate, Spring MVC, WebFlux и REST: https://github.com/iproduct/course-spring5/tree/master/02-webflux-hello.

Gradle конфигурация

Нека да разгледаме Gradle конфигурационния файл, който получаваме при разархивиране на проекта генериран на https://start.spring.io/ и да добавим няколко допълнителни настройки за IntelliJ:

Допълнително са добавени idea плъгин с настройки за сваляне на сорс кода и документацията  на използваните модули от Gradle.

В случай че желаете да инсталирате и стартирате проекта от команден ред – това е съвсем лесно. Отворете конзолен прозорец и отидете в основната директория на проекта и напишете:

По подразбиране Spring Boot проектът стартира уеб сървър на порт 8080. Ако напишете http://localhost:8080/ ще видите че уеб сървърът е стартиран, но няма създадени handler функции или REST контролери, затова сървърът връща: „Whitelabel Error Page …“.

Създаване на REST Controller

Нека да създадем първия си контролер. Направете нов пакет с име hello в основния пакет на проекта org.iproduct.spring.webflux. В новия пакет създайте клас с име HelloController и със следния сорс код:

В проекта използваме WebFlux, но анотациите са същите както в по-стария SpringMVC модул:

  • @RestController – регистрира класа като уеб контролер, който директно връща тялото на HTTP отговора;·
  • @GetMapping(„/hello“) – свързва handler метода sayHello с URL-a „/hello“;
  • @RequestParam(value = „name“, required = false, defaultValue = „Stranger“) – дава възможност да получим като аргумент на метода query параметър на заявката с име name, ако има такъв или да го замести със стойността “Stranger”, ако липсва такъв параметър.

Вече можете да отидете на адрес http://localhost:8080/hello и следва да получите отговор: Hello, Stranger from Spring Boot!
Ако добавите в URL-a: http://localhost:8080/hello?name=Trayan
Ще получите: Hello, Your_Name from Spring Boot!
Поздравления – създадохте първия си REST контролер със Spring WebFlux.

Реактивен REST хендлър с WebFlux и Reactor

Нека да видим как би изглеждал същия код но в реактивен вариант. Ще създадем нов клас с име ReactiveHello в пакет org.iproduct.spring.webflux.reactive:

Тук използваме типа Mono на Spring Reactor проекта, който заедно с типа Flux моделира реактивни потоци от стойности (https://projectreactor.io/docs/core/release/reference/#flux). Разликата е, че Flux може да праща множество стойности (или събития) към получателите (subscribers) преди да завърши, докато Mono – най-много една стойност.В случая със статичния метод Mono.just създаваме Mono<String>, което подаваме при конструиране на тялото на HTTP отговора (Mono<ServerResponse>). Както виждате при реактивния подход връщаме с потоци от стойности вместо просто стойности, което позволява например да решим проблема с обработката на грешки, null или повече от една стойност подавани асинхронно във времето. Например можете да забележите, че req.queryParam(„name“) връща тип Optional<String>, което позволява по естествен начин да обработваме както случая когато има query параметър, така и когато липсва такъв. Това позволява композиране на reactive pipelines чрез проста функционална композиция на трансформиращи потока функции.

Дефиниране на рутираща функция в Spring конфигурацията

За да може създадения handler метод (sayHelloReactive) да получи заявките  е необходимо да го „свържем“ (mapping) към конкретен URL (както при контролера базиран на анотации по-горе), което наричаме рутиране. Ето как може да стане това в основния конфигурационен клас на приложението:

Можете да опитате да отворите в браузъра http://localhost:8080/reactive-hello и http://localhost:8080/reactive-hello?name=Your_Name Следва да получите същите резултати: Hello, Your_Name from Spring Boot!Вече имате и реактивна версия на Hello WebFlux приложението.

Ето как изглежда структурата на проекта:

Ако желаете да разгледате по-сложни проекти – разгледайте GitHub repository-то: https://github.com/iproduct/course-spring5 Или ми пишете във Фейсбук на: https://www.facebook.com/trayan.iliev

Успех със Spring!


Траян Илиев
– Основател на един от първите (от 2003 г.) центрове за IT обучение у нас: IPT – Intellectual Products & Technologies (http://iproduct.org).
– Лектор на курса Spring 5: Hibernate, Spring MVC, WebFlux и REST
– Oracle® сертифициран Java програмист с 15 годишен опит.
– Разработчик на end-to-end reactive fullstack приложения с ES6/7/8, TypeScript, Angular, React и Vue.
– 12+ години опит като IT трейнър за международни софтуерни компании.
– Множество презентации на конференции за разработчици: Voxxed Days, jPrime, jProfessionals, BGOUG, BGJUG, на теми като Spring, Reactor, SOA & REST, CDI, Java EE, Nodejs, Angular, Ionic, React, Java роботика, High-performance Java.
– Организатор на RoboLearn хакатони и IoT ентусиаст (http://robolearn.org).


Стани част от потребителските групи на DEV.BG. Виж всички потребителски групи и избери най-интересните за теб.

Прочети още:
ORM или не?
Type-Safe SQL с jOOQ

 

Share This