【问题标题】:Spring Boot 2 reactive webfluxSpring Boot 2 反应式 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());
  }

}

【问题讨论】:

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


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2020-04-05
      • 2019-04-12
      • 2019-01-05
      • 2018-02-08
      • 1970-01-01
      • 2021-11-18
      • 2020-04-29
      • 1970-01-01
      • 2018-07-03
      相关资源
      最近更新 更多