使用HTTP端点返回Flux/Mono实例而不是DTO的好处

18

我观看了 Spring Framework 5.0中的Spring Tips:Functional Reactive Endpoints,并阅读了一些有关spring reactor的资料,但我仍然无法完全理解它。

在使用Netty和Spring Reactor的情况下,以jacksonified的方式返回Flux/Mono实例和直接返回dto对象(也是jacksonified),有什么好处呢?一开始我认为,在http请求/响应上下文中,反应流更像是Websockets,其中服务器通过开放式通道将数据推送给接收方,但实际情况似乎并非如此。

此外,Netty在反应式编程方面真正比Tomcat做得更好的是什么呢?

如果我的问题看起来很愚蠢,请原谅,但我并不完全理解这个新框架的方向。它是如何出现的,如何工作以及解决了什么问题呢?


这并不是很广泛。鉴于标题的澄清,有一个非常具体的答案。 - Brent Bradburn
在这个问题的背景下,值得注意Netty和Tomcat之间的区别。如果你想的话,我相信你可以写一本关于这个的书,但这并不是必要的——它只是一个附属细节。 - Brent Bradburn
我认为将返回Flux/Mono包装器视为会从客户端角度影响API的一种自然误解,但实际上并不会。 - Brent Bradburn
2个回答

13

我强烈建议您观看最近在Devoxx比利时介绍的Rossen Stoyanchev的“使用Spring 5进行反应式Web应用程序”视频

在视频中,他讲解了反应式Web Controller(如下所示)表面上看起来像Spring MVC HTTP Servlet请求/响应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和Reactive Streams的胶水代码是如何作为Spring 5更改的一部分来实现的,以符合Servlet 3.1兼容的Web容器(Jetty和Tomcat)。
当然,他也提到了完全支持响应式编程和非阻塞服务器(Netty、Undertow)可以运行Reactive Streams。

1

不正确的说法是Netty比Tomcat更好。实现方式不同。Tomcat使用Java NIO来实现Servlet 3.1规范。与此同时,Netty也使用NIO,但引入了自定义API。如果您想深入了解如何在Netty中实现Servlet 3.1,请观看此视频https://youtu.be/uGXsnB2S_vc


2
这并没有回答问题“有什么好处”。这更适合作为评论而不是“答案”。 - Raedwald

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接