Как конечные точки REST автоматически подписываются при вызове из браузера / клиента REST? - PullRequest
0 голосов
/ 11 июня 2018

В ProjectReactor или Reactive Streams, Ничего не происходит до тех пор, пока вы не подпишитесь ().

Поток данных реактивных потоков не произойдет, если только кто-то не подпишется на него, но я вижу для всех REST APIнапример, находки, сохранения и вставки не вызывают явную подписку, но данные передаются между производителем и подписчиками.

@RestController
class PersonController {

      private final PersonRepository repository;

      public PersonController(PersonRepository repository) {
        this.repository = repository;
      }
      @GetMapping("/all")
      public Flux<Person> index() {

         return repository.findAll();

     }
      @GetMapping("/people")
      Flux<String> namesByLastname(@RequestParam Mono<String> lastname) {

        Flux<Person> result = repository.findByLastname(lastname);
        return result.map(it -> it.getFullName());
      }

      @PostMapping("/people")
      Flux<People> AddPeople(@RequestBody Flux<Person> people) {

          return repository.saveAll(people);
      }
}

почему нам не нужно вызывать подписку для конечных точек REST для запуска данныхтечь в проект реактора?

Как конечные точки REST (HTTP-запросы) автоматически подписываются на Reactive Streams для потока данных, когда я звоню из браузера?

я что-то здесь упускаю?

1 Ответ

0 голосов
/ 11 июня 2018

Вы правы - когда ваше приложение настраивает реактивный конвейер Flux / Mono, ничего в этом конвейере не выполняется до тех пор, пока что-то не будет subscribe.

Вот что происходит во времяОбмен запросами / ответами в Spring WebFlux:

  • сервер получает запрос и перенаправляет его в WebFlux
  • в зависимости от запроса и кода вашего приложения, будет построен реактивный конвейер, включающийфильтры, контроллеры и т. д. Вы можете видеть, что в качестве канала, связывающего запрос с ответом
  • , клиент HTTP через стек TCP запрашивает чтение, и эта информация о противодавлении передается базовым сервером.

Самый низкий контракт в Spring WebFlux - HttpHandler - это контракт, который взаимодействует с базовым сервером.В случае Reactor Netty этот сервер уже поддерживает API реактивных потоков, и подписка изначально выполняется сервером.Для других серверов на основе сервлетов мы используем мост реактивных потоков к сервлету 3.1.В ServletHttpHandlerAdapter мы соединяем мир реактивных потоков с API-интерфейсом асинхронного ввода-вывода - подписка фактически происходит внутри этого моста.

Также: обратите внимание, что мы неt обычно subscribe к значению, возвращенному WebClient;Вы можете сделать это, только если вы не находитесь в середине реактивного конвейера (т.е. не в середине обработчика контроллера).В этих случаях мы обычно подключаем это к реактивному оператору в середине конвейера;если вы этого не сделаете, у вас не будет никаких гарантий, когда вы получите ответ HTTP-клиента - это полностью отделит этот вызов от остальной части вашего приложения.

...