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

【小宅按】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 风格的路由和处理

a31e7dfdaa3da474b29aac8995dd1256.png

如图所示,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>

1611c0cf1b1f6e45a26ebd6b1692c55d.png

通过 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

示例代码-码云

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

fe5b1aee170542032df5cb1096db69cf.gif

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346545.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

结尾的单词_22个以“ez”结尾的西语单词,你掌握了吗?

22 palabras que terminan en -ez22个以“-ez”结尾的西语单词ntido → nitidez 清澈&#xff0c;透明lcido → lucidez 光亮&#xff1b;清楚plido → palidez 苍白&#xff1b;暗淡rpido → rapidez 迅速cido → acidez 酸性estrecho → estrechez 狭窄esbelto → esb…

python xlwt xlrd模块详解_python操作excel之xlrd、xlwt模块详解

python操作excel主要用到xlrd和xlwt这两个库&#xff0c;即xlrd是读excel&#xff0c;xlwt是写excel的库。 可从这里下载https://pypi.python.org/pypi。下面分别记录python读和写excel. python读excel——xlrd 这个过程有几个比较麻烦的问题&#xff0c;比如读取日期、读合并单…

江苏省计算机等级知识,江苏省计算机二级考试基础知识_计算机基础练习题

计算机及发展1&#xff0e;早期计算机的主要应用是_________。A&#xff0e;科学计算 B. 信息处理 C. 实时控制 D. 辅助设计2&#xff0e;数据库技术在信息系统中主要用于_________。A&#xff0e;信息采集 B. 信息存储 C. 信息传输 D. 信息检索3&#xff0e;中国的巨型机的典型…

java知识回顾_Java7 –回顾

java知识回顾我开始写博客文章&#xff0c;介绍即将发布的Java8版本中的新增功能 &#xff0c;并认为我将从快速回顾一下Java7带给我们的内容开始。 Java7于2011年7月发布&#xff0c;被描述为“更具进化性而非革命性”。 “虽然有了一些重大改进&#xff0c;但并没有真正破土…

python应届生找工作在深圳_应届毕业程序员找工作,企业最看重你们这些地方

这篇文章来谈一下应届生找工作的问题&#xff0c;最近有很多在校大学生跟我咨询很多企业很多工作要求有工作经验&#xff0c;那这样没工作经验的人都去哪学经验&#xff0c;要求工作经验真的有必要吗&#xff1f;应届生毕业找工作&#xff0c;一直有一个困惑是什么&#xff0c;…

计算机模拟技术在教学上的应用,计算机模拟技术在水利工程学科试验教学中的应用...

[摘要]本文对水利工程试验教学中计算机模拟技术的应用问题进行了初步探讨&#xff0c;计算机模拟是一项技术&#xff0c;同时也是一种学习环境、教学模式、教学思想。计算机模拟教学应用的研究涉及了现代教育技术、教育心理、课程结构、教学内容的安排等多个领域。本文尝试为水…

PHP密码问题陈婷代码_PHP实现登录注册

一、首先实现一个PHP的简单登录注册的话 我们要简单的与后端定义一下接口和传输数据的方式 并且我们要有一个phpStudy服务器。第一步&#xff1a;当我们点击注册按钮的时候数据库要接收到客户端请求的数据 第二步&#xff1a;接收到数据以后服务器要处理数据&#xff1a;1.确定…

在Spring Boot中使用Vaadin的简介

介绍 Vaadin的工作方式依赖于服务器端渲染&#xff0c;因此可以自然地集成到诸如Spring之类的框架中。 Vaadin的Spring集成已经存在了一段时间&#xff0c;并且提供了用于在Spring容器中配置和管理Vaadin的工具&#xff0c;如果您希望将Vaadin与Spring Boot结合使用&#xff0c…

python如何读取数据保存为新格式_python,初学者应用实例:读取文件中的数据,将将北京时间转换成世界时间,再保存成新的CSV格式文件...

数据格式转换是科研工作中经常需要完成的任务。本程序实现了这个功能。将文本文件“TableS1.dat”中的数据读取&#xff0c;原文件格式为&#xff1a; No Date Time Mag Dis 11999/07/2505:28:39.580 21999/07/2523:06:31.940 31999/08/0601:54:40.6001.012.5 41999/08/1708:01…

哈工大三本计算机考研,纯干货【普通三本逆袭哈工大】—城市规划考研必胜经验...

