一、什么是 Spring WebFlux

Spring MVC 构建于 Servlet API 之上,使用的是同步阻塞式 I/O 模型,什么是同步阻塞式 I/O 模型呢?就是说,每一个请求对应一个线程去处理。

Spring WebFlux 是一个异步非阻塞式的 Web 框架,它能够充分利用多核 CPU 的硬件资源去处理大量的并发请求。

二、WebFlux 的优势&提升性能?

WebFlux 内部使用的是响应式编程(Reactive Programming),以 Reactor 库为基础, 基于异步和事件驱动,可以让我们在不扩充硬件资源的前提下,提升系统的吞吐量和伸缩性。

看到这里,你是不是以为 WebFlux 能够使程序运行的更快呢?量化一点,比如说我使用 WebFlux 以后,一个接口的请求响应时间是不是就缩短了呢?

抱歉了,答案是否定的!以下是官方原话:

Reactive and non-blocking generally do not make applications run faster.

WebFlux 并不能使接口的响应时间缩短,它仅仅能够提升吞吐量和伸缩性

三、WebFlux 应用场景

上面说到了, Spring WebFlux 是一个异步非阻塞式的 Web 框架,所以,它特别适合应用在 IO 密集型的服务中,比如微服务网关这样的应用中。

PS: IO 密集型包括:磁盘IO密集型网络IO密集型,微服务网关就属于网络 IO 密集型,使用异步非阻塞式编程模型,能够显著地提升网关对下游服务转发的吞吐量。

四、选 WebFlux 还是 Spring MVC?

首先你需要明确一点就是:WebFlux 不是 Spring MVC 的替代方案!,虽然 WebFlux 也可以被运行在 Servlet 容器上(需是 Servlet 3.1+ 以上的容器),但是 WebFlux 主要还是应用在异步非阻塞编程模型,而 Spring MVC 是同步阻塞的,如果你目前在 Spring MVC 框架中大量使用非同步方案,那么,WebFlux 才是你想要的,否则,使用 Spring MVC 才是你的首选。

在微服务架构中,Spring MVC 和 WebFlux 可以混合使用,比如已经提到的,对于那些 IO 密集型服务(如网关),我们就可以使用 WebFlux 来实现。

五、异同点

相同点:

  • 都可以使用 Spring MVC 注解,如 @Controller, 方便我们在两个 Web 框架中自由转换;
  • 均可以使用 Tomcat, Jetty, Undertow Servlet 容器(Servlet 3.1+);
  • ...

注意点:

  • Spring MVC 因为是使用的同步阻塞式,更方便开发人员编写功能代码,Debug 测试等,一般来说,如果 Spring MVC 能够满足的场景,就尽量不要用 WebFlux;
  • WebFlux 默认情况下使用 Netty 作为服务器;
  • WebFlux 不支持 MySql;

六、快速入门

7.1 添加 webflux 依赖

新建一个 Spring Boot 项目,在 pom.xml 文件中添加 webflux 依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

7.2 定义接口

新建一个 controller 包,用来放置对外的接口类,再创建一个 HelloWebFluxController.class 类,定义两个接口:

package site.exception.springbootwebfluxhello.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;
import site.exception.springbootwebfluxhello.entity.User;@RestController
public class HelloWebFluxController {@GetMapping("/hello")public String hello() {return "Hello, WebFlux !";}@GetMapping("/user")public Mono<User> getUser() {User user = new User();user.setName("xrj");user.setDesc("hello");return Mono.just(user);}}

User.java:

package site.exception.springbootwebfluxhello.entity;public class User {/*** 姓名*/private String name;/*** 描述*/private String desc;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDesc() {return desc;}public void setDesc(String desc) {this.desc = desc;}
}

以上控制器类中,我们使用的全都是 Spring MVC 的注解,分别定义了两个接口:

  • 一个 GET 请求的 /hello 接口,返回 Hello, WebFlux !字符串。
  • 又定义了一个 GET 请求的 /user方法,返回的是 JSON 格式 User 对象。

这里注意,User 对象是通过 Mono 对象包装的,你可能会问,为啥不直接返回呢?

在 WebFlux 中,Mono 是非阻塞的写法,只有这样,你才能发挥 WebFlux 非阻塞 + 异步的特性。

补充:在 WebFlux 中,除了 Mono 外,还有一个 Flux,这哥俩均能充当响应式编程中发布者的角色,不同的是:

  • Mono:返回 0 或 1 个元素,即单个对象。
  • Flux:返回 N 个元素,即 List 列表对象。

7.3 测试接口

启动项目,查看控制台输出:

当控制台中输出中包含 Netty started on port(s): 8080 语句时,说明默认使用 Netty 服务已经启动了。

