1. Обзор
Spring Web Flux является частью Spring 5 и обеспечивает поддержку реактивного программирования для веб-приложений.
В этом уроке мы создадим небольшое реактивное приложение REST с использованием реактивных веб-компонентов RestController и WebClient.
Мы также рассмотрим, как защитить наши реактивные конечные точки с помощью Spring Security.
Дальнейшее чтение:
Веб-клиент Spring 5
Обработка ошибок в весеннем веб-потоке
Введение в функциональный веб-фреймворк весной 5
2. Каркас Spring Web Flux
Spring WebFlux внутренне использует Project Reactor и его реализации издателя – Flux и Mono .
Новый фреймворк поддерживает две модели программирования:
- Реактивные компоненты на основе аннотаций
- Функциональная маршрутизация и обработка
Мы сосредоточимся на реактивных компонентах на основе аннотаций, поскольку мы уже изучали функциональную маршрутизацию и обработку стилей в другом учебнике.
3. Зависимости
Давайте начнем с зависимости spring-boot-starter-web flux , которая вытягивает все остальные необходимые зависимости:
- spring-boot и spring-boot-starter для базовой настройки приложения Spring Boot
- spring-web flux каркас
- реактор-активная зона что нам нужно для реактивных потоков, а также реактор-нетти
org.springframework.boot spring-boot-starter-webflux 2.2.6.RELEASE
Последнюю версию spring-boot-starter-web flux можно загрузить с Maven Central.
4. Реактивное применение ОТДЫХА
Теперь мы построим очень простой реактивный ОТДЫХ Управление персоналом применение – использование Spring WebFlux:
- Мы будем использовать простую модель домена – Сотрудник с идентификатором и именем полем
- Мы создадим REST API с помощью RestController для публикации Employee ресурсов как единого ресурса и как коллекции
- Мы создадим клиент с Веб-клиентом для получения того же ресурса
- Мы создадим защищенную реактивную конечную точку с помощью Web Flux и Spring Security
5. Реактивный рестконтроллер
Spring Web Flux поддерживает конфигурации на основе аннотаций так же, как и платформа Spring Web MVC.
Для начала, на сервере мы создаем аннотированный контроллер, который публикует реактивный поток ресурса Employee .
Давайте создадим наш аннотированный EmployeeController :
@RestController @RequestMapping("/employees") public class EmployeeController { private final EmployeeRepository employeeRepository; // constructor... }
EmployeeRepository может быть любым хранилищем данных, поддерживающим неблокирующие реактивные потоки.
5.1. Единый ресурс
Давайте создадим конечную точку в нашем контроллере, которая публикует один Ресурс сотрудника :
@GetMapping("/{id}") private MonogetEmployeeById(@PathVariable String id) { return employeeRepository.findEmployeeById(id); }
Мы оборачиваем один Работник ресурс в Моно потому что мы возвращаем не более одного сотрудника.
5.2. Коллекционный ресурс
Давайте также добавим конечную точку, которая публикует ресурс сбора всех Сотрудников :
@GetMapping private FluxgetAllEmployees() { return employeeRepository.findAllEmployees(); }
Для ресурса сбора мы используем Поток типа Работник – поскольку это издатель для 0. .n элементов.
6. Реактивный Веб-клиент
WebClient , представленный весной 5, является неблокирующим клиентом с поддержкой реактивных потоков.
Мы можем использовать WebClient чтобы создать клиент для извлечения данных из конечных точек, предоставленных Сотрудник контролера.
Давайте создадим простой Веб-клиент для сотрудников :
public class EmployeeWebClient { WebClient client = WebClient.create("http://localhost:8080"); // ... }
Здесь мы создали Веб-клиент , используя его фабричный метод create . Он будет указывать на localhost:8080 , поэтому мы можем использовать или относительные URL-адреса для вызовов, выполняемых этим экземпляром клиента.
6.1. Извлечение одного ресурса
Для извлечения одного ресурса типа Mono из конечной точки /сотрудник/{id} :
MonoemployeeMono = client.get() .uri("/employees/{id}", "1") .retrieve() .bodyToMono(Employee.class); employeeMono.subscribe(System.out::println);
6.2. Получение ресурса коллекции
Аналогично, чтобы получить ресурс коллекции типа Flux из конечной точки /сотрудники :
FluxemployeeFlux = client.get() .uri("/employees") .retrieve() .bodyToFlux(Employee.class); employeeFlux.subscribe(System.out::println);
У нас также есть подробная статья о настройке и работе с веб-клиентом .
7. Безопасность Spring WebFlux
Мы можем использовать Spring Security для защиты наших реактивных конечных точек.
Предположим, у нас есть новая конечная точка в нашем EmployeeController. Эта конечная точка обновляет Сведения о сотруднике и отправляет обратно обновленного Сотрудника.
Поскольку это позволяет пользователям изменять существующих сотрудников, мы хотим ограничить эту конечную точку только пользователями ADMIN role.
Давайте добавим новый метод в наш EmployeeController :
@PostMapping("/update") private MonoupdateEmployee(@RequestBody Employee employee) { return employeeRepository.updateEmployee(employee); }
Как, чтобы ограничить доступ к этому методу, давайте создадим Security Config и определим некоторые правила на основе путей, чтобы разрешать только пользователям-администраторам:
@EnableWebFluxSecurity public class EmployeeWebSecurityConfig { // ... @Bean public SecurityWebFilterChain springSecurityFilterChain( ServerHttpSecurity http) { http.csrf().disable() .authorizeExchange() .pathMatchers(HttpMethod.POST, "/employees/update").hasRole("ADMIN") .pathMatchers("/**").permitAll() .and() .httpBasic(); return http.build(); } }
Эта конфигурация ограничит доступ к конечной точке /сотрудники/обновление . Поэтому только пользователи, имеющие роль ADMIN , смогут получить доступ к этой конечной точке и обновить существующего сотрудника .
Наконец, аннотация @EnableWebFluxSecurity добавляет поддержку веб-потока Spring Security с некоторыми конфигурациями по умолчанию.
У нас также есть подробная статья о настройке и работе с Spring Webflow security .
8. Заключение
В этой статье мы рассмотрели, как создавать и работать с реактивными веб-компонентами, поддерживаемыми платформой Spring WebFlux. В качестве примера мы создали небольшое реактивное приложение REST.
Мы узнали, как использовать RestController и Веб-клиент для публикации и использования реактивных потоков.
Мы также рассмотрели, как создать защищенную реактивную конечную точку с помощью Spring Security.
Помимо Reactive RestController и WebClient , фреймворк Web Flux также поддерживает reactive WebSocket и соответствующий WebSocketClient для потоковой передачи реактивных потоков в стиле сокета.
У нас есть подробная статья, посвященная работе с реактивным WebSocket с Spring 5 .
Наконец, полный исходный код, используемый в этом учебнике, доступен на Github .