WebFlux. Реактивный web с Spring Java
ฝัง
- เผยแพร่เมื่อ 6 ก.พ. 2025
- Spring Boot WebFlux. Разбираемся с реактивным стеком фреймворка Spring.
Поддержать проект:
➡ Стать спонсором www.youtube.co...
➡ Patreon / letscodedru
➡ Яндекс.Деньги money.yandex.r...
➡ PayPal paypal.me/lets...
➡ Qiwi qiwi.me/letscode
Реактивный подход становится стандартом в разработке. Java, как один из мейнстримовых языков, также имеет богатый инструментарий для разработки реактивных приложений.
Первым шагом попробуем сделать пару простых реактивных контроллеров как в новом, функциональном, так и в "старом" стиле - с помощью аннотаций и классов.
Код из видео:
github.com/dru...
Генератор шаблона Spring Boot приложения:
start.spring.io/
Сборник коротких гайдов по Spring Boot:
spring.io/guides
Инструкция по созданию простого Spring WebFlux приложения в функциональном стиле:
spring.io/guid...
Документация
docs.spring.io...
Плейлист по Spring Boot приложению Sweater:
• Spring Boot MVC (Sweat...
Плейлист по Spring Boot приложению Sarafan:
• Spring Boot Rest + Vue.js
Видео про проект Reactor:
• Project Reactor - реак...
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
➡ Второй канал: / geekchatdru
➡ Twitch: / drucoder
➡ Твиттер: / letscodedru
➡ Группа Вконтакте: letscod...
➡ Канал в Telegram: t.me/letsCode_dru
➡ Чат в Telegram: t.me/joinchat/...
➡ Сервер в Discord: / discord
➡ Яндекс.Дзен: zen.yandex.ru/...
Благодаря вашим видосам про Spring я разобрался как это работает, и сделал тестовое задание на собеседовании (надо было сделать и развернуть веб-сервис). Вот уже почти как пол года я backend-разработчик)) Обожаю ваш канал. Огромнейшее спасибо)
Кто поставил дизлайк? Зачем? Ведь этим урокам цены нет!!! Автору еще раз спасибо!
Точно такой же вопрос задаюсь когда вижу тонну лайков под видео этого автора. Автор видео ничего не объясняет , вместо этого он просто озвучивает то что он делает. Полезности 0. Уже ни раз давал шанс, так как вижу кучу просмотров под его видео и очень часто натыкаюсь на интересущие меня темы, но ничего не могу понять из его уроков, потому что объяснений нету ВООБЩЕ. Люди у которых есть опыт они ничего нового не подчеркнут, у которых опыта нет , ничего не поймут. Отсюда и дизлайки.
@@fpsbard7267 хм.. Ну не поняло получается только 13 из 1100 человек, значит автор просто бог педагог
10/10 для нового проекта нужно было разобраться в реактиве вместо привычного сервлета
ваши уроки помогли буквально за час понять что к чему
Быстро, понятно, "реактивно", подача отличная, смотрится в удовольствие. Спасибо!
С нетерпением жду новых видео по реактивному спрингу)))) спасибо
Большое спасибо, очень доступно и понятно, такое надо сразу Впрод)
спасибо за урок
Андрей, ты незаменим
Большое спасибо за материал!!! Это как раз то что нужно!!!!!!!
Мужииик!!! Жирненький тебе лайкос! =)
Ждем продолжения серии!
Больше ДиЧи!!! )))
Спасибо за труды!!
Прям зашло, очень хорошая затравка для интересного проекта!
Спасибо огромное за твои видео! Они очень помогают в реальной работе!
Большое вам спасибо за это видео.
Спасибо за урок.
Замечание по параметрам start и count.
Это не пагинация вовсе, а просто фильтрация, от куда начать и сколько взять. Что бы это стало пагинацией, нужно в метод skip() передать start * count.
Спасибо огромное!) Очень интересный урок)))
Что что, но я хочу больше подобной дичи
Спасибо. Пока не могу понять нутром необходимость в реактивности и как она мне поможет. Что про дичь - побольше и подробнее. :-)
- А под дичь будешь?
- Под дичь, буду!
- Федя, дичь.
- Дичь!
- Тссс!
- Это дичь?
- Это дичь? Дичь!
- А под дичь водку не пьют!
- А что?
- Пьют это, вжух!
PS. спасибо за дичь :)
Никакой дичи, все супер!!!!!!!!!
Сразу лайк, не глядя
Познавательно, спасибо.
Супер!)
И все же какой подход лучше использовать? Функциональный или контроллеры?
Что вызывает меньше проблем при дальнейшем изучении? К чему легче будет прикручивать логику авторизации, регистрации?
Отличное видео, спасибо! Было бы интересно также посмотреть , как правильно обрабатывать тело пост-запроса, сохранять в базу полученный объект, и возвращать на фронт его id, к примеру :)
Спасибо за видео! Андрей, как нибудь сделай видео на тему WebFlux + JWT и WebFlux+Redis.
Очень интересно конечно, но пока ничего не понятно)
Еще не смотрел, но одобряю
Очень интересно было бы если начнете новую рубрику где расскажете про языках и технологиях. Какой язык для чего нужен, в чем лучше остальных. В интернете конечно много всяких материалов но все они либо тупо опираются на статистику стэковерфлоу или же черезчур перемудрены что очень сложны новичкам. Сейчас этих самых ЯП и технологии очень много что всякие разные мнении о том что, мол тот язык круче или хуже сбивают с толку начинающих. Хотелось бы иметь какой то минимальной ясности в этом плане. Посмотрел последний стрим о реактивности, где под конец немножко затронули это, но там не все разобрано да и акцент самого стрима ставился не на это. Так что думаю все таки стоит открыть эту тему. Ввиде коротких обзорных видео или стримов, это уже решать вам. Но чтобы разговор был о реально значимых аспектах(с историческимим данными, сведениями) а не стэкоферфлоуских статистиках как это делают все блогеры. Спасибо!
Как говорится: Все очень сложно, но очень интересно, больше дичи богу дичи!
Спасибо!
Лайк + коммент)
Ого, это из-за того что я просил?
Супер, даже хз, попадется ли такой стек в работе
Чудесно
F2 - переводит курсор на проблемное место, чтоб не пикать курсором
Огромное спасибо!
Лайк
Вау!
cool!!!!!!!
супер спасибо!!!!!
а по Elasticsearch межете сделать паро видео?
Не понял что за дичь, но чем подробнее и обширнее гайд, тем лучше :)
07,09,2021
мы хотим больше дичи, больше подробностей, до байтов!!!1!
👍
Вопрос! А как много проектов сейчас делается или переделывается на реактивном спринге?
Хех, первый коммент на ютубе.. и да, больше такой дичи. Хочется получить максимум полезностей из твоего опыта :))
А было где-то описание разницы мавен и градл?
Спасибо за отличный материал! В прочем как всегда :)
Вопрос: если в spring инициализаторе выбрать packaging - war, то приложение запускается в контейнере tomcat.
Причем дополнительно генерируется класс ServletInitializer.
После запуска конечная точка localhost:8080/hello не доступна. Ошибка 404
Можете сказать почему?
Как указать context root?
Очень интересно, но ни фига не понятно))))
Спасибо за видео, Андрей! Скажи, чем все это добро лучше того же Express`a на NodeJS? Ну кроме строгой типизации конечно) в браузере стоит плагин, который маячит какие технологии у сайта, и в большинстве случаев (и даже у хайлоада, например Яндекс.Музыка) - там нода
Нода у многих фронт раздает. А бэк на чем-нибудь посерьезней
Раздавать фронт, это отдать html css и js бандлы? А все аяксы уже на gateway api -> back-end?
Тогда опять же зачем нода, если есть nginx?
Так и не понял как раздать статический контент (например, файл index.html где нет ничего кроме HTML) через Webflux используя "классические" контроллеры. Как правильно написать @RestController ?
Больше дичи =)
И пасиб за видео)
Очень прошу сними туториал что за чем учить новичку от java core и до профессионала. Вангую будет очень много просмотров и подписок после него). Спасибо!
"старый" стиль как то лаконичнее смотрится
Намного лаконичнее. Согласен с тобой. Этот реактивный способ похож на пхпишный или джанго стиль, который мне вообще не нравится. Одна аннотация раньше делала то что здесь несколько строк кода.
Я что-то не уловил вообще в чем смысл этого нового "стиля". Зачем одну сущность - контроллер делать на 2 - роутер и хэндлер, которые еще и находятся в разных классах и пакетах?
@@arthurfonzerelli6484 это для нас Джаверов непривычно. В пхп и джанго так и делают, роутеры в одном месте, хэндлеры в другом. В пыхе еще так, в джанго вообще что то типо глобальных и локальных для приложения роутеров и плюс еще хендлеры, вот это реально страшно и странно, и без строгой типизации вообще сложно разобраться.
@@arthurfonzerelli6484 ну во-первых в старом стиле тоже есть деление на контроллер и сервис (часто метод в контроллере вызывает метод в сервисе), а во-вторых никто ж не мешает засунуть побольше логики прямо в роутер, если хочется, будет Big Fat Router :)
@letsCode, Андрей, по свех молодежному quarkus.io что нить делать планируешь?
Хз.еще пока не выработал к нему каких-то эмоций )
@@letsCodeDru Ну а что там эмоции то... Экосистемы как у спринг-бут еще нет, то есть для написания всякой мелочи быстро стартующей и масштабируемой, для тех кто на golang не пишет, чтобы в k8s засовывать. Пока там только одна фишка -> билд в graal. А дальше или спринг из инкубатора с graal-support вылезет или quarkus к себе затянет что-то новое. Как раз к тому времени Loom созреет и начнется новая миграция :)))
Пожалуйста, можно о многопоточности, также доступно и глубоко?!
Андрей, а можно видео как использовать webFlux с Korlin coroutine? :) Недавно пытался реализовать редирект get запроса через @RestController и Korlin corourine, так ничего и не вышло. Остановился на чистом webFlux.. Хотелось бы глубже, с "дичью", разобрать работу webFlux и Korlin coroutine.
ждал в конце неудачные дубли как раньше, с кошкой там :(
Оставляю, когда они интересные
Классно! а можете плиз как-нибудь пошарить свои настройки которые используете в idea?
цветовые, функциональные
Дракула. Все остальное стандартное для винды
А какие следы сервлет контейнера должны быть?
Лайк под видео поставил бтв)
Имя пакетов
А как мусташ рендерит юзера? мы ведь передаем ему мапу, он сам делает get по ключу user и достает значение?
Ага
Из этого видео не понял лишь одно. Почему у тебя так мало подписчиков?)
Вот бьі проект с написания микросервисов от автора. А то нормальньіх примеров в интернете просто нету.
Винду что ли поставил? А где kubuntu?
Поломалась
Как использовать @JsonView в WebFlux?
А, все нашёл, кому интересно, смотрите в документации 1.5.2. ServerResponse
можно не мучатся с задачами грейдл, можно просто скачать эклипс и там так же все подхватится, только бесплатно)
Ого, а ты чего на винду переехал?
Ноут паламался :( а на рабочем линуксе не так удобно
а можно помедленнее?
кроме дичевого мустажа есть что-нибудь другое? лучше бы простой хтмл использовать
хах, хтмл просто не заюзаешь, можешь юзать thymeleaf, freemarker...
Больше подобной дичи, хорошо когда объясняешь что к чему
Что значит "реактивный", что ты под этим подразумеваешь?
больше такой дичи)
Больше дичи для бога дичи!
Больше дичи =))
нужна вся дичь которая только есть
Нужно больше дичи!
Побольше дичи, конечно!
Больше дичи!!!
Если .contentType(MediaType.TEXT_PLAIN), то кириллица будет выводиться кракозябрами. Надо указывать полный заголовок, например, так:
return ServerResponse
.ok()
// .contentType(MediaType.TEXT_PLAIN)
.header("HttpHeaders.CONTENT_TYPE", "text/plain; charset=utf-8")
.body(body);
А по теме видео, хотелось бы пояснений, по сравнению с "обычным" REST: роутер теперь вместо контроллера, хэндлер вместо сервиса, так что ли?
Как в Mono отловить исключение и вернуть объект в его текстом?
Очень много onError*..., но либо на входе мы не имеем исключение, имеем результат предыдущей операции, либо почему-то не резолвится
метод
onErrorReturn(Class type, T fallbackValue), хотя в приведённом коде ниже всё совпадает (
Например, при попытке добавить уже существующего пользователя
@PostMapping
Mono addUser(@RequestBody User user) {
return Mono.just(user).map(userService::addUser)
.onErrorReturn(UserAlreadyExistsException.class, ResponseEntity.status(HttpStatus.NOT_ACCEPTABLE).body("User already exists"))
.map(usr -> ResponseEntity.status(HttpStatus.OK).body(modelMapper.map(usr, UserDto.class)));
}