我正在接近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());
}
}
答案 0 :(得分:3)
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。