Преимущества того, что конечные точки HTTP возвращают экземпляры Flux/Mono вместо DTO

Я посмотрел Spring Tips: Functional Reactive Endpoints with Spring Framework 5.0 и немного почитал о пружинный реактор, но я не совсем понимаю.

Каковы преимущества того, что конечные точки возвращают Flux/Mono экземпляры (jacksonified) вместо прямых объектов dto (jacksonified), учитывая, что у меня активны netty и Spring Reactor? Первоначально я предполагал, что реактивные потоки в контексте HTTP-запроса/ответа будут работать больше как веб-сокеты, в которых сервер отправляет данные получателю с открытым каналом, но, похоже, это не так.

И что на самом деле делает netty лучше в реактивном программировании, чем tomcat?

Извините, если эти вопросы покажутся глупыми, но я не совсем понимаю цель этого нового направления фреймворка. Почему он возник, как он работает и какие проблемы решает?


person intelectuallychallenged    schedule 04.12.2016    source источник
comment
Это не так широко. Учитывая уточнение названия, есть очень конкретный ответ.   -  person Brent Bradburn    schedule 09.09.2019
comment
В контексте этого вопроса стоит отметить различие между Netty и Tomcat. Я уверен, что вы могли бы написать об этом книгу, если бы захотели, но здесь это необязательно — это лишь вспомогательная деталь.   -  person Brent Bradburn    schedule 11.09.2019
comment
Я думаю, что это естественное недоразумение, что возврат оберток Flux/Mono как-то повлияет на API с точки зрения клиента. Это не так.   -  person Brent Bradburn    schedule 01.10.2019


Ответы (2)


Я настоятельно рекомендую вам посмотреть недавно представленный в Devoxx Belgium "Реактивное веб-приложение с Spring 5" Россена Стоянчева< /а>.

Там он рассказывает о том, как реактивный веб-контроллер (представленный ниже) на первый взгляд выглядит как контроллер запросов/ответов HTTP-сервлета Spring MVC, но на самом деле это не так.

@GetMapping("/users/{id}")
public Mono<User> getUser(@PathValiable Long id) {
   return this.userRepository.findById(id);
}

@GetMapping("/users")
public Flux<User> getUsers() {
   return this.userRepository.findAll();
}

он рассказывает о том, как Servlet 3.1, хотя и неблокирующий, на самом деле не работает для полностью реактивных и как связующий код, соединяющий Servlet 3.1 и Reactive Streams, реализован как часть изменений Spring 5 для веб-контейнеров, совместимых с Servlet 3.1 (Jetty и Tomcat) .

И, конечно же, он касается полностью реактивных неблокирующих совместимых серверов (Netty, Undertow), которые поддерживаются для запуска реактивных потоков.

person dimitrisli    schedule 05.12.2016

Неправильно говорить, что Нетти лучше кота. Реализация другая. Tomcat использует java NIO для реализации спецификации сервлета 3.1. Между тем, netty также использует NIO, но вводит собственный API. Если вы хотите получить представление о том, как сервлет 3.1 реализован в Netty, посмотрите это видео https://youtu.be/uGXsnB2S_vc< /а>

person Yevhenii Melnyk    schedule 14.12.2016
comment
Это не отвечает на вопрос Каковы преимущества. Это было бы лучше как комментарий, а не ответ. - person Raedwald; 18.01.2019