让 HTTP 端点返回 Flux/Mono 实例而不是 DTO 的好处 [关闭]

Posted

技术标签:

【中文标题】让 HTTP 端点返回 Flux/Mono 实例而不是 DTO 的好处 [关闭]【英文标题】:Benefits of having HTTP endpoints return Flux/Mono instances instead of DTOs [closed] 【发布时间】:2017-04-19 06:46:18 【问题描述】:

我看过 Spring Tips: Functional Reactive Endpoints with Spring Framework 5.0 并读过一些关于 spring reactor 的内容,但我不太明白。

鉴于我已经激活了 netty 和 spring reactor,让端点返回 Flux/Mono 实例(杰克逊化)而不是直接的 dto 对象(杰克逊化)有什么好处?我最初假设响应式流在 http 请求/响应上下文中的工作方式更像是 websockets,其中服务器通过开放通道将数据推送到接收器,但情况似乎并非如此。

另外,netty 在响应式编程中实际上在哪些方面比 tomcat 做得更好?

如果这些问题看起来很愚蠢,我很抱歉,但我不太了解这个新框架方向的目的。为什么会出现,它是如何工作的,它解决了什么问题?

【问题讨论】:

没有那么宽泛。鉴于标题澄清,有一个非常具体的答案。 在这个问题的上下文中,值得注意的是 Netty 和 Tomcat 之间的区别。如果你愿意,我相信你可以写一本关于这方面的书,但这里没有必要——这只是一个辅助细节。 我认为返回 Flux/Mono 包装器会以某种方式从客户端的角度影响 API,这是一种自然的误解。 它没有。 【参考方案1】:

我强烈建议您观看最近在比利时 Devoxx 上发布的 "Reactive Web Application with Spring 5" by Rossen Stoyanchev。

在那里,他谈到了 Reactive Web Controller(如下所示)表面上看起来像 Spring MVC HTTP Servlet 请求/响应控制器,但实际上并非如此 p>

@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 更改的一部分来实现的,以适应 Servlet 3.1 的 Web 容器(码头和Tomcat)。

当然,他正在接触完全响应式非阻塞兼容服务器(Netty、Undertow)来运行响应式流。

【讨论】:

【参考方案2】:

说Netty比tomcat好是不对的。 实现方式不同。 Tomcat 使用 java NIO 来实现 servlet 3.1 规范。同时,netty 也使用 NIO,但引入了自定义 api。 如果你想深入了解 servlet 3.1 是如何在 Netty 中实现的,请观看此视频https://youtu.be/uGXsnB2S_vc

【讨论】:

这没有回答“有什么好处”的问题。作为评论而不是“答案”会更好。

以上是关于让 HTTP 端点返回 Flux/Mono 实例而不是 DTO 的好处 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

reactor3 flux 的使用

Mongo Flux/Mono 验证后添加元素

Java ProjectReactor 响应式编程 Mono 简单工作流程解析

Spring Boot POST 请求返回 http 状态 405“方法不允许”而不是 HTTP 状态 404

reactor之操作符

reactor之操作符