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

Я смотрел Spring Советы: функциональные реактивные конечные точки с Spring Framework 5.0 и немного читали о реакторе Spring, но Я не могу это понять.

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

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

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

Ответ 1

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

В нем он рассказывает о том, как Reactive Web Controller (представленный ниже) на поверхности выглядит как Spring MVC HTTP Servlet Request/Response Controller, но на самом деле это не

@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 и реактивные потоки, реализован как часть изменений Spring 5 для совместимого сервлета 3.1 веб-контейнеры (Jetty и Tomcat).

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

Ответ 2

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