Spring WebFlux异步非阻塞式编程相关推荐

  1. 异步非阻塞式数据传输——AIO的两种实现方式

    一 点睛 AIO 是自 JDK 1.7 开始提供,本质是对 NIO 中 Channel 进行的一些扩展,因此 AIO 也称为 NIO.2.具体地讲,AIO 就是在 NIO 的基础上,新增加了下表的 3 ...

  2. spring 实现异步非阻塞长轮询

    一. 前言 今天接到一个扫码登录的需求.想一想很简单,服务端提供一个获取二维码接口,在提供一个查询扫码状态的接口,客户端不停轮询"查询扫码状态接口"判断用户是否已扫码登录,并很快实 ...

  3. 非阻塞式编程 php,简单介绍PHP非阻塞模式

    非阻塞模式是指利用socket事件的消息机制,Server端与Client端之间的通信处于异步状态. 让PHP不再阻塞当PHP作为后端处理需要完成一些长时间处理,为了快速响应页面请求,不作结果返回判断 ...

  4. akka框架——异步非阻塞高并发处理框架

    akka actor, akka cluster akka是一系列框架,包括akka-actor, akka-remote, akka-cluster, akka-stream等,分别具有高并发处理模 ...

  5. 真正的 Tornado 异步非阻塞

    其中 Tornado 的定义是 Web 框架和异步网络库,其中他具备有异步非阻塞能力,能解决他两个框架请求阻塞的问题,在需要并发能力时候就应该使用 Tornado. 但是在实际使用过程中很容易把 To ...

  6. 使用NIO实现异步非阻塞Socket tcp通信

    使用NIO实现异步非阻塞Socket tcp通信 一.BIO与NIO IO(BIO)和NIO区别:其本质就是阻塞和非阻塞的区别 阻塞概念:应用程序在获取网络数据的时候,如果网络传输数据很慢,就会一直等 ...

  7. springboot异步注解_Spring Boot 2 :Spring Boot 中的响应式编程和 WebFlux 入门

    [小宅按]Spring 5.0 中发布了重量级组件 Webflux,拉起了响应式编程的规模使用序幕. WebFlux 使用的场景是异步非阻塞的,使用 Webflux 作为系统解决方案,在大多数场景下可 ...

  8. (转)Spring Boot 2 (十):Spring Boot 中的响应式编程和 WebFlux 入门

    http://www.ityouknow.com/springboot/2019/02/12/spring-boot-webflux.html Spring 5.0 中发布了重量级组件 Webflux ...

  9. Spring笔记(4):响应式编程、Reactor、WebFlux、Flow

    目录 1.Spring Webflux 介绍 2.响应式编程(Java 实现) 3.响应式编程(Reactor 实现) 4.SpringWebflux 执行流程和核心 API 5.SpringWebf ...

最新文章

  1. QPS过万,redis大量连接超时怎么解决?
  2. VerifyError: Error #1107: ABC 数据已损坏,尝试的读取操作超出范围
  3. Update语句:使用case when按条件批量更新
  4. 算法训练 最长字符串 java
  5. 论文排版怕翻车?这个排版神器赶紧用起来!
  6. 软件测试工程师-软件测试基本介绍
  7. 【Linux 命令学习第一天
  8. 霍兰德SI型如何选专业?霍兰德职业兴趣测试
  9. 功能全面的开源小程序商城-CRMEB
  10. 英伟达显卡最新驱动安装过程
  11. Notion使用详解三Notion小传
  12. excel上下标录入技巧
  13. 关于win10微软商店重置后用不了的问题
  14. mac m1 esc键失灵
  15. 前端页面请求PHP接口返回超大数据(几万条以上)解决办法总结
  16. 黑龙江省伊春市谷歌高清卫星地图下载
  17. PNP : TCP relay Socks4a
  18. 拓嘉辰丰电商:拼多多“快团团”买赠常见玩法
  19. python画蛋糕祝福_python实现生日蛋糕
  20. 数据库 之 备份工具Mysqldump具体使用介绍

热门文章

  1. 计算机术语网站,背单词网站
  2. 国家开放大学《国际经济法》第三章 国际货物运输法 边学边练
  3. 如何使iPhone震动
  4. 李开复谈互联网商业模式 李开复和王利芬高端对话
  5. QQ微信的反向昵称反向消息实现居然是因为Unicode编码?
  6. Java中注解 “@Deprecated” 的含义与如何使用?
  7. JQ+vue实现图片拼接(无限套娃版)
  8. 计算机中函数counta是什么意思,counta函数 count函数和counta函数的用法
  9. 脚本回放出现乱码而导致错误
  10. 苹果6手机怎么录屏_【苹果手机小技巧】 自带录屏功能