关于响应式编程的理解与SpringCloudGateway的理解
- 一. 响应式编程与函数式编程的区别
- 二. 响应式编程中常用的组件
- 2.1 RxJava定义
- 2.2 Rxjava基本概念
- 2.3 RxJava 用法
- 三 SpringcloudGateway
- 四 常见的四种限流规则
一. 响应式编程与函数式编程的区别
总的来说,响应式编程主要体现在①异步
、②观察者模式
以webflux和servlet为例子
一个是每个api请求代表着一个线程。
另一个是一个主线程内,可以使用多个子线程,达到异步的效果。
二. 响应式编程中常用的组件
2.1 RxJava定义
RxJava是一个可以在JVM上运行的,基于观察者模式 实现异步操作的java库。
2.2 Rxjava基本概念
// 创建观察者
Observer observer = new Observer<String>() {@Overridepublic void onSubscribe(@NonNull Disposable d) {Log.d(TAG, "onSubscribe");}@Overridepublic void onNext(String o) {}@Overridepublic void onError(@NonNull Throwable e) {Log.d(TAG, "onError data is :" + e.toString());}@Overridepublic void onComplete() {Log.d(TAG, "onComplete");}
};// 创建被观察者
Observable observable = Observable.create(new ObservableOnSubscribe() {@Overridepublic void subscribe(@NonNull ObservableEmitter e) throws Exception {e.onNext("hello");e.onNext("world");e.onComplete();}
});
// 订阅
observable.subscribe(observer);
2.3 RxJava 用法
- Rxjava 实现线程切换
Observable.create(new ObservableOnSubscribe<String>() {@Overridepublic void subscribe(ObservableEmitter<String> e) throws Exception {//1、“异步线程” 执行耗时操作//2、“执行完毕” 调用onNext触发回调,通知观察者e.onNext("1");e.onComplete();}
}).subscribeOn(Schedulers.io()) // io线程.observeOn(AndroidSchedulers.mainThread()) // 主线程.subscribe(new Observer<String>() {@Overridepublic void onSubscribe(Disposable d) {// 订阅线程 订阅的那一刻在订阅线程中执行}@Overridepublic void onNext(String value) {// “主线程”执行的方法}@Overridepublic void onError(Throwable e) {// "主线程"执行的方法}@Overridepublic void onComplete() {// "主线程"执行的方法}});
- Rxjava 使用操作符
Observable.create(new ObservableOnSubscribe<String>() {@Overridepublic void subscribe(ObservableEmitter<String> e) throws Exception {// IO 线程// 请求网络数据e.onNext("123456");}
}).map(new Function<String, Integer>() {@Overridepublic Integer apply(String s) {// IO 线程// 网络数据解析(数据转化)//// throw new RequestFailException("获取网络请求失败");return 123;}
}).doOnNext(new Consumer<Integer>() { //保存登录结果UserInfo@Overridepublic void accept(@NonNull Integer bean) throws Exception {// IO 线程// 保存网络数据}
}).subscribeOn(Schedulers.io()) //IO线程
.observeOn(AndroidSchedulers.mainThread()) //主线程
.subscribe(new Consumer<Integer>() {@Overridepublic void accept(@NonNull Integer bean) throws Exception {// 更新UI}
}, new Consumer<Throwable>() {@Overridepublic void accept(@NonNull Throwable throwable) throws Exception {// 错误 显示错误页面}
});
- Flowable
Flowable是为了应对
Backpressure(背压)
产生的。
Backpressure(背压) 即生产者的生产速度大于消费者的消费能力引起的问题。
异步线程中 生产者有无限的生产能力;
主线程中 消费者消费能力不足,从而造成事件无限堆积,最后导致OOM。
Flowable.create(new FlowableOnSubscribe<Integer>() {@Overridepublic void subscribe(FlowableEmitter<Integer> emitter) throws Exception {//1、“异步线程” 执行耗时操作//2、“执行完毕” 调用onNext触发回调,通知观察者emitter.onNext(0);emitter.onComplete();}// 若消费者消费能力不足,则抛出MissingBackpressureException异常
}, BackpressureStrategy.ERROR).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Subscriber<Integer>() {@Overridepublic void onSubscribe(Subscription s) {// 订阅时执行,发生在“订阅线程”// 这个方法是用来向生产者申请可以消费的事件数量// 这里表明消费者拥有Long.MAX_VALUE的消费能力s.request(Long.MAX_VALUE);}@Overridepublic void onNext(Integer integer) {// “主线程”执行的方法}@Overridepublic void onError(Throwable t) {// "主线程"执行的方法}@Overridepublic void onComplete() {// "主线程"执行的方法}});
各种背压策略在此不做多说明。
三 SpringcloudGateway
是使用webFlux编写的网关组件。
webflux与rxjava的异步编程是两种哲学编程概念。但是都是体现在了异步与观察者模式。
关于SpringcloudGateway,我理解我们需要做的东西
-
导入springcloudgateway依赖与nacos依赖。
-
书写配置类
2.1 GatewayConfiguration,这个配置类用于定义全局异常
与全局过滤器
。
2.2 RateLimiterConfiguration,这个配置类用于定义限流规则。 -
具体有关限流的配置,在
nacos配置中心
配置。
四 常见的四种限流规则
给大家推荐一篇文章