Spring Boot 2 反应式 webflux

Posted

技术标签:

【中文标题】Spring Boot 2 反应式 webflux【英文标题】:Spring Boot 2 reactive webflux 【发布时间】:2018-06-24 21:32:56 【问题描述】:

我正在接近 Spring Boot 2 及其实现 Web 服务的反应式方法。作为几乎所有习惯使用经典同步 MVC 模式编程的人,我对这种方法有些怀疑。 我正在尝试实现一个 restcontroller 并开发一些反应式和非反应式方法作为示例的标题,以便更好地理解这些概念。 比如导入WebFlux(使用Netty作为Embedded Server)的写法,第二种和第4种方法是reactive的,第一种和第三种方法是nonreactive的吗?

@org.springframework.web.bind.annotation.RestController
public class RestController 

  @Autowired
  NoteDao noteDao;

  /* non-reactive */
  @RequestMapping("/hello")
  public String sayHello()
    return "Hello pal";
  

  /* reactive */
  @RequestMapping("/hello/reactive")
  public Mono<String> sayHelloReactively()
    return Mono.just("Hello reactively, pal!");
  

  /* non-reactive */
  @RequestMapping("/notes")
  public List<Note> getAllNotes()
    return noteDao.findAll();
  

  /* reactive */
  @RequestMapping("/notes/reactive")
  public Flux<List<Note>> getAllNotesReactively()
    return Flux.just(noteDao.findAll());
  


【问题讨论】:

【参考方案1】:

sayHellosayHelloReactively 都可以被认为是反应式的——你基本上是从内存中返回一些东西,不涉及 I/O。第二个无缘无故地包装了 String 值 - 这两种方法是等效的。

响应式背后的核心思想是,对于涉及 I/O 操作(例如从网络读取和写入)的所有内容,您的代码不应在等待结果(REST 调用、数据库查询)时无所事事回来。您可以将其视为回调,以及诸如背压之类的许多附加功能。

因为NoteDao暴露了同步+阻塞的方法,所以不能调用一个方法,结果一出来就通知。用Flux.just 包裹一个阻塞调用只会让事情变得更糟。在 WebFlux 应用程序中,线程非常少——这样做会为每次调用阻塞一个线程——然后很容易让你的应用程序完全崩溃。

如果您想了解更多阻塞与反应式背后的核心思想,您应该看看这个演讲:Servlet or Reactive Stacks: The Choice is Yours. Oh No... The Choice is Mine! - Rossen Stoyanchev。

【讨论】:

以上是关于Spring Boot 2 反应式 webflux的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot Webflux 反应式 API

如何使 WebFilter 在非 WebFlux/非反应式 Spring Boot 应用程序中工作?

Spring Boot Webflux 无法返回 application/xml

Spring Boot (十四): 响应式编程以及 Spring Boot Webflux 快速入门

webflux spring boot 应用程序的过滤器,返回 ResponseEntity<?>

Spring Boot 2 使用 Webflux、Netty 和 HTTP2,导致证书无效,可能配置错误