SpringBoot响应式编程教程-WebFlux

SpringBoot响应式编程教程-WebFlux

  • 前言
  • 正文
    • 一、Reactor
      • 1、核心概念
      • 2、核心特性
    • 二、Spring Webflux
      • 与springmvc的组件对比
    • 三、R2DBC
  • 结语

前言

最近有个项目需要用到响应式编程,一开始还是很懵的,以为是网页的自适应,通过部分文章的学习,有了基本了解,但缺乏系统学习还是难以加以运用,因此对其进行了学习,并记录自认为比较重要的部分,推荐你直接看课程笔记,如下链接 #.#
本篇文章课程链接:尚硅谷SpringBoot响应式编程教程,2024最新springboot3入门到实战
课程笔记链接:https://www.yuque.com/leifengyang/springboot3/rg4wqgdbg8mfv04q
课程代码链接:https://gitee.com/leifengyang/reactor-programming.git
webflux官网地址:webflux官网地址

简单理解:
替代 SpringMvc,使用SpringWebFlux,SpringWebFlux使用的容器也不在是Tomcat,而是用的netty,与之相应的框架也需要支持响应式,mybatis、jdbc等不支持响应式就不能使用了。 好处:天然支持高并发,资源利用率很高,较低配置就能实现高的并发。

原来的阻塞式编程: 浏览器 --> Controller --> Service --> Dao
响应式编程:Dao(数据发布者) --> Service --> Controller --> 浏览器

学习前提: 需掌握 java8 lambda 表达式相关操作

正文

一、Reactor

官方介绍: Reactor 是一个用于JVM的完全非阻塞的响应式编程框架,具备高效的需求管理(即对 “背压(backpressure)”的控制)能力。它与 Java 8 函数式 API 直接集成,比如 CompletableFuture, Stream, 以及 Duration。它提供了异步序列 API Flux(用于[N]个元素)和 Mono(用于 [0|1]个元素),并完全遵循和实现了“响应式扩展规范”(Reactive Extensions Specification)。
Reactor 的 reactor-ipc 组件还支持非阻塞的进程间通信(inter-process communication, IPC)。 Reactor IPC 为 HTTP(包括 Websockets)、TCP 和 UDP 提供了支持背压的网络引擎,从而适合 应用于微服务架构。并且完整支持响应式编解码。
可以将其简单的理解为 MQ 操作,请求先放到队列,然后在依次处理。

历史背景: 在响应式编程方面,微软跨出了第一步,它在 .NET 生态中创建了响应式扩展库(Reactive Extensions library, Rx)。接着 RxJava 在JVM上实现了响应式编程。后来,在 JVM 平台出现了一套标准的响应式 编程规范,它定义了一系列标准接口和交互规范。并整合到 Java 9 中(使用 Flow 类)

1、核心概念

1、订阅:在订阅者(Subscriber)订阅(subscribe)到一个 发布者(Publisher)之前,什么都不会发生。

2、背压:请求进来,先放到队列,线程主动获取处理,当请求过多时,也不会崩溃。

3、热(Hot) vs 冷(Cold)

热(Hot):对于每一个 Subscriber,都会收到从头开始所有的数据。如果源头 生成了一个 HTTP 请求,对于每一个订阅都会创建一个新的 HTTP 请求。不管流多久产生,后来的订阅者也会获取到数据
冷(Cold):相反,只能获取订阅后的数据,之前的就丢失了,不过注意,有些“热”的响应式流可以缓存部分或全部历史数据,又相当于“冷”的响应式流。

2、核心特性

1、Mono和Flux
Mono:代表 0或1 个数据流
Flux: 代表N个数据流
举例:

 Flux.just(1, 2, 0, 4).xxx

2、subscribe() 订阅
简单示例:

   Flux.range(1,10) // 生成一个1-10的流.handle((value,sink)->{System.out.println("拿到的值:"+value);sink.next("张三:"+value); //可以向下发送数据的通道}).log() //日志.subscribe(); // 订阅,有了此操作,流才会真正执行,这里为空时,订阅的默认流,也可以订阅官方提供的订阅者或自定义订阅者// .subscribe(new BaseSubscriber<String>() {}); // 自己定义一个订阅者

3、流的取消:消费者调用 cancle() 取消流的订阅;

4、错误处理:调用 onErrorReturn()、onErrorResume() 等方法,对异常错误进行处理

