SpringBoot中的响应式编程和WebFlux入门

SpringBoot中的响应式编程和WebFlux入门

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

WebFlux 使用的场景是异步非阻塞的,使用 Webflux 作为系统解决方案,在大多数场景下可以提高系统吞吐量。

Spring Boot 2.0 是基于 Spring5 构建而成,因此 Spring Boot 2.X 将自动继承了 Webflux 组件,本篇给大家介绍

如何在 Spring Boot 中使用 Webflux 。

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

1、响应式编程

在计算机中,响应式编程或反应式编程(英语: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 对象。

2、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 的响应式

方式。

3、快速上手

3.1 pom依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.2.RELEASE</version><relativePath/></parent><groupId>com.example</groupId><artifactId>spring-boot-webflux</artifactId><version>0.0.1-SNAPSHOT</version><name>spring-boot-webflux</name><description>spring-boot-webflux</description><packaging>jar</packaging><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

通过 IEDA 的依赖关系图我们可以发现spring-boot-starter-webflux依赖于spring-webfluxReactor

Netty 相关依赖包。

3.2 创建 Controller

package com.example.web;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;@RestController
public class HelloController {@GetMapping("/hello")public Mono<String> hello() {return Mono.just("Welcome to reactive world ~");}
}

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

  • just() 方法可以指定序列中包含的全部元素。

  • 响应式编程的返回值必须是 Flux 或者 Mono ,两者之间可以相互转换。

3.3 启动类

package com.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}

3.4 测试类

package com.example;import com.example.web.HelloController;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.reactive.server.WebTestClient;@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 的使用。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

新增支持Elasticsearch数据源,支持自定义在线地图风格,DataEase开源BI工具v2.10.2 LTS发布

2024年11月11日&#xff0c;人人可用的开源BI工具DataEase正式发布v2.10.2 LTS版本。 这一版本的功能变动包括&#xff1a;数据源方面&#xff0c;新增了对Elasticsearch数据源的支持&#xff1b;图表方面&#xff0c;对地图类和表格类图表进行了功能增强和优化&#xff0c;增…

selenium自动化测试框架

一、Selenium自动化测试&#xff08;基于python&#xff09; 1、Selenium简介&#xff1a; 1.1 Selenium是一款主要用于Web应用程序自动化测试的工具集合。Selenium测试直接运行在浏览器中&#xff0c;本质是通过驱动浏览器&#xff0c;模拟浏览器的操作&#xff0c;比如跳转…

C++中级学习笔记

1.内存分区模型&#xff1a; C程序在执行时&#xff0c;将内存大方向划分为四个区域 &#xff08;1&#xff09;代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理 &#xff08;2&#xff09;全局区&#xff1a;存放全局变量和静态变量以及变量 &am…

基于深度卷积二元分解网络的齿轮和轴承故障特征提取方法

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

Qml-Timeline的使用

Qml-Timeline的使用 Timeline的概述 Timeline&#xff1a;根据关键帧及其缓和曲线指定项目的值属性currentFrame : double&#xff1a;当前帧 属性enabled : bool&#xff1a;是否使能时间线 属性endFrame : double&#xff1a;结束帧值 属性startFrame : double&#xff1a;…

Vue指令详解——以若依框架中封装指令为例分析

自定义指令 在Vue.js中&#xff0c;自定义指令提供了一种非常灵活的方式来扩展Vue的功能。以下是对Vue中自定义指令的详细解释&#xff1a; 一、自定义指令的基本概念 自定义指令允许开发者直接对DOM元素进行低层次操作&#xff0c;而无需编写大量的模板或者JavaScript代码。…

基于微信小程序的大学生心理健康测评系统设计与实现,LW+源码+讲解

摘 要 随着移动互联网的发展&#xff0c;理论和技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对高校教师成果信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性…

一步到位:用Python实现PC屏幕截图并自动发送邮件,实现屏幕监控

软件测试资料领取&#xff1a;[内部资源] 想拿年薪40W的软件测试人员&#xff0c;这份资料必须领取~ 软件测试面试刷题工具&#xff1a;软件测试面试刷题【800道面试题答案免费刷】 在当前的数字化世界中&#xff0c;自动化已经成为我们日常生活和工作中的关键部分。它不仅提…

jwt用户登录,网关给微服务传递用户信息,以及微服务间feign调用传递用户信息

