前言
要想搞清楚什么是webflux,我们就要与传统的springboot web做对比。在这里我们不对其核心原理做剖析,只是针对在使用上的区别,以及特色来做讲解。
两者之间最大的区别就是web是阻塞式的,webflux是非阻塞的,这是什么意思呢?让我们从代码讲起吧。
什么是阻塞式
我们先来回顾下springboot接受http响应时候的操作。假如我们定义了下面一个接口:
@RequestMapping("/")
public int index() {
log.info("a={}","hello");
return 1;
}
这时我们发起请求可以看到下面的响应:
对于每一个请求,springboot都会开启一个线程来处理。但是如果当我们在处理请求时有大量的io操作,那么这时这个线程就会被卡住,影响系统吞吐量。
非阻塞式
当我们换成webflux后,可以看到,所有的请求都是在一个线程中进行处理
如果我们在controller里加入一些io操作,这时又会如何呢?
可以看到,面对同时四个请求,webflux只开启了两个线程来处理。
当线程执行io操作时,其可以不阻塞等待,而是转而处理别的操作,因此使用较少的线程数就可以应对更多的并发请求。请注意,非阻塞式的方式并不能提高接口的响应速度,而是可以增大系统的吞吐量。这样的提高也并不是总能生效,只有在大量请求下才能体现出他的优势。
总结
WebFlux是Spring框架提供的基于Reactive编程模型的Web框架,相比于传统的SpringBoot Web框架,其最大的特点就是非阻塞式。在处理高并发请求时,WebFlux能够应对更多的请求,提高系统的吞吐量。但是需要注意的是,非阻塞式的方式并不能提高接口的响应速度,而且只有在大量请求下才能体现出其优势。