5、常用操作:filter、flatMap、concatMap、flatMapMany、transform、defaultIfEmpty、switchIfEmpty、concat、concatWith、merge、mergeWith、mergeSequential、zip、zipWith…

二、Spring Webflux

与springmvc的组件对比

在这里插入图片描述

下图就很直观的展示了两者之间的差异和联系,其实在使用层面(注解),基本都是一样的,以前怎么样,现在还怎么用。

在这里插入图片描述

三、R2DBC

前面讲到,如果要使用响应式编程,那么我们在开发过程中使用的所有组件都得支持响应式,而我们原来使用的jdbc就是不行的,R2DBC 是 Reactive Relational Database Connectivity。

组件:

  • R2dbcEntityTemplate 类似:jdbcTemplate
  • DatabaseClient

最佳实践: 提升生产效率的做法

  • Spring Data R2DBC,基础的CRUD用 R2dbcRepository 提供好了
  • 自定义复杂的SQL(单表): @Query;
  • 多表查询复杂结果集: DatabaseClient 自定义SQL及结果封装;
    @Query + 自定义 Converter 实现结果封装

结语

学习完这次课程,对响应式有了更深的理解,但对比目前项目中的使用,感觉还差不少,还得查询相关资料学习,响应式编程目前也还停留在摸索阶段,很多公司都还没有使用,但这个技术还是很有前瞻性的,值得大家学习,提早进行知识储备,到时候好升职加薪呀!!!

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

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

相关文章

【模板初阶】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 1. 泛型编程 2. 函数模板 2.1 函数模板概念 2.2 函数模板格式 2.3 函数模板的原理 2.4 函数模板的实例化 2.5 模板参数的匹配原则 3. 类模板 3.1 类模板的定义…

FPGA_工程_基于Rom的VGA图像显示

一 工程框图 框图中&#xff0c;CLK_in&#xff0c;Vga_ctrl&#xff0c;Vga_pic模块已有&#xff0c;只需要对顶层模块进行修改&#xff0c;并将rom ip例化添加到Vga_pic模块的.v文件中&#xff0c;对Vga_pic的.v文件进行一定修改。 二 理论补充 显示图像的方法&#xff1a;…

Mac 版 Excel 和 Windows 版 Excel的区别

Excel是一款由微软公司开发的电子表格程序&#xff0c;广泛应用于数据处理、分析和可视化等领域。它提供了丰富的功能和工具&#xff0c;包括公式、函数、图表和数据透视表等&#xff0c;帮助用户高效地处理和管理大量数据。同时&#xff0c;Excel还支持与其他Office应用程序的…

docker安装etherpad文档系统

效果 安装 1.创建并进入目录 mkdir -p /opt/etherpad cd /opt/etherpad 2.修改目录权限 chmod -R 777 /opt/etherpad 3.创建并启动容器 docker run -d --name etherpad --restart always -p 10054:9001 -v /opt/etherpad/data:/opt/etherpad-lite/var etherpad/etherpad:la…

【Java数据结构】ArrayList和LinkedList的遍历

一&#xff1a;ArrayList的遍历 import java.util.ArrayList; import java.util.Iterator; import java.util.List;/*** ArrayList的遍历*/ public class Test {public static void main(String[] args) {List<Integer> list new ArrayList<>();list.add(5);list…

win32编程系统BUG(Win32 API中的WM_SETTEXT消息)

由于频繁使用Win32 API中的WM_SETTEXT消息&#xff0c;导致内存占用直线上升。 暂未找到有效解决方案。

HCIA--OSPF实验

1.划分网段&#xff0c;子网划分已完成&#xff1b;接口配置&#xff1a; AR1配置 &#xff1a; [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 172.16.64.1 20 [Huawei-GigabitEthernet0/0/0]qu [Huawei]int l0 [Huawei-LoopBack0]ip add 172.16.80.1 20AR2配置…

Prime(VulnHub)

Prime 文章目录 Prime1、nmap2、web渗透随便看看首页隐写查看目录爆破gobusterferoxbusterdirsearchdirb whatwebsearchsploit WordPress 5.2.2/dev/secret.txtFuzz_For_Webwfuzzimage.phpindex.php location.txtsecrettier360文件包含漏洞包含出password.txt尝试ssh登入尝试登…

MPLS VPN功能组件