1、引入jwt依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency> 2、Jwt工具类&#xff0c;生成token以及解析token package com.niuniu.gateway.uti…

基于Multisim数字电子秒表计时器电路(含仿真和报告)

【全套资料.zip】数字电子秒表电路Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 数字电子秒表电路 1.秒表由3个显示器显示&#xff0c;其中显示分辩率为1s&#xff0c;计时范围是6分59…

手把手教你30秒下载Typora通用版(mac、win适用)

话不多说&#xff01; 1、去官网选择mac版本下载安装&#xff1a; typora下载 然后打开 typora 包内容找到 / Applications / Typora . app / Contents / Resources / TypeMark / 用编辑器打开上面文件夹&#xff0c; vscode 示例&#xff1a; 找到 page - dist / static / …

鸿蒙ZRouter动态路由框架—生命周期管理能力

文章目录 基本使用(单个页面生命周期&#xff09;页面的全局生命周期监听工作流程图源码 ZRouter从1.1.0版本开始支持生命周期函数管理能力&#xff0c;主要有以下特点&#xff1a; 不影响你原有的生命周期业务逻辑&#xff0c;对NavDestination页面保持着零侵入性&#xff0c;…

英伟达GB200、B200、H200、H100、A100、4090的参数对比

以下是英伟达GB200、B200、H200、H100、A100、4090的参数对比&#xff1a; 型号 架构 制造工艺 晶体管数量 显存类型 显存容量 显存带宽 CUDA核心数 其他主要特性 GB200 Blackwell 未知 2个B200 GPU共4160亿 HBM3e 每颗B200 GPU 192GB&#xff08;总384GB&#x…

IntelliJ+SpringBoot项目实战(五)--配置Druid在线监控数据库

阿里的Druid插件有可视化监控数据库性能的界面。在SpringBoot中集成Druid后&#xff0c;可以进入可视化Html界面监控数据库运行情况。本文先介绍Druid的管理界面&#xff0c;然后在介绍Druid的详细配置。 首先访问http://localhost:8001/druid/ ,打开登录页面&#xff1a; 然后…

2024年小红书代运营公司推荐:品牌种草新阵地

2024年小红书代运营公司推荐&#xff1a;品牌种草新阵地 随着今年双十一的落幕&#xff0c;各大平台通过各具特色的活动实现了优异的表现&#xff0c;标志着国内电商市场全面进入了全域运营的新时代。未来&#xff0c;电商行业将呈现“货架电商内容电商”相结合的趋势。小红书作…

什么是闰秒?

闰秒概念是 1972年提出的&#xff0c;之所以有这个概念&#xff0c;主要是因为由于潮汐等自然现象的影响&#xff0c;地球的自转速度并不是恒定的。 所以&#xff0c;每隔一段时间世界标准时间「协调世界时&#xff08;UTC&#xff09;」会依据地球围绕太阳运动计算的「世界时…

PySide6百练成真(9)

资源的加载 给控件加上图标 1.内置图标 2.自定义资源文件 3.Rcc的使用(基于designer) 4.如果获取资源文件 rcc的使用,基于xml文件 内置图标 from PySide6.QtWidgets import QApplication, QLabel, QVBoxLayout, QWidget, QLineEdit, QToolBox, QMainWindow, QPushButton,QSt…

cmake vscode

cmake_minimum_required(VERSION 3.20.0) project(my_hello) //指定项目 set(CMAKE_CXX_STANDARD 11) //指定c的版本 include_directories( P R O J E C T S O U R C E D I R / i n c l u d e ) / / 包含头文件的目录 / / 指定可执行文件生成目录 s e t ( E X E C U T A B L E…

李耳著《老子》与董仲舒著《道德经》有何区别?

马王堆帛书《老子》的发现&#xff0c;确实为研究《道德经》提供了更为接近原始的版本&#xff0c;其内容与传世本存在诸多不同之处&#xff0c;这些差异不仅体现在文字和篇章结构上&#xff0c;更在于思想内涵和哲学意蕴的深度。以下是具体分析&#xff1a; 版本命名&#xff…

5. ARM_指令集

概述 分类 汇编中的符号&#xff1a; 指令&#xff1a;能够编译生成一条32位机器码&#xff0c;并且能被处理器识别和执行伪指令&#xff1a;本身不是指令&#xff0c;编译器可以将其替换成若干条指令伪操作&#xff1a;不会生成指令&#xff0c;只是在编译阶段告诉编译器怎…