Springboot2.0中webflux到底优秀在哪里

2023-11-18

Spring-boot-webflux中所说的反应堆式编程reactor到底优秀在哪里?

小编的Springboot2.0的课程已经快全部写完了。总结来看,对于有基础的同学学习难度不是很大,一周内就能上手。但是在小编看来编程如果说只会用,而不了解其编程模型和这样设计的好处,其实对于开发人员来说,并没有多大的收获!所以为了让感兴趣的同学对2.0编程模型反应式编程和Mono,Flux有一个清醒的认识,减少后面的学习难度。小编我总结了这篇文章。文章概念性东西比较多,希望大家有所收获!

目录
什么是反应式编程(Reactive)?
反应式的编程模型的好处是什么?
代码如何去实现反应式编程?
Mono和Flux常用API
Mono和Flux在Webflux中的用处?
1.什么是反应式编程(Reactive)?
Reactive小编理解下来就是基于事件驱动(事件模式或者说订阅者模式),类似于Netty异步事件编程模型,对不同的事件做不同的处理。所有信息都通过一个编程模型处理,就像水在管道里面运动一样(这里把事件比作水流)

所有的信息都封装成一个Channel,这个channel就像在管道中流动一样,被管道中的这些处理器所处理。

比如大名鼎鼎的React 前端框架配合redux 流模型,将服务器返回的信息包装成action数据流,然后根据action去映射到页面上,页面随着action的改变而改变。页面和数据就相当于这管道中的东西,被一层一层的梳理,展示。

2. 反应式的编程模型的好处是什么?
为了给各位看官充分证明其好处,我们先来分析下传统的模式有哪些不足!

作为Java web开发人员,我们写的最多的代码都是放在web容器中tomcat中运行的,Tomcat就是基于Servelt运行的,我们回顾下Servlet的知识,可能我们最熟悉的就是HttpServletRequest,和HttpServletResponse

当你脑子中有Servlet的概念就好理解了。

Servlet3.0之前 线程会一直阻塞,只有当业务处理完成并返回后时结束 Servlet线程。
3.0规范其中一个新特性是异步处理支持,即是在接收到请求之后,Servlet 线程可以将耗时的操作委派给另一个线程来完成,在不生成响应的情况下返回至容器
这样说可能大家还不太容易理解,我们来举一个例子(这点引用小编之前写的文章)SpringBoot2.0之WebFlux解析及实战
eg: 我们假设,设置tomcat最大线程为200,遇到200个非常耗时的请求

那么当有200个线程同时并发在处理,那么当来201个请求的时候,就已经处理不了,因为所有的线程都阻塞了。这是3.0之前的处理情况

而3.0之后异步处理是怎样处理呢?学过Netty通信框架的同学会比较容易理解一点,Servlet3.0类似于Netty一样就一个boss线程池和work线程池,boss线程只负责接收请求,work线程只负责处理逻辑。那么servlet3.0规范中,这200个线程只负责接收请求,然后每个线程将收到的请求,转发到work线程去处理。因为这200个线程只负责接收请求,并不负责处理逻辑,故不会被阻塞,而影响通信,就算处理非常耗时,也只是对work线程形成阻塞,所以当再来请求,同样可以处理,其主要应用场景是针对业务处理较耗时的情况可以减少服务器资源的占用,并且提高并发处理速度。

3.代码如何去实现反应式编程?
前面说了反应式编程可以理解为事件模式或者是订阅者模式,我们如何去实现事件模式?

小编在这里引入两个框架或许各位看官就理解了

RxJava
下图是RxJava小编写的例子,大概描述下,事件源即使onNext方法的入参,将信息发送,消费者就是

subscribe方法,里面会对事件源做处理,onCompleted: 完成 onError:错误

Guava的EventBus实现
怎么样订阅者模式,或者是观察者模式是不是很好理解