VPN实例 VPN实例即为VPN路由转发表VRF&#xff0c;不同VPN之间的路由隔离通过VPN实例实现&#xff0c;PE上存在多个路由转发表&#xff0c;包括一个公网路由转发表&#xff0c;以及一个或多个VPN路由转发表。 PE为每个直接相连的Site建立并维护专门的VPN实例&#xff0c;VPN实…

《计算机网络简易速速上手小册》第10章:未来网络技术趋势(2024 最新版)

文章目录 10.1 边缘计算与网络设计 - 未来网络的速度与激情10.1.1 基础知识10.1.2 重点案例&#xff1a;使用 Python 实现边缘计算的实时视频分析准备工作Python 脚本示例 10.1.3 拓展案例1&#xff1a;智能交通系统Python 脚本示例 - 边缘计算设备上的交通流量分析 10.1.4 拓展…

高考志愿填报模拟系统的功能和技术总结

一、金秋志愿高考志愿填报系统主要功能&#xff1a; 用户注册与登录&#xff1a;允许学生和家长注册账号&#xff0c;使用注册的账号登录系统。 个人信息管理&#xff1a;允许用户查看、修改个人信息&#xff0c;如姓名、性别、联系方式等。 高考成绩输入&#xff1a;学生输…

windows上卸载完程序后,清理残余文件,无法删除的情况处理

现象&#xff1a;通常在卸载完软件后&#xff0c;要删除残余文件或者移动残余文件时候&#xff0c;会弹出来 原因&#xff1a; 因为文件被其他程序已经加载&#xff0c;处理的目标是找到使用这个文件的进程&#xff0c;然后kill掉。类似于linux上的lsof命令查找到进程号&…

SpringOne2023解读-01-使用spring-cloud-contract与TestContainer构建可靠程序

个人创作公约&#xff1a;本人声明创作的所有文章皆为自己原创&#xff0c;如果有参考任何文章的地方&#xff0c;会标注出来&#xff0c;如果有疏漏&#xff0c;欢迎大家批判。如果大家发现网上有抄袭本文章的&#xff0c;欢迎举报&#xff0c;并且积极向这个 github 仓库 提交…

如何在vue中使用拖动排序组件sortablejs

效果图&#xff1a; 1.首先&#xff0c;我们需要在vue项目中安装依赖&#xff1a; npm install -save sortablejs2.创建demo文件>demoTest.vue&#xff0c;直接附上实例代码&#xff1a; <template><div><div id"table-names"><div class&…

如何使用CLZero对HTTP1.1的请求走私攻击向量进行模糊测试

关于CLZero CLZero是一款功能强大的模糊测试工具&#xff0c;该工具可以帮助广大研究人员针对HTTP/1.1 CL.0的请求走私攻击向量进行模糊测试。 工具结构 clzero.py - 工具主脚本&#xff1b; default.py - 包含了大多数标准攻击测试方法和字符&#xff1b; exhaustive.py - 包…

山西电力市场日前价格预测【2024-02-08】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-02-08&#xff09;山西电力市场全天平均日前电价为200.58元/MWh。其中&#xff0c;最高日前电价为347.58元/MWh&#xff0c;预计出现在07:00。最低日前电价为0.00元/MWh&#xff0c;预计出…

蓝桥杯第八届省赛题笔记------基于单片机的电子钟程序设计与调试

题目要求&#xff1a; 一、基本要求 1.1 使用 CT107D 单片机竞赛板&#xff0c;完成“电子钟”功能的程序设计与调试&#xff1b; 1.2 设计与调试过程中&#xff0c;可参考组委会提供的“资源数据包”&#xff1b; 1.3 Keil 工程文件以准考证号命名&#xff0c;保存在…

RibbonOpenFeign源码(待完善)

Ribbon流程图 OpenFeign流程图

Yii特性

Yii几乎拥有了当今Web 2.0应用发展的全部特性。下面是这些特性的一个简短的清单。 模型-视图-控制器&#xff08;MVC&#xff09;设计模式&#xff1a;Yii在WEB编程中采用这一成熟的技术从而可以更好的将逻辑层和表现层分开。数据库访问对象&#xff08;DAO&#xff09;和Acti…

Unity学习笔记之【IK反向动力学操作】

反向动力学Inverse Kinematics 反向动力学&#xff0c;简称IK。相较于正向动力学&#xff0c;反向动力学旨在子级对父级产生的影响。 使用IK&#xff0c;可以实现根据目标位置或方向来计算并调整角色的关节&#xff08;骨骼&#xff09;链&#xff0c;以使角色的末端&#xff…