Рубрики
Без рубрики

Руководство по Spring 5 WebFlux

Краткое руководство по использованию Web Flux с аннотациями, Весна 5.

Автор оригинала: baeldung.

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 Mono getEmployeeById(@PathVariable String id) {
    return employeeRepository.findEmployeeById(id);
}

Мы оборачиваем один Работник ресурс в Моно потому что мы возвращаем не более одного сотрудника.

5.2. Коллекционный ресурс

Давайте также добавим конечную точку, которая публикует ресурс сбора всех Сотрудников :

@GetMapping
private Flux getAllEmployees() {
    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} :

Mono employeeMono = client.get()
  .uri("/employees/{id}", "1")
  .retrieve()
  .bodyToMono(Employee.class);

employeeMono.subscribe(System.out::println);

6.2. Получение ресурса коллекции

Аналогично, чтобы получить ресурс коллекции типа Flux из конечной точки /сотрудники :

Flux employeeFlux = 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 Mono updateEmployee(@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 .