关于响应式编程的理解与SpringCloudGateway的理解

关于响应式编程的理解与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 用法

  1. 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() {// "主线程"执行的方法}});
  1. 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 {// 错误 显示错误页面}
});
  1. 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,我理解我们需要做的东西

  1. 导入springcloudgateway依赖与nacos依赖。

  2. 书写配置类
    2.1 GatewayConfiguration,这个配置类用于定义全局异常全局过滤器
    2.2 RateLimiterConfiguration,这个配置类用于定义限流规则。

  3. 具体有关限流的配置,在nacos配置中心配置。

四 常见的四种限流规则

给大家推荐一篇文章

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/38106.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GPIO和PIN

文章目录 1 GPIO和Pin1.1 GPIO和Pin基础概念1.2 GPIO输入模式1.3 GPIO输出模式1.4 GPIO的HAL库1.4.1 一些HAL库表示1.4.2 HAL库常用GPIO函数1.4.3 GPIO点亮led灯程序例子 1 GPIO和Pin 1.1 GPIO和Pin基础概念 ​ 单片机有很多的引脚&#xff0c;为了操控每一个引脚&#xff0c…

grpc学习golang版( 四、多服务示例 )

系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 第五章 多proto文件示例 第六章 服务器流式传输 第七章 客户端流式传输 第八章 双向流示例 文章目录 一、前言二、定义proto文件三、编写server服务端四、编写Client客…

MySQL之可扩展性(九)

可扩展性 直接连接 2.修改应用的配置 还有一个分发负载的办法是重新配置应用。例如&#xff0c;你可以配置多个机器来分担生成大报表操作的负载。每台机器可以配置成连接到不同的MySQL备库&#xff0c;并为第N个用户或网站生成报表。 这样的系统很容易实现&#xff0c;但如果…

Spring Boot集成jasypt快速入门Demo

1.什么是Jasypt&#xff1f; Jasypt&#xff08;Java Simplified Encryption&#xff09;是一个专注于简化Java加密操作的工具。 它提供了一种简单而强大的方式来处理数据的加密和解密&#xff0c;使开发者能够轻松地保护应用程序中的敏感信息&#xff0c;如数据库密码、API密…

stl的map和set

概念 map和set底层都是红黑树 set是key模型结构&#xff0c;本质就是看一个元素在不在容器中。 map是key/value结构&#xff0c;里面存了一个pair结构&#xff0c;可以通过一个值来查找另外一个值 map和set结构中遍历出来的都是有序并且去重了的&#xff0c;map和set都支持增…

Java高级重点知识点-17-异常

文章目录 异常异常处理自定义异常 异常 指的是程序在执行过程中&#xff0c;出现的非正常的情况&#xff0c;最终会导致JVM的非正常停止。Java处 理异常的方式是中断处理。 异常体系 异常的根类是 java.lang.Throwable&#xff0c;&#xff0c;其下有两个子类&#xff1a;ja…

【QT】概述|对象树模型|两种控件模式|信号和槽|lambda

目录 什么是QT 特点 QT程序 main函数 QT按钮 纯代码模式 图形化模式 对象树模型 信号和槽 连接与断开 自动连接 断开连接 信号的发射 lambda表达式 基本语法 捕获列表 Lambda表达式用于信号与槽的连接 例如 什么是QT Qt是一个跨平台的C图形用户界面应用…

办理河南公司企业信用等级3A证书流程和条件

企业信用等级3A证书属于一种荣誉资质&#xff0c;是提升企业公信力和影响力保障的一项资质。信用等级是信用 (资信)评估机构根据企业资信评估结果对企业信用度划分的等级类别&#xff0c;它反映了企业信用度的高低。AAA信用等级是一种等级划分。代指企业的信用经过行业、机构评…

零成本搭建个人图床服务器

前言 图床服务器是一种用于存储和管理图片的服务器&#xff0c;可以给我们提供将图片上传后能外部访问浏览的服务。这样我们在写文章时插入的说明图片&#xff0c;就可以集中放到图床里&#xff0c;既方便多平台文章发布&#xff0c;又能统一管理和备份。 当然下面通过在 Git…

中药材图像识别:中医与深度学习的融合(目标检测)

亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 一、引…

flink的窗口

目录 窗口分类 1.按照驱动类型分类 1. 时间窗口&#xff08;Time window&#xff09; 2.计数窗口&#xff08;Count window&#xff09; 2.按照窗口分配数据的规则分类 窗口API分类 API调用 窗口分配器器&#xff1a; 窗口函数 增量聚合函数&#xff1a; 全窗口函数…

MySQL高级-MVCC-原理分析(RC级别)

文章目录 1、RC隔离级别下&#xff0c;在事务中每一次执行快照读时生成ReadView2、先来看第一次快照读具体的读取过程&#xff1a;3、再来看第二次快照读具体的读取过程: 1、RC隔离级别下&#xff0c;在事务中每一次执行快照读时生成ReadView 我们就来分析事务5中&#xff0c;两…

VBA代码解决方案第十五讲:如何对单元格区域进行高亮显示

《VBA代码解决方案》(版权10028096)这套教程是我最早推出的教程&#xff0c;目前已经是第三版修订了。这套教程定位于入门后的提高&#xff0c;在学习这套教程过程中&#xff0c;侧重点是要理解及掌握我的“积木编程”思想。要灵活运用教程中的实例像搭积木一样把自己喜欢的代码…

【操作系统期末速成】EP06 | 学习笔记(基于五道口一只鸭)

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、正文&#xff1a;☀️☀️☀️2.1 考点十四&#xff1a;同步互斥的基本概念2.2 考点十五&#xff1a;实现临界区互斥的基本方法2.3 考点十六&#xff1a;信号量的含义及常用信号量 一、前言&#x1f680;&#x1…

操作系统概论(二)

一、单项选择题(本大题共20小题&#xff0c;每小题1分&#xff0c;共20分) 在每小题列出的四个备选项中只有一个选项是符合题目要求的&#xff0c;请将其代码填写在题后的括号内。错选、多选或未选均无分。 1&#xff0e;操作员接口是操作系统为用户提供的使用计算机系统的手…

Vitis IDE 艰难切换--从传统 Vitis GUI 到 2024.1 统一软件界面

目录 1. 简介 2. 界面展示 2.1 启动 2.2 Flow Navigator 2.1.1 C Simulation Dialog 2.1.2 C Synthesis 2.1.3 C/RTL Co-simulation 2.1.4 Implementation 2.1.5 Package 3. C Synthesis 详解 3.1 Classic Configuration Settings 3.1.1 config_array_partition 3…

MySQL进阶:存储过程和函数

存储过程和函数 1. 简介2. 创建存储过程使用MySQL工作台创建存储过程 3. 删除存储过程4. 参数带默认值的参数参数验证输出参数 5. 变量6. 函数7. 其他约定 1. 简介 存储过程三大作用&#xff1a; 储存和管理SQL代码&#xff08;置于数据库中&#xff0c;与应用层分离&#xf…

快递物流仓库管理系统java项目springboot和vue的前后端分离系统java课程设计java毕业设计

文章目录 快递物流仓库管理系统一、项目演示二、项目介绍三、部分功能截图四、部分代码展示五、底部获取项目源码&#xff08;9.9&#xffe5;带走&#xff09; 快递物流仓库管理系统 一、项目演示 快递物流仓库管理系统 二、项目介绍 语言: Java 数据库&#xff1a;MySQL 前…

宝塔安装rabbitMQ实战

服务器环境说明 阿里云服务器、宝塔、centos7 一、下载erlang 原因&#xff1a;RabbitMQ服务端代码是使用并发式语言Erlang编写的&#xff0c;安装Rabbit MQ的前提是安装Erlang。 下载地址&#xff1a;http://www.erlang.org/downloads 下载对应的版本&…

山东省著名烈士孙善师孙善帅故居布展喜添新篇

人海信息网山东讯&#xff08;张春兄、冯爱云&#xff09; “……他们以钢铁般的意志&#xff0c;坚守共产党员的使命&#xff0c;他们就是泺口九烈士的孙善师孙善帅兄弟&#xff01;”6月28日&#xff0c;对于山东省著名烈士孙善师孙善帅故居来说&#xff0c;又是一个不平凡的…