Spring WebFlux框架概述
什么是 Spring WebFlux
WebFlux 是Spring5添加的新模块,是一个使用响应式编程和异步非阻塞的Web开发框架,它的功能和 Spring MVC 类似。
WebFlux 以 Reactor 库为基础, 基于异步和事件驱动,可以让在有限的硬件资源里面,提升系统的吞吐量和伸缩性。
Spring WebFlux 和 Spring MVC 各自的特点
Spring MVC 构建于Servlet API 和 Servlet 容器,是一个同步阻塞式 I/O 框架,就是一个线程处理一个请求。
Spring WebFlux 基于 Reactive Streams API 和 Servlet 3.1+ 容器(3.1 规范新特性:异步处理支持),是一个异步非阻塞的框架,能够充分利用多核 CPU 的硬件资源去处理大量的并发请求。但 WebFlux 并不能使接口的请求响应时间缩短,仅仅能够提升吞吐量和伸缩性。
Spring WebFlux 可以使用Java8函数式编程方式来实现路由请求。
异步,同步:调用者发送请求,如果需要等着被调用者回应才能去执行其他任务就是同步,如果不需要等着被调用者回应,发送完后直接去执行其他任务的就是异步。
阻塞,非阻塞:被调用者接收到请求后,等完成请求任务后才反馈给调用者的是阻塞,接收请求后立马反馈的就是非阻塞。
Spring WebFlux 和 Spring MVC 的区别
相同点:
- 都可以使用注解方式进行操作,
- 都可以运行在Tomcat容器中。
不同点:
- Spring MVC 采用同步阻塞式,Spring WebFlux 采用异步非阻塞,Spring MVC 更方便开发人员编写功能代码,Debug 测试等,如果 Spring MVC 能够满足的场景,就尽量不要用 WebFlux
- WebFlux 使用 R2DBC 或 Jasync-sql 操作数据库;
- WebFlux 默认情况下使用 Netty 作为服务器;
开发中选 Spring WebFlux 还是 Spring MVC
首先:WebFlux 不是 Spring MVC 的替代方案。
根据官方的建议有以下几点可以作为参考:
- 如果你已经使用了Spring-webmvc进行开发,并且项目运行良好,就无需更改了;何况现在大多数的三方库都是阻塞的,并不能发挥出非阻塞的优势。
- webflux提供了相当多的选择;在服务层,可以使用(Netty, Tomcat, Jetty, Undertow, 和3.1版本以上的Servlet容器)作为web服务;在应用层,可以选择用@Controller定义还是使用函数编程定义;在编程风格上,可以选择用Reactor、RxJava或其他。
- 如果你钟爱Java8提供的lambda表达式这种轻量级、函数式的编程风格,那么建议选择用webflux;同时对于一些轻量级应用,或者复杂度比较低的微服务,建议使用webflux以便更好的进行控制。
- 在微服务架构中,可以将webmvc和webflux项目混合使用。两个框架都可以使用@Controller这种注解的方式,使得项目的重用更加容易。
- 评估一个项目是否应该选择webflux的最简单的方式是,依据项目中是否会使用很多的阻塞API,比如JDBC或者一些阻塞式的API就不适用与webflux项目。
- 响应式编程的学习路线是比较陡峭的,所以如果你身在一个大型的团队中,要考虑投入的成本,小组成员的学习成本等;