但是我们还是觉得这种方法,太复杂了,比如我们为了扩展性,就创建了这么多类. 那么我们怎么更简单呢? 接下来介绍EventBus使用,只要掌握一个注解@Subscribe就可以了.

4.Mono和Flux常用API
Mone和Flux都是数据反应式编程的核心组件,开发人员就是多利用其编写出高效率的代码

Reactor是JVM的完全非阻塞反应式编程基础,具有高效的需求管理(以管理“背压”的形式)。它直接与Java 8功能的API,特别是整合CompletableFuture,Stream和 Duration。它提供了可组合的异步序列API Flux(用于[N]元素)和Mono(用于[0 | 1]元素),广泛地实现了Reactive Extensions规范。这段的重点是和Java8结合利用lambda表达式简洁的优点。

Flux 相当于一个 RxJava Observable 观察者

观察者可以把生产者的消息Publisher,推送给消费者subscribe


我们可以把Mono理解为一个结果它对应的数据是 1,其实可以理解为对结果的一个包装

5.Mono和Flux在Webflux中的用处?

更令小编感到热血沸腾的是SpringBoot2.0后可以用Netty作为web容器,我们构建一个web项目更简单了,小编曾羡慕过Node.js构建web项目的便捷,只需要10行左右代码,就能构建出一个web项目或者更短。如今我们利用SpringBoot2.0也可以了5行。

好了这篇文章就到这里了,相信你对springboot2的webflux和reactive都有一个大概的认识了,下一步学习Springboot2其他webflux组件就相对比较简单了,喜欢的童鞋点击下关注,小编会持续为你推送最新的技术文章。

Flux参考地址

以上是小编的理解,可能也不是全对,欢迎指出问题批评,技术交流,思想碰撞的火花,才能促进进步,最后小编希望和各位看官一起共同进步。


————————————————
版权声明:本文为CSDN博主「chinesszz」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Message_lx/article/details/81075766

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Springboot2.0中webflux到底优秀在哪里 的相关文章

