reactor响应式编程基础

全篇参考专栏:
https://blog.csdn.net/get_set/article/details/79514670

Stream 就是按时间排序的Events序列, 放射三种不同的Events Value、Error、"Completed"定义
异步的捕获这些Events,只需要定义Vlue的事件处理函数作为观察者,而Stream作为被观察者
参考:
https://projectreactor.io/docs/core/release/reference/index.html#intro-reactive

java异步的编程方式有两种
Callbacks 异步方式,没有返回值,给一个Callback 在数据返回时异步执行(另外一个线程执行),比如httpok3里的postAsync
Futures
弊端 Callbacks很难组合在一起,大量回调可读性差,容易形成调用地狱
响应式编程的目的就是解决JVM中经典异步编程的缺陷,新增的特征:
丰富的运算符操作数据流
不订阅数据则什么也不会发生(即非强制的)
组装线式的操作
消费者可以通知生产者生产速率过高
2.
reactor类似迭代器,迭代器是拉式的,强制性的,主动从数据源中拉取(next()操作)数据迭代消费,reactive是推式的,响应式的,当数据源中有事件时,会通知(推送给)处理函数
3. 响应式编程的operators
操作类似组装线中的工作站,会吧行为添加到一个publisher并包装上一个publisher称为一个新实例
4. subscribe操作将一个publisher绑定到subsericber,通过请求信号从上游的publisher一路到最初的源publisher
5. backpressure 背压就是订阅者给发布者发信号,告诉发布者自己能够处理n个elements 限流

  1. Flux表示响应式的序列(0…N个items)而Mono 代表单值或者空值(0…1)结果
    这种概念大体表示了异步操作的基数, HTTP只有一个response,因此使用 Mono t而不是 Flux
    改变处理基数的操作,也会改变相关类型,比如对Flux做count操作得到的结果就是Mono
    Mono提供的操作是Flux的子集
    8不订阅数据则什么也不会发生(即非强制的) 即不使用subscribe方法的话,所有定义的对元素修改的function都不会被执行
  2. 产生Flux的几种方式
    generate 所有操作都同步
    push 异步,适用于单个生产者
    10.Reactor与并发无关,并不强制并发,多数操作都是单线程,source的产生一般就运行在subscribe的调用线程中
    11.Reactor中, 执行模式是否是多线程取决于Scheduler,类似Excutores
(Schedulers.immediate() 当前线程中执行
Schedulers.single() 重复使用同样的一个线程,为所有的调用者
Schedulers.newSingle() 每次调用使用一个线程
Schedulers.boundedElastic() 有界的线程池,默认cpu core x10   idle线程默认60s销毁
Schedulers.newParallel(yourScheduleName) 
 used for fast publisher, slow consumer(s) scenarios.
**SubscribeOn 应用于订阅过程, 无论出现在哪里或者出现几次,只会切换一次
publishOn  应用一次,就会切换一次线程**

12.异常处理 Handler errors
一旦有异常,序列就会结束,剩下的操作不会再执行,类似于try catch 和finally
13.reactor的debug
reactor跟以往的不一样,因为每个操作都会捕获堆栈信息,使用Hooks
Hooks.onOperatorDebug();
14
阻塞式MVC中 一个url对应一个请求处理方法,webflux中HandlerFunction表示处理方法,输入是请求, 是封装在Mono中的响应,
RouterFunction相当于@RequestMaping用来判断什么样的url匹配什么HnadlerFunction,输入为请求,输出为HnadlerFunction

WebClient 天生异步
而Java Stream是一种同步API
web应用是异步非阻塞的
响应式编程中大量使用lambda主要是省代码
能简化成lambda表达式的接口都会被@FunctionalInterface所注解,同时,接口中有且仅有一个接口方法,只要满足条件,@FunctionalInterface也可以不用
15. delay和几个接口
Publisher 能够发出元素的发布者,接口方法subscribe要求产生数据
Subscriber是接受元素并响应的订阅者
onSubscribe ((Subscription s))每发出一个subscriber实例到publisher就会回调
onNext(T) publisher响应Subscription的reqeust在产生数据之后回调
onError onComplete
Subscription 是上述两者之间的桥梁
request(n) 要求publisher产生n个数据
cancel要求Publisher取消生产数据

操作符:
https://blog.csdn.net/qq_35791496/article/details/111648917

调用publisher的subscribe—>Subscriber.onSubscribe(Subscription)->向publisher请求n个数据–>Subscriber.onNext/onComplete
参考
https://blog.csdn.net/get_set/article/details/79514670
操作符官网 https://projectreactor.io/docs/core/release/api/

16.函数式编程---->stream–>java9的reactor—>webflux
Reactive Streams响应式流编程式一种非阻塞的异步的标准规范,实现有Rxjava和reactor等,异步用到的线程就少,前提是程序逻辑中的阻塞是可以被异步执行的,webflux性能高的原因就是多线程,然后流式,消灭阻塞,总之就是异步让多线程编程变得很简单,同时流式编程让回调的代码量变少


版权声明:本文为weixin_42410730原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。