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

1. Обзор

  • Spring WebFlux Framework является частью Spring 5 и обеспечивает поддержку реактивного программирования для веб-приложений. **

В этом руководстве мы создадим небольшое реактивное REST-приложение с использованием реактивных веб-компонентов RestController и WebClient.

Мы также рассмотрим, как защитить наши реактивные конечные точки с помощью Spring Security.

2. Spring WebFlux Framework

Новый каркас поддерживает две модели программирования:

  • Аннотация на основе реактивных компонентов

  • Функциональная маршрутизация и обработка

Здесь мы сосредоточимся на реактивных компонентах, основанных на аннотациях, так как мы уже исследовали functional стиль - маршрутизация и обработка .

3. зависимости

Давайте начнем с зависимости spring-boot-starter-webflux , которая фактически включает все другие необходимые зависимости:

  • spring-boot и spring-boot-starter для базовой Spring Boot

настройка приложения ** __spring-webflux __framework

  • reactor-core , что нам нужно для реактивных потоков, а также

reactor-netty

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
    <version>2.0.3.RELEASE</version>
</dependency>

Последние spring -boot-starter-webflux можно загрузить с Maven Central.

4. Реактивное приложение REST

  • Теперь мы создадим очень простое приложение Reactive REST EmployeeManagement с использованием Spring WebFlux: **

  • Мы будем использовать простую модель домена - Employee с id и name

поле ** Мы создадим REST API для публикации и получения Single, а также

Сбор Employee ресурсов с использованием _RestController and WebClient_ ** И мы также будем создавать защищенную реактивную конечную точку, используя WebFlux.

и Spring Security

5. Реактивный RestController

Spring WebFlux поддерживает конфигурации на основе аннотаций так же, как Spring Web MVC framework.

Для начала на стороне сервера мы создаем аннотированный контроллер, который публикует наши реактивные потоки Employee .

Давайте создадим наш аннотированный EmployeeController :

@RestController
@RequestMapping("/employees")
public class EmployeeReactiveController {

    private final EmployeeRepository employeeRepository;

   //constructor...
}

_EmployeeRepository _ может быть любым хранилищем данных, которое поддерживает неблокирующие реактивные потоки

5.1. Единый ресурс

Давайте создадим конечную точку в нашем контроллере, который публикует единственный ресурс Employee:

@GetMapping("/{id}")
private Mono<Employee> getEmployeeById(@PathVariable String id) {
    return employeeRepository.findEmployeeById(id);
}
  • Для одного ресурса Employee мы использовали Mono типа Employee , поскольку он будет излучать не более 1 элемента. **

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

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

@GetMapping
private Flux<Employee> getAllEmployees() {
    return employeeRepository.findAllEmployees();
}
  • Для ресурса коллекции мы использовали Flux типа Employee - так как это издатель сосредоточился на выпуске 0 . . N элементов. **

6. Реактивный веб-клиент

WebClient , представленный в Spring 5, является неблокирующим клиентом с поддержкой реактивных потоков.

  • На стороне клиента мы используем WebClient для извлечения данных из наших конечных точек, созданных в EmployeeController . **

Давайте создадим простой EmployeeWebClient :

public class EmployeeWebClient {

    WebClient client = WebClient.create("http://localhost:8080");

   //...
}

Здесь мы создали WebClient , используя его фабричный метод create .

Он будет указывать на _localhost: 8080 _ для относительных URL.

6.1. Получение одного ресурса

Чтобы извлечь отдельный ресурс типа Mono из конечной точки /employee/\ {id} :

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

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

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

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

Flux<Employee> employeeFlux = client.get()
  .uri("/employees")
  .retrieve()
  .bodyToFlux(Employee.class);

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

У нас также есть подробная статья на https://www.baeldung.com/spring-5-webclient _. _

7. Spring WebFlux Security

  • Мы можем использовать Spring Security для защиты наших реактивных конечных точек. **

Предположим, у нас есть новая конечная точка в нашем _EmployeeController. Эта конечная точка обновляет данные Employee и отправляет обратно обновленное Employee._

Поскольку это позволяет пользователям менять существующих сотрудников, мы хотим ограничить эту конечную точку только для пользователей с ролью ADMIN .

Давайте добавим новый метод в наш EmployeeController :

@PostMapping("/update")
private Mono<Employee> updateEmployee(@RequestBody Employee employee) {
    return employeeRepository.updateEmployee(employee);
}

Теперь, чтобы ограничить доступ к этому методу, давайте создадим SecurityConfig и определим некоторые основанные на пути правила, чтобы позволить пользователям ADMIN только

@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();
    }
}

Эта конфигурация ограничит доступ к конечной точке /employee/update . Поэтому только пользователи, имеющие роль ADMIN , смогут получить доступ к этой конечной точке и обновить существующий Employee.

Наконец, аннотация __ @ EnableWebFluxSecurity __adds Spring Security WebFlux поддерживает некоторые конфигурации по умолчанию.

У нас также есть подробная статья на configuring и работа с безопасностью Spring WebFlux

8. Вывод

В этой статье мы рассмотрели, как создавать и работать с реактивными веб-компонентами, поддерживаемыми средой Spring WebFlux, путем создания небольшого приложения Reactive REST.

Мы узнали, как использовать RestController и _WebClient _ для публикации и использования реактивных потоков соответственно.

Мы также изучили, как создать защищенную реактивную конечную точку с помощью Spring Security.

Помимо Reactive RestController и WebClient, инфраструктура WebFlux также поддерживает реактивный WebSocket и соответствующий WebSocketClient для потоковой передачи в стиле сокетов Reactive Streams.

У нас есть подробная статья, посвященная работе с https://www.baeldung.com/spring-5-reactive-websockets и Reactive WebSocket в Spring 5].

Наконец, полный исходный код, используемый в этом руководстве, доступен по адресу over на Github .