Spring Boot 2反应式webflux

时间:2018-01-16 08:20:08

标签: spring spring-boot netty reactive-programming spring-webflux

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

@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 个答案:

答案 0 :(得分:3)

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