HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>В этом уроке мы познакомимся с Spring WebFlux - фреймворком на платформе Spring, предназначенным для создания реактивных веб-приложений. Он позволяет обрабатывать запросы асинхронно и в неблокирующем режиме, что делает приложение более эффективным, так как оно может одновременно обрабатывать множество запросов, не дожидаясь завершения каждого из них.</p>
1 <p>В этом уроке мы познакомимся с Spring WebFlux - фреймворком на платформе Spring, предназначенным для создания реактивных веб-приложений. Он позволяет обрабатывать запросы асинхронно и в неблокирующем режиме, что делает приложение более эффективным, так как оно может одновременно обрабатывать множество запросов, не дожидаясь завершения каждого из них.</p>
2 <p>Реактивный подход означает, что система может выполнять несколько задач одновременно, не ожидая завершения одной задачи перед началом другой. Например, в традиционном синхронном приложении, когда вы делаете запрос к базе данных, оно будет ждать ответа, прежде чем продолжить выполнение. В отличие от этого, реактивное приложение отправляет запрос и сразу же продолжает выполнение, обрабатывая ответ, когда он поступит, без блокировки основного потока.</p>
2 <p>Реактивный подход означает, что система может выполнять несколько задач одновременно, не ожидая завершения одной задачи перед началом другой. Например, в традиционном синхронном приложении, когда вы делаете запрос к базе данных, оно будет ждать ответа, прежде чем продолжить выполнение. В отличие от этого, реактивное приложение отправляет запрос и сразу же продолжает выполнение, обрабатывая ответ, когда он поступит, без блокировки основного потока.</p>
3 <p>В ходе урока мы разработаем простое реактивное приложение, которое продемонстрирует основные принципы работы с асинхронными операциями и реактивными потоками данных с использованием Spring WebFlux.</p>
3 <p>В ходе урока мы разработаем простое реактивное приложение, которое продемонстрирует основные принципы работы с асинхронными операциями и реактивными потоками данных с использованием Spring WebFlux.</p>
4 <h2>Классы для работы с реактивными потоками данных</h2>
4 <h2>Классы для работы с реактивными потоками данных</h2>
5 <p>В Spring WebFlux мы работаем с реактивными потоками данных, которые позволяют обрабатывать запросы и операции в асинхронном режиме, используя типы Mono и Flux для представления результатов</p>
5 <p>В Spring WebFlux мы работаем с реактивными потоками данных, которые позволяют обрабатывать запросы и операции в асинхронном режиме, используя типы Mono и Flux для представления результатов</p>
6 <p>Mono - это класс, который представляет собой поток данных, который может содержать не более одного элемента. Он используется, когда нужно обработать один результат или ошибку.</p>
6 <p>Mono - это класс, который представляет собой поток данных, который может содержать не более одного элемента. Он используется, когда нужно обработать один результат или ошибку.</p>
7 <p>Flux - это класс, который представляет собой поток данных, который может содержать любое количество элементов. Он используется, когда нужно обработать несколько результатов или ошибок.</p>
7 <p>Flux - это класс, который представляет собой поток данных, который может содержать любое количество элементов. Он используется, когда нужно обработать несколько результатов или ошибок.</p>
8 <h2>Модель</h2>
8 <h2>Модель</h2>
9 <p>В реактивных приложениях на основе Spring WebFlux модели не используют традиционные аннотации из пакета jakarta.persistence, так как они предназначены для синхронных ORM-фреймворков. Вместо этого для работы с асинхронными базами данных применяются другие подходы, такие как Spring Data R2DBC, которые лучше соответствуют неблокирующей природе реактивного программирования</p>
9 <p>В реактивных приложениях на основе Spring WebFlux модели не используют традиционные аннотации из пакета jakarta.persistence, так как они предназначены для синхронных ORM-фреймворков. Вместо этого для работы с асинхронными базами данных применяются другие подходы, такие как Spring Data R2DBC, которые лучше соответствуют неблокирующей природе реактивного программирования</p>
10 <h2>Репозиторий</h2>
10 <h2>Репозиторий</h2>
11 <p>В асинхронном приложении важно, чтобы все компоненты, включая работу с базой данных, также функционировали в асинхронном режиме. Это позволяет избежать блокировки потоков и обеспечивает высокую производительность, что является одной из ключевых целей реактивного программирования.</p>
11 <p>В асинхронном приложении важно, чтобы все компоненты, включая работу с базой данных, также функционировали в асинхронном режиме. Это позволяет избежать блокировки потоков и обеспечивает высокую производительность, что является одной из ключевых целей реактивного программирования.</p>
12 <p>Чтобы реализовать асинхронное взаимодействие с базой данных, мы используем репозитории, которые наследуются от ReactiveCrudRepository. ReactiveCrudRepository - это интерфейс, который предоставляет асинхронные и неблокирующие операции для работы с базами данных в реактивных приложениях, что позволяет выполнять операции, такие как создание, чтение, обновление и удаление сущностей, без блокировки потоков.</p>
12 <p>Чтобы реализовать асинхронное взаимодействие с базой данных, мы используем репозитории, которые наследуются от ReactiveCrudRepository. ReactiveCrudRepository - это интерфейс, который предоставляет асинхронные и неблокирующие операции для работы с базами данных в реактивных приложениях, что позволяет выполнять операции, такие как создание, чтение, обновление и удаление сущностей, без блокировки потоков.</p>
13 <p>Репозиторий ReactiveCrudRepository работает с реактивными типами Mono&lt;T&gt; и Flux&lt;T&gt;</p>
13 <p>Репозиторий ReactiveCrudRepository работает с реактивными типами Mono&lt;T&gt; и Flux&lt;T&gt;</p>
14 <h2>Сервис</h2>
14 <h2>Сервис</h2>
15 <p>Сервис в данном примере представляет собой слой бизнес-логики, который использует репозиторий для взаимодействия с базой данных и возвращает реактивные типы Flux и Mono, что позволяет обрабатывать данные в асинхронном режиме</p>
15 <p>Сервис в данном примере представляет собой слой бизнес-логики, который использует репозиторий для взаимодействия с базой данных и возвращает реактивные типы Flux и Mono, что позволяет обрабатывать данные в асинхронном режиме</p>
16 <h2>Контроллер</h2>
16 <h2>Контроллер</h2>
17 <p>Контроллер, в свою очередь, использует методы сервиса для обработки HTTP-запросов и возвращает реактивные типы</p>
17 <p>Контроллер, в свою очередь, использует методы сервиса для обработки HTTP-запросов и возвращает реактивные типы</p>
18 <h2>Сервер Netty</h2>
18 <h2>Сервер Netty</h2>
19 <p>В качестве сервера по умолчанию проект Spring WebFlux использует Netty. Netty - это асинхронный сервер, который позволяет обрабатывать несколько запросов одновременно, не блокируя основной поток выполнения.</p>
19 <p>В качестве сервера по умолчанию проект Spring WebFlux использует Netty. Netty - это асинхронный сервер, который позволяет обрабатывать несколько запросов одновременно, не блокируя основной поток выполнения.</p>
20 <p>В отличие от Tomcat, который создает большое количество потоков, блокирущихся в ожидания ответа от базы данных или других ресурсов, Netty работает на основе неблокирующего ввода/вывода и использует Event Loop для обработки событий. Event Loop работает как бесконечный цикл, который постоянно мониторит соединения и обрабатывает события, такие как приход новых данных или закрытие соединения. Когда событие происходит, Event Loop вызывает соответствующий обработчик, который обрабатывает событие и выполняет необходимые действия.</p>
20 <p>В отличие от Tomcat, который создает большое количество потоков, блокирущихся в ожидания ответа от базы данных или других ресурсов, Netty работает на основе неблокирующего ввода/вывода и использует Event Loop для обработки событий. Event Loop работает как бесконечный цикл, который постоянно мониторит соединения и обрабатывает события, такие как приход новых данных или закрытие соединения. Когда событие происходит, Event Loop вызывает соответствующий обработчик, который обрабатывает событие и выполняет необходимые действия.</p>