新一代WebFlux框架外围技术-Reactor照应式编程基础入门 (新一代webshell检测工具-Kunwu)
环境: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()方法获取的前往值。
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
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。