前言

要想搞清楚什么是webflux,我们就要与传统的springboot web做对比。在这里我们不对其核心原理做剖析,只是针对在使用上的区别,以及特色来做讲解。

两者之间最大的区别就是web是阻塞式的,webflux是非阻塞的,这是什么意思呢?让我们从代码讲起吧。

什么是阻塞式

我们先来回顾下springboot接受http响应时候的操作。假如我们定义了下面一个接口:

@RequestMapping("/")
    public int index()  {
        log.info("a={}","hello");
        return 1;
    }

这时我们发起请求可以看到下面的响应:

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/50d48515-0b6c-457e-967f-2d12e7931219/Untitled.png

对于每一个请求,springboot都会开启一个线程来处理。但是如果当我们在处理请求时有大量的io操作,那么这时这个线程就会被卡住,影响系统吞吐量。

非阻塞式

当我们换成webflux后,可以看到,所有的请求都是在一个线程中进行处理

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/e3e85bc6-7a77-4145-b376-df6189352e96/Untitled.png

如果我们在controller里加入一些io操作,这时又会如何呢?

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/036559c4-3b66-4333-9d0d-e2a16e72420f/Untitled.png

可以看到,面对同时四个请求,webflux只开启了两个线程来处理。

当线程执行io操作时,其可以不阻塞等待,而是转而处理别的操作,因此使用较少的线程数就可以应对更多的并发请求。请注意,非阻塞式的方式并不能提高接口的响应速度,而是可以增大系统的吞吐量。这样的提高也并不是总能生效,只有在大量请求下才能体现出他的优势。

总结

WebFlux是Spring框架提供的基于Reactive编程模型的Web框架,相比于传统的SpringBoot Web框架,其最大的特点就是非阻塞式。在处理高并发请求时,WebFlux能够应对更多的请求,提高系统的吞吐量。但是需要注意的是,非阻塞式的方式并不能提高接口的响应速度,而且只有在大量请求下才能体现出其优势。

最后修改:2023 年 06 月 20 日
如果觉得我的文章对你有用,请随意赞赏