【小宅按】Spring 5.0 中发布了重量级组件 Webflux,拉起了响应式编程的规模使用序幕。

WebFlux 使用的场景是异步非阻塞的,使用 Webflux 作为系统解决方案,在大多数场景下可以提高系统吞吐量。Spring Boot 2.0 是基于 Spring5 构建而成,因此 Spring Boot 2.X 将自动继承了 Webflux 组件,本篇给大家介绍如何在 Spring Boot 中使用 Webflux 。

为了方便大家理解,我们先来了解几个概念。

响应式编程

在计算机中,响应式编程或反应式编程(英语:Reactive programming)是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。

例如,在命令式编程环境中,a=b+c 表示将表达式的结果赋给 a,而之后改变 b 或 c 的值不会影响 a 。但在响应式编程中,a 的值会随着 b 或 c 的更新而更新。

响应式编程是基于异步和事件驱动的非阻塞程序,只需要在程序内启动少量线程扩展,而不是水平通过集群扩展。

用大白话讲,我们以前编写的大部分都是阻塞类的程序,当一个请求过来时任务会被阻塞,直到这个任务完成后再返回给前端;响应式编程接到请求后只是提交了一个请求给后端,后端会再安排另外的线程去执行任务,当任务执行完成后再异步通知到前端。

Reactor

Java 领域的响应式编程库中,最有名的算是 Reactor 了。Reactor 也是 Spring 5 中反应式编程的基础,Webflux 依赖 Reactor 而构建。

Reactor 是一个基于 JVM 之上的异步应用基础库。为 Java 、Groovy 和其他 JVM 语言提供了构建基于事件和数据驱动应用的抽象库。Reactor 性能相当高,在最新的硬件平台上,使用无堵塞分发器每秒钟可处理 1500 万事件。

简单说,Reactor 是一个轻量级 JVM 基础库,帮助你的服务或应用高效,异步地传递消息。Reactor 中有两个非常重要的概念 Flux 和 Mono 。

Flux 和 Mono

Flux 和 Mono 是 Reactor 中的两个基本概念。Flux 表示的是包含 0 到 N 个元素的异步序列。在该序列中可以包含三种不同类型的消息通知:正常的包含元素的消息、序列结束的消息和序列出错的消息。当消息通知产生时,订阅者中对应的方法 onNext(), onComplete()和 onError()会被调用。

Mono 表示的是包含 0 或者 1 个元素的异步序列。该序列中同样可以包含与 Flux 相同的三种类型的消息通知。Flux 和 Mono 之间可以进行转换。对一个 Flux 序列进行计数操作,得到的结果是一个 Mono对象。把两个 Mono 序列合并在一起,得到的是一个 Flux 对象。

WebFlux 是什么?

WebFlux 模块的名称是 spring-webflux,名称中的 Flux 来源于 Reactor 中的类 Flux。Spring webflux 有一个全新的非堵塞的函数式 Reactive Web 框架,可以用来构建异步的、非堵塞的、事件驱动的服务,在伸缩性方面表现非常好。

非阻塞的关键预期好处是能够以小的固定数量的线程和较少的内存进行扩展。在服务器端 WebFlux 支持2种不同的编程模型:

  • 基于注解的 @Controller 和其他注解也支持 Spring MVC
  • Functional 、Java 8 lambda 风格的路由和处理

如图所示,WebFlux 模块从上到下依次是 Router Functions、WebFlux、Reactive Streams 三个新组件。

  • Router Functions 对标准的 @Controller,@RequestMapping 等的 Spring MVC 注解,提供一套 函数式风格的 API,用于创建 Router、Handler 和Filter。
  • WebFlux 核心组件,协调上下游各个组件提供 响应式编程 支持。
  • Reactive Streams 一种支持 背压 (Backpressure) 的 异步数据流处理标准,主流实现有 RxJava 和 Reactor,Spring WebFlux 集成的是 Reactor。

默认情况下,Spring Boot 2 使用 Netty WebFlux,因为 Netty 在异步非阻塞空间中被广泛使用,异步非阻塞连接可以节省更多的资源,提供更高的响应度。通过比较 Servlet 3.1 非阻塞 I / O 没有太多的使用,因为使用它的成本比较高,Spring WebFlux 打开了一条实用的通路。

值得注意的是:支持 reactive 编程的数据库只有 MongoDB, redis, Cassandra, Couchbase

Spring Webflux

Spring Boot 2.0 包括一个新的 spring-webflux 模块。该模块包含对响应式 HTTP 和 WebSocket 客户端的支持,以及对 REST,HTML 和 WebSocket 交互等程序的支持。一般来说,Spring MVC 用于同步处理,Spring Webflux 用于异步处理。

Spring Boot Webflux 有两种编程模型实现,一种类似 Spring MVC 注解方式,另一种是基于 Reactor 的响应式方式。

快速上手

添加 webflux 依赖

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

通过 IEDA 的依赖关系图我们可以返现spring-boot-starter-webflux依赖于spring-webflux、Reactor 和 Netty 相关依赖包。

创建 Controller

@RestController
public class HelloController {@GetMapping("/hello")public Mono<String> hello() {return Mono.just("Welcome to reactive world ~");}
}

通过上面的示例可以发现,开发模式和之前 Spring Mvc 的模式差别不是很大,只是在方法的返回值上有所区别。

  • just() 方法可以指定序列中包含的全部元素。
  • 响应式编程的返回值必须是 Flux 或者 Mono ,两者之间可以相互转换。

