当前位置:首页 > 数码 > 新一代WebFlux框架外围技术-Reactor照应式编程基础入门 (新一代webshell检测工具-Kunwu)

新一代WebFlux框架外围技术-Reactor照应式编程基础入门 (新一代webshell检测工具-Kunwu)

admin7个月前 (05-04)数码46

环境:projectreactor2020.0.14

1.前言

在照应式编程中,ProjectReactor提供了两个外围的概念:Mono和Flux。Mono和Flux都是Reactor中的Publisher,它们可以发生并颁布数据,而后可以被订阅和消费。这两个概念在WebFlux中有着宽泛的运行,协助咱们成功异步和非阻塞的编程模型。

在这个主题中,咱们将深化讨论Mono和Flux的基本经常使用。咱们将了解它们如何被创立,如何订阅它们的事情,以及如何处置失误和成功通知。经过学习这些内容,你将能够更好地理解WebFlux的照应式编程模型,并能够在你的名目中有效地经常使用Mono和Flux。

让咱们开局吧!

2.环境依赖

<dependency><groupId>io.projectreactor</groupId><artifactId>reactor-core</artifactId></dependency><dependencyManagement><dependencies><dependency><groupId>io.projectreactor</groupId><artifactId>reactor-bom</artifactId><version>${reactor.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

3.Mono&Flux引见

Flux示意了0到N个元素序列,下图展现了Flux如何转换元素

Flux

一个Flux<T>是一个规范的Publisher<T>,它示意一个由0到N个发射名目组成的异步序列,可选地由一个成功信号或一个失误中断。在照应式流规范中,这三种类型的信号转换为对下游订阅者的onNext、onComplete和onError方法的调用。

由于或者信号的范围很大,Flux是通用的反响式类型。请留意,一切事情,甚至是中断事情,都是可选的:只要onComplete事情才干示意一个空的有限序列,但删除onComplete事情就会获取一个有限的空序列(没什么用途,除了关于敞开的测试)。相似地,有限序列不必定是空的。例如,Flux.interval(Duration)发生一个有限长的Flux<Long>,并从时钟收回规定的时标。

Mono示意了0个或1个元素序列,下图展现了Mono如何转换元素

Mono<T>是一个专门的颁布者<T>,它经过onNext信号收回最多一个名目,而后以onComplete信号中断(Mono成功,有或没有值),或只收回一个onError信号(Mono失败)。

大少数Mono成功都宿愿在调用onNext之后立刻对其订阅者调用onComplete。Mono.never()是一个意外值:它不会收回任何信号,这在技术上并没有被制止,但在测试之外并不是特意有用。另一方面,onNext和onError的组合是明白制止的。

Mono只提供了可用于`Flux`的操作符子集,有些操作符(特意是那些将Mono与另一个`Publisher`联合的操作符)会切换到`Flux`。例如,Mono#concatWith(Publisher)前往一个Flux,而Mono#then(Mono)前往另一个Mono。

留意,你可以经常使用Mono来示意只要成功概念的无值异步进程(相似于Runnable)。要创立一个,可以经常使用一个空的Mono<Void>。

4.Mono&Flux罕用操作

Mono罕用操作

Mono.just(Tvalue)方法:创立一个蕴含指定值的Mono对象。

Mono.just(10).subscribe(System.out::println);

Mono.empty()方法:创立一个空的Mono对象,即不蕴含任何元素。

Mono.justOrEmpty(Tvalue)方法:假设指定值不为null,则创立一个蕴含该值的Mono对象;否则创立一个空的Mono对象。

//输入10Mono.justOrEmpty(10).subscribe(System.out::println);//假设值为null,没有任何输入Mono.justOrEmpty(null).subscribe(System.out::println);

图片

Mono.fromCallable(Callable<?extendsT>supplier)方法:创立一个Mono对象,该对象蕴含经过调用给定Callable对象的call()方法获取的前往值。

//经过Callable形式,咱们可以在外部执行其它一些举措Mono.fromCallable(()->666).subscribe(System.out::println);

Mono.fromSupplier(Supplier<?extendsT>supplier)方法:创立一个Mono对象,该对象蕴含经过调用给定Supplier对象的get()方法获取的前往值。

新一代WebFlux框架外围技术Mono.fromSupplier(()->666).subscribe(System.out::println);

图片

Mono.fromFuture(CompletableFuture<?extendsInteger>future)方法:创立一个Mono对象,该对象蕴含经过调用给定CompletableFuture对象

Mono.fromFuture(CompletableFuture.supplyAsync(()->666)).subscribe(System.out::println);

上方这个示例完整的展现了当出现意外后的处置

publicstaticMono<Users>invoke(Mono<Users>user){returnuser.flatMap(u->{if("admin".equals(u.getName())){returnMono.error(newRuntimeException("越权"));}u.setName(u.getName()+"-");returnMono.just(u);});}publicstaticvoidmn(String[]args){invoke(Mono.just(newUsers("admin"))).doOnNext(System.out::println).doOnError(e->{System.out.println(e.getMessage());})//.onErrorResume(e->Mono.just(newUsers(e.getMessage()+"-fallback")))//性能更强,可以对捕捉的意外启动照应的处置,而后再前往一个值.onErrorReturn(newUsers("return"))//捕捉意外,便捷粗犷间接前往一个静态值.doOnNext(System.out::println).subscribe();}
越权Users[name=return]

将该Mono的发射与提供的颁布者衔接(不交织)。

Mono.just(10).concatWith(Mono.just(20)).subscribe(System.out::println);

图片

该操作符是在以后Mono执行成功后切换到另外一个Mono。

Mono.just(10).doOnNext(System.out::println).then(Mono.just(666))//切换到另外一个Mono通道,疏忽之前的Mono元素.doOnNext(System.out::println).subscribe();

Flux罕用操作

just():间接经常使用元素创立Flux,即在创立Flux时拿到数据,之后有谁订阅它,就从新发送数据给订阅者。

Flux.just(1,2,3...)

图片

fromArray()、fromIterable()和fromStream():可以从数组、Iterable对象或Stream对象中创立Flux对象。

Flux.fromArray(newString[]{"1","2","3"});Flux.fromIterable(List.of("a","b","c"));Flux.fromStream(List.of("a","b","c").stream());

fromIterable

fromStream

empty():创立一个不蕴含任何元素,只颁布完结信息的序列。

range(intstart,intcount):创立蕴含从start起始的count个数量的Integer对象的序列。

Flux.range(1,10);

图片

Flux.error(newRuntimeException("失误")).onErrorResume(ex->Mono.just("出现意外:"+ex.getMessage())).subscribe(System.out::println);

error操作符

onErrorResume操作符

Flux.just(1,3,6).flatMap(id->{Mono<Integer>query=Mono.fromSupplier(()->{System.out.println("查问数据...");returnid*10;}).delayElement(Duration.ofSeconds(2));Mono<String>save=Mono.fromSupplier(()->{System.out.println("保管数据...");return"success-"+id;});returnMono.when(query,save);}).doOnComplete(()->{System.out.println("执行成功...");}).subscribe();

图片

Flux.just(1,2,3,4,5,6).concatMap(item->Mono.just(item).filterWhen(r->{returnMono.just(r%2==0);})).subscribe(System.out::println);

总之,Reactor中的Flux和Mono是照应式编程的外围组件,它们提供了丰盛的操作符和方法来处置异步数据流。因此,关于经常使用WebFlux的开发者来说,把握Reactor的经常使用是十分关键的。

终了!!!


Java都需要那些技术?

Java工程师需要学习的技术还是比较多的。

尤其是现在技术更新迭代比较快,需要不断学习掌握新的技术,给自身镀金才能在IT行业发展的较好。

下面列举出来一些需要掌握的技术:

虽然需要学习掌握的技术比较多,但是坚信“只要功夫深铁杵磨成针”,加油!

SpringBoot WebFlux整合MongoDB实现CRUD及分页功能

环境:Springboot2.5.8

请先阅读:

Reactor响应式编程(Flux、Mono)基本用法

Spring WebFlux入门实例并整合数据库实现基本的增删改查

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。

在高负载的情况下,添加更多的节点,可以保证服务器性能。

MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

特点:

Spring框架中包含的原始web框架Spring Web MVC是专门为ServletAPI和Servlet容器构建的。反应式堆栈web框架Spring Web Flux后来在5.0版中添加。它是完全非阻塞的,支持反应流背压(由消费者控制生产者的速度),并在Netty、Undertow和Servlet 3.1+容器等服务器上运行。

这两个web框架都反映了它们的源模块(Spring Web MVC和Spring Web Flux)的名称,并在Spring框架中共存。每个模块都是可选的。应用程序可以使用一个或另一个模块,在某些情况下,可以同时使用这两个模块 — 例如,带有反应式WebClient的Spring MVC控制器。

配置文件

完毕!!!

Spring Cloud 中断路器 Circuit Breaker的应用

Spring Cloud Gateway应用详解1之谓词

SpringCloud Feign实现原理源分析

SpringCloud Nacos 服务动态配置

SpringCloud Hystrix实现资源隔离应用

SpringCloud zuul 动态网关配置

Spring Cloud全链路追踪SkyWalking及整合Elasticsearch

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: 框架

“新一代WebFlux框架外围技术-Reactor照应式编程基础入门 (新一代webshell检测工具-Kunwu)” 的相关文章

跨平台桌面应用开发的五大框架-Electron-的比较-Flutter-Tauri (跨平台桌面应用开发框架)

跨平台桌面应用开发的五大框架-Electron-的比较-Flutter-Tauri (跨平台桌面应用开发框架)

跨平台桌面应用开发框架是一种工具或框架,它允许开发者使用一种统一的代码库或语言来创建能够在多个操作系统上运行的桌面应用程序。传统上,开发者需要为每个操作系统编写不同的代码,使用不同的开发工具和语言...

一种简单而有效的人类行为Agent模型强化学习框架-链世界 (一种简单而有趣的事情)

一种简单而有效的人类行为Agent模型强化学习框架-链世界 (一种简单而有趣的事情)

引言 强化学习是一种机器学习方法,通过让智能体 (Agent) 与环境交互,从环境中学习如何选择最优行动以最大化累积奖励。强化学习已广泛应用于游戏、机器人、自动驾驶等领域。 强化学习也被用于塑...

局限性和最佳用例-一文读懂罕用的生成式-框架-长处-AI-深入了解模型 (局限性在于)

局限性和最佳用例-一文读懂罕用的生成式-框架-长处-AI-深入了解模型 (局限性在于)

Hellofolks,我是Luga,当天咱们来聊一下人工智能()生态畛域相关的技术-GenAI,即生成式AI技术。 随着AI技术的始终开展,GenAI的力气逾越了单纯的技术奇观,更是一种具有...

助力您解锁机器学习和人工智能的潜力-十大必备人工智能工具和框架 (解锁手机帮助)

助力您解锁机器学习和人工智能的潜力-十大必备人工智能工具和框架 (解锁手机帮助)

在当今竞争激烈的技术环境中,AI 工程师必须随时掌握最新的工具和框架,以优化工作流程、简化开发并提供高效的 AI 解决方案。本文将探讨 2023 年每个人工智能工程师都应该了解的最佳 AI 工具,...

.NET-中卓越的项目和框架-Core (net中文叫什么)

.NET-中卓越的项目和框架-Core (net中文叫什么)

.NET Core 是一個跨平台的開源框架,可用於建立 Web 應用程式、微服務、桌面應用程式和遊戲等。它具有高效能、可擴展性和安全性等優點,因此越來越多企業和開發人員選擇使用 .NET Core...

能否真的那么糟糕-Go-的备受争议的优毛病-Beego-框架 (能否真的那么爱自己)

能否真的那么糟糕-Go-的备受争议的优毛病-Beego-框架 (能否真的那么爱自己)

Beego提供了一个完整的MVC框架,用于构建Go言语编写的Web运行。经过上述步骤,你可以设置模型、控制器、视图和路由来构建一个便捷的Beego运行。Beego的智能化工具和丰盛的性能库使得开发高效...

分布式事务框架选择与实践 (分布式事务框架)

分布式事务框架选择与实践 (分布式事务框架)

分布式事务框架指南:选择适合您的用例 引言 在现代分布式系统中,分布式事务已成为确保跨多个服务原子操作一致性的关键概念。选择适合应用场景的分布式事务框架至关重要,因为它决定了事务的一致性、可用性和...

EJB骨灰都快找不到了!-为什么RPC框架数十年还在造轮子 (骨灰完整吗)

EJB骨灰都快找不到了!-为什么RPC框架数十年还在造轮子 (骨灰完整吗)

RPC(远程过程调用)是一种通信协议,用于不同计算机之间的远程通信。它允许应用程序通过网络调用远程计算机上的服务或函数,并获取返回结果。 RPC 的历史可以追溯到 1990 年代初期,自那时...