【专业课】楼主就想起来什么就总结点什么吧&#xff0c;你们就知足吧&#xff01;话说专业课是你相对来说比较吃亏的一科目(与本校学生相比较)&#xff0c;为什么说吃亏呢&#xff1f;No.1&#xff1a;人家本校都学过&#xff0c;至少知道每门课的知识点是什么&#xff0c;每个…

excel转las文件_这3种Word、Excel格式不变的互转方法,实在太好用了

日常工作中用Word写总结、写报告&#xff0c;写分析&#xff0c;一定离不开数据支持。但在制作的过程中你一定碰到过这些问题&#xff1a;Excel里做的表格、图表&#xff0c;一复制到word就变的乱七八糟&#xff01;那么&#xff0c;有没有什么好的方法&#xff0c;即省时&…

stm32编码器正反转计数程序_光电编码器接线图分析

编码器(encoder)是将信号(如比特流)或数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备。光电编码器如果按信号原理来分类的话&#xff0c;可以分为增量型编码器和绝对型编码器。旋转编码器是一种光电式旋转测量装置&#xff0c;它将被测的角位移直接转换成数字信号…

jieba库词频统计_如何用python对《三国演义》、《红楼梦》等名著开展词云分析及字频统计、出场统计等工作。...

以下以《红楼梦》为例进行设计。在制作词云图及统计之前&#xff0c;需要下载python的几个库&#xff0c;wordcloud、jieba以及imageio等&#xff0c;我的操作系统为Windows10&#xff0c;IDE环境为idle&#xff0c;下载方式就直接搜索cmd&#xff0c;打开命令提示符窗口&#…

计算机学院考勤管理办法,计科学院进一步加强课堂考勤实施意见(试行)

为了加强课堂教学管理、规范教学秩序、强化学生课堂出勤率、提高课堂教学效果&#xff0c;进一步推动教风、学风建设&#xff0c;结合我院课堂教学中存在的实际问题&#xff0c;提出如下实施意见&#xff1a;一、学生必须严格按照修读课程计划表按时上课&#xff0c;不得迟到或…

java8的新特性_Java8的

java8的新特性Java8没有安排释放&#xff0c;直到2014年3月&#xff0c;但早期发行版本已经可用了一段时间。 一些最有趣的新功能是&#xff1a; 流 功能接口 默认方法 Lambdas Java时间 流 新的java.util.stream软件包包含“支持元素流上的功能样式操作的类”。 流不是一…

数学史思维导图_【学科活动】思维导图展风采,数学文化提素养——庆云县第四中学(北校区)四年级数学组活动小记...

思维无限 导我所想思维的火花跨越时空&#xff0c;照亮昨天、今天和明天。人类从茹毛饮血、采集狩猎到今天足不出户购遍全球&#xff0c;人工智能、大数据信息处理融入每个人的生活。这其中&#xff0c;最大的改变就是思维方式的改变。——题记思维导图又叫心智导图&#xff0c…

计算机新入学教案,计算机应用 新教案(1-6周).doc

计算机应用 新教案(1-6周)广州康大职业技术学院《计算机应用基础》课程教案计算机系(部) 教师曹丽萍&#xff1a;使 用 年 月 日周次班 次星期节 次教案编号12013-2-26一12经贸1班二1-22012-2-27一12经贸1班三3-4 学习内容第1章 计算机基础知识课时4教学目标专业能力1、了解计算…

python集合用法_Python 集合(Set)

集合 集合是无序、无索引的数据集。在Python中&#xff0c;集合用花括号包裹。 示例 创建集合: thisset {"自行车", "汽车", "高铁"} print(thisset) 注意: 集合是无序的&#xff0c;因此项目将以随机顺序出现。 访问集合项目 不能通过索引来访…

记录更新(Java数据类)

最近几个月&#xff0c;有一些与“ Java数据类”&#xff08;又称为“记录”&#xff09;有关的更新。 正如我在“ JavaFX&#xff0c;Valhalla&#xff0c;数据类和Java的浮点更新 ”一文中简短提到的那样&#xff0c; Brian Goetz的“ Java数据类 ”“探讨了Java语言中数据类…

k2677场效应管参数引脚_共射极放大电路,场效应管放大电路,运算放大电路

电子技术、无线电维修及SMT电子制造工艺技术绝不是一门容易学好、短时间内就能够掌握的学科。这门学科所涉及的方方面面很多&#xff0c;各方面又相互联系&#xff0c;作为初学者&#xff0c;首先要在整体上了解、初步掌握它。无论是无线电爱好者还是维修技术人员&#xff0c;你…