测试类

@RunWith(SpringRunner.class)
@WebFluxTest(controllers = HelloController.class)
public class HelloTests {@AutowiredWebTestClient client;@Testpublic void getHello() {client.get().uri("/hello").exchange().expectStatus().isOk();}
}

运行测试类,测试用例通过表示服务正常。启动项目后,访问地址:http://localhost:8080/hello,页面返回信息:

Welcome to reactive world ~

证明 Webflux 集成成功。

以上便是 Spring Boot 集成 Webflux 最简单的 Demo ,后续我们继续研究 Webflux 的使用。

示例

全网最全的 Spring Boot 学习示例项目,击下方链接即可获取。

示例代码-github

示例代码-码云

更多精彩内容,请滑至顶部点击右上角关注小宅哦~


来源:纯洁的微笑博客 作者:纯洁的微笑

springboot异步注解_Spring Boot 2 :Spring Boot 中的响应式编程和 WebFlux 入门相关推荐

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

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

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

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

  3. Spring Webflux 响应式编程 (二) - WebFlux编程实战

    第一章 Reactive Stream 第1节 jdk9的响应式流 就是reactive stream,也就是flow.其实和jdk8的stream没有一点关系.说白了就一个发布-订阅模式,一共只有4 ...

  4. Spring下Redis的响应式编程

    Spring5支持响应式编程方式,能大大提高系统的吞吐量,但是要想实现整个系统的响应式编程需要每个环节都要实现,今天就来讲讲Spring是如何实现Redis的响应编程的. Spring Data Re ...

  5. Spring 响应式编程,真香!!!

    一.前言 响应式编程是啥? 为啥要有响应式编程? 响应式流的核心机制是什么? Spring 响应式编程能解决我们平时开发的什么痛点? Spring 响应式编程有哪些应用场景? Spring 响应式编程 ...

  6. SpringBoot进击 | 一浅出:Spring Boot简单快速上手书

    为了后继的 Spring Cloud 学习和进阶,我们需要先行了解 Spring Boot. 1.前言 1.1 认识 Spring Boot Spring Boot 是由 Pivotal 团队提供的全 ...

  7. springboot 分层_限量!阿里Spring Boot成长笔记终开源!理论实战满满

    前言 随着微服务理念的盛行,微框架的概念也随之诞生,而其中最耀眼的,当属SpringBoot.虽然之前Dropwizard是公认的最早的微框架,但SpringBoot"青出于蓝而胜于蓝&qu ...

  8. 【Spring Boot 2.0学习之旅-15】SpringBoot2.0响应式编程

    SpringBoot2.0响应式编程 一.SpringBoot2.0 响应式编程基础知识 Spring WebFlux官方文档 SpringBoot WebFlux文档 1.什么是Spring Web ...

  9. Spring Boot 实践折腾记(10):响应式编程支持库Reactor

    Spring Boot 2.0发布已经过去了2个多月,随着微服务的流行,Spring Boot也越来越受到青睐,更好的隔离编程范式得到了越来越多项目的应用,这是一件值得高兴的事. Spring Boo ...

最新文章

  1. 在浏览器中输入 Google.com 回车之后发生了什么?
  2. Android-PullLayout
  3. centos7下qt creator python配置
  4. mysql常用的分组函数
  5. 零宽断言java_正则表达之零宽断言(零宽度正预测先行断言)
  6. 实现 通过数据库里一个字段值相等 则把 他合为一条数据
  7. PowerShell 学习笔记 - 2 PS Module
  8. Spark利用(idea+maven+scala)创建wordcount打包jar并在spark on yarn上运行——Spark的开发
  9. Atitit 常见硬件集成列表 目录 1.1. 小程序设备类 1 1.2. atitit.常见手机的传感器与外设 attilax总结 1 1.3. Pc机外设 1 1.4. 设备管理器 2 1.1
  10. 勇芳软件测试,勇芳自动刷分精灵
  11. 8大轻型网管工具,网络管理好帮手
  12. Microsoft.mshtml.dll 添加引用及类型选择错误问题解决办法
  13. 计算机清理垃圾代码,你也可以写代码系列,一键清除系统垃圾文件的代码(超简单)-清除垃圾文件...
  14. 百度地图api 在3D地图中设置自定义样式
  15. 07、Flutter FFI 数组
  16. 使用UNIAPP开发APP教程-01框架搭建
  17. 《最终幻想》《古墓丽影》发行商Square Enix开始涉足NFTs和区块链游戏
  18. 用批处理文件检测u盘并进行复制
  19. 如何判断一个数据是NaN
  20. 苹果服务器维护时间表2019,ios 内购详解(2019)

热门文章

  1. sun.misc.Unsafe和堆外内存
  2. Java安全教程–创建SSL连接和证书的分步指南
  3. Java内部具有原子更新的动态热交换环境
  4. 动态表单,JSF世界早已等待
  5. vue 分模块打包 脚手架_一步步从头搭建 Vue 开发环境
  6. SimpleDateFormat详解
  7. Thread 线程同步、线程状态
  8. python selenium 点击开始按钮_使用Selenium和Python单击一个按钮
  9. php domdocument getelementbyid,PHP DOMDocument- getElementByID添加Â代替空
  10. 两个人投票的c语言程序,设计网页投票器(二)《精通Unix下C语言编程与项目实践》之十...