Reactive实战(一)WebFlux

文章目录

  • reactive
  • Flux
    • Flux ---> Mono
    • peek
  • Mono
    • Mono ---> Mono
    • Mono Mono ---> Mono
    • Mono ---> Flux
    • Mono --->Mono
    • try-catch
    • ()--->Mono
  • 总结&其他资料

reactive

Reactive编程整个感觉都是充满了回调的使用,这个函数式编程的感觉和流的处理也很像。
首先我们要先看这个框架再解决什么问题,因为它带来了很多问题,就要看看这种转变什么划得来。其实它的底层是使用了Netty的NIO来解决IO阻塞的问题,也就提高了系统的吞吐能力,但是如果系统本身问题是计算资源不足那么就没什么效果。所以我觉得它比较适合查询操作,因为它的业务比较简单,不怎么消耗CPU,同时又有很大的吞吐需求。
至于为什么这个框架可以提高吞吐,可以参见Netty的相关资料,另外提升多少,网上也有人做过测试。
里面最重要的两个接口是MonoFlux,分别用于处理单个对象和一些对象(按照流的方式处理)。所有的Controller的方法的返回值都是这两个中的一个。在这两个干活的接口后面的BOSS是Publisher,也是很多接口的父接口,其中定义的void subscribe(Subscriber var1)就是万恶的回调写法之源。
我在最先使用时碰到的问题是如何获取第一个Mono,毕竟后面的各种操作都是来自这里,其实从这个角度来看,应该把方法入参也声明为Mono就对了。如果使用了just方法就错了,这样只是写了个假的。具体防范可以参见Reactive实战(二)Database

Flux

需要注意的是(包括Mono),Flux是遵循的函数式编程的思想,所以调用其方法是不会改变Flux(和String一样),所以你也应该想到了,需要使用原变量来接收调用结果。

Flux —> Mono

使用collectList可以将Flux转换为Mono

peek

使用doOnComplete可以在执行到制定的步骤时打印下日志,由于闯入的是一个Runnable对象,所以是无法获取数据流的,只能打印下debug信息

Mono

Mono —> Mono

使用delayUntil传入一个返回格式为Mono的函数从而等待流的结果作为入参再次调用一个reactive方法,也就是相对于一个普通的map方法而言能够褪去一层Mono。相当于乘法

Mono Mono —> Mono

zipWith相当于一个BiFunction,从而将两个Mono合并成一个Mono。相当于加法

Mono —> Flux

flatMapMany可以将Mono转换为Flux,一般参数使用Flux::fromIterable

Mono —>Mono

then可以在上一个function执行完毕后执行下一个function

try-catch

上面then是用于处理无异常的情况,如果需要处理异常则需要onErrorResume
下面是传统的写法

var parameter;
try{
	tryFunction(parameter);
}catch(Exception ex){
	catchFunction(parameter);
	throw ex;
}finally{
	finallyFunction(parameter);
}

在Reactive模式下写法如下

var parameter;
Mono<Void> mono=...
mono.then(tryFunction(parameter))
	.onErrorResume(ex->catchFunction(parameter).then(finallyFunction(parameter)).then(Mono.error(ex))
	.then(finallyFunction(parameter));

需要注意上面的finallyFunction需要写两遍。
另外也看到了另一种写法

.then(Mono.empty().onErrorResume(ex -> {

()—>Mono

Mono.defer()是用于通过provider来为subscriber提供一个对象,需要注意的是每次subsciber来订阅都会调用provider,所以会产生多个。一个最好的例子来自通过打印当前时间来获取调用时机

总结&其他资料

Spring官方的AbstractReactiveTransactionManager是一个很好的demo

你可能感兴趣的:(Java,reactive,nio,webflux,Mono,Publisher)