随机推荐

  • 华为校招机试题-寻找链表的中间结点-2023年

    题目描述 给定一个单链表 L 请编写程序输出 L 中间结点保存的数据 如果有两个中间结点 则输出第二个中间结点保存的数据 例如 给定 L 为 1 7 5 则输出应该为 7 给定 L 为 1 2 3 4 则输出应该为 3 输入描述 每个输入包
  • echart - 圆角环形图 -模板

    一 最近遇到圆角环形图的需求 搞了半天 才找到一个合适的模板 在这里就分享给大家 希望对有需求的小伙伴有所帮助 废话不多说 先贴效果图 然后再贴源码 tip 大家记得要引入一下echart js的文件啊 这样才可以显示出来 路径记得找的要对
  • QT QLabel样式设置

    需要设置error的样式 设置样式 color rgb 255 0 0 font size 12pt font family Microsoft YaHei 字体 颜色也可通过富文本设置在程序中设置 emit LoginError QStr
  • 一文带你了解如何编写自动化测试用例

    自动化测试脚本 什么是自动化测试 自动化测试是验证和验证软件是否满足所有用户需求 并使用自动化工具按预期运行 它检查在产品开发阶段期间和之后出现的错误 问题和其他类型的缺陷 这种类型的软件测试运行在由测试工具处理的编程脚本上 有多种测试工具
  • 关于rider引入使用nuget无法加载包的解决方式

    关于rider引入使用nuget无法加载包的解决方式 这个问题已经是困扰我三天了 因为C 使用rider开发的人相对较少 也可能是我自身遇到这个问题比较特殊 终于找到了nuget无法引入包的解决方案 首先看图 我在Nuget下面查找Nuni
  • 蓝桥杯基础练习VIP——矩阵乘法——快速幂

    题目https www dotcpp com oj problem1472 html 1 普通做法 循环嵌套 n m list map int input split mat for i in range n row list map in
  • uniapp 仿网易云音乐播放器 微信小程序

    效果视频 uniapp 仿照网易云播放器功能 效果截图 上代码
  • pxe无盘服务器教程,[教程]Synology+PXE挂载iSCSI网络无盘启动Win7(08.04更新)

    本帖最后由 shuaiking 于 2020 5 16 09 32 编辑 前言 之前发了一篇关于 synology部署无盘win7的帖子https www chiphell com thread 823492 1 1 html 教程本想找个
  • Android Studio 从安装到第一个Android 应用Demo

    安装Android Studio 安装需要 上网 我这挺顺利的 就是在官网下载安装包 一路 Next 大概连下载总共半个小时 第一个应用 参考官方教程 https developer android com codelabs basic a
  • 智能指针的deleter机制

    一 介绍 智能指针的deleter机制是指 当智能指针的引用计数降为0时 智能指针会自动调用一个指定的析构函数 deleter 来释放所管理的内存 这个析构函数通常是一个函数对象 可以是一个函数指针 一个lambda表达式或者一个重载了函数
  • 基于模型的六轴机器人阻抗力控制算法(matlab simscape,机器人模型可换)

    基于模型的六轴机器人阻抗力控制算法 matlab simscape 机器人模型可换 视频中红色为期望轨迹 黑色为实际轨迹 工程可一键运行 可学到机器人阻抗力控制算法以及通过m文件设置simulink参数及调用simulink的方法 ID 4
  • FutureWarning: Criterion ‘mse‘ was deprecated in v1.0 and will be removed in version 1.2.

    出现FutureWarning Criterion mse was deprecated in v1 0 and will be removed in version 1 2 Use criterion squared error whic
  • c++如何按照空格分割字符串

    我们经常会需要在txt文本或csv中提取字符串 例如 调用了一次readline 之后 我们得到了如下一行string id 1 name 345 size 728 632 value 3 1415926 我们想把这行字符串按照空格进行分割
  • 【TypeScript】断言

    目录 概念 用法 实例 总结 概念 TypeScript类型断言是一个编译时语法 用于告诉编译器用户比编译器更加确定变量的类型 进而解除编译错误 类型断言有点类似于其他语言的类型转换 但它没有运行时的影响 只是在编译阶段起作用 所以 即使通
  • 树莓派下opencv3.4.0的安装与错误处理

    1 opencv3 4 0的下载 1 可以在树莓派的终端界面通过wegt命令下载 但下载速度可能很慢 终端输入下列代码进行下载 cd home pi Downloads wget https github com Itseez opencv
  • 【ElementUI组件】视频上传+计算视频时长

    效果如下 实现步骤 1 首先先安装官网的操作步骤安装elementui 或者 不安装直接引入 安装指令 npm i element ui S 引入方式 2 以下是参考代码 HTML代码 div div
  • 内网端口转发及穿透-

    转 内网端口转发及穿透 最近尝试了一些内网端口的转发和内网穿透 现在一起总结一下 0x01 正向和反向代理 正向代理中 proxy和client同属一个LAN 对server透明 反向代理中 proxy和server同属一个LAN 对cli
  • 执行npm install 时报错 Host key verification failed

    问题 安装依赖的时候出现Host key verification failed问题 整理了一下解决流程 1 要在git设置一下身份的名字和邮箱 git config global user name yourname gt 用户名 git
  • Unity中自定义协程函数

    Unity中提供了协程的方法 在处理一些需要异步的函数时非常方便 尤其是在处理网络请求响应的时候 但是协程函数有些时候需要自定义 这就需要自己实现满足条件的协程函数了 好在Unity提供了这样的类来帮助我们实现相关的功能 通过继承Custo
  • Springboot2.0中webflux到底优秀在哪里

    Spring boot webflux中所说的反应堆式编程reactor到底优秀在哪里 小编的Springboot2 0的课程已经快全部写完了 总结来看 对于有基础的同学学习难度不是很大 一周内就能上手 但是在小编看来编程如果说只会用 而不