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】:sayHello
和 sayHelloReactively
都可以被认为是反应式的——你基本上是从内存中返回一些东西,不涉及 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的主要内容,如果未能解决你的问题,请参考以下文章
如何使 WebFilter 在非 WebFlux/非反应式 Spring Boot 应用程序中工作?
Spring Boot Webflux 无法返回 application/xml
Spring Boot (十四): 响应式编程以及 Spring Boot Webflux 快速入门