让 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 的好处 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Java ProjectReactor 响应式编程 Mono 简单工作流程解析