關于響應式編程的理解與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.pswp.cn/diannao/38106.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/38106.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/38106.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

qt中的枚舉值-QMetaEnum

QMetaEnum 測試代碼hcpp 講解 測試代碼 h #include <QMainWindow> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent nullptr);~M…

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;但如果…

使用Python自動化收集和處理視頻資源的教程

在這篇教程中&#xff0c;我們將介紹如何利用Python腳本自動化收集和處理視頻資源。這篇文章將幫助您掌握基本的網絡自動化技術&#xff0c;并使用相關庫進行視頻資源的獲取和保存。以下是具體的實現步驟和代碼示例。 環境準備 在開始之前&#xff0c;請確保您的工作環境中已…

數據庫基礎教程

數據庫基礎教程 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;在本文中&#xff0c;我們將深入探討數據庫的基礎知識和操作&#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圖形用戶界面應用…

NeXT-Server 手動安裝

38 cd /home 使用 wget 下載你選擇的版本,https://go.dev/dl/ 找到適用于Linux的版本,你可以選擇 .tar.gz 格式的文件以用于Debian系統 39 wget https://go.dev/dl/go1.22.4.linux-amd64.tar.gz 40 tar -C /usr/local -xzf go1.22.4.linux-amd64.tar.gz 42 echo ‘export PAT…

辦理河南公司企業信用等級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;側重點是要理解及掌握我的“積木編程”思想。要靈活運用教程中的實例像搭積木一樣把自己喜歡的代碼…

Java中集中常見的算法

以下是對選擇排序、冒泡排序和插入排序的理解及代碼實現 選擇排序&#xff1a; 理解&#xff1a;它通過不斷地從待排序元素中選擇最小&#xff08;或最大&#xff09;元素&#xff0c;并將其放置在已排序序列的一端。 代碼實現&#xff1a; public class SelectionSort {pu…

final、const、readonly關鍵字在不同語言中代表著什么

一、Java 1.被final修飾的類不能被繼承。 2.被final修飾的方法不能被重寫。 被 final 修飾的類中所有的成員方法都會隱式的定義為 final 方法。 若父類中 final 方法的訪問權限為 private &#xff0c;則子類中不能直接繼承該方法。此時可以在子類中定義相同方法名的函數&…

【操作系統期末速成】EP06 | 學習筆記(基于五道口一只鴨)

文章目錄 一、前言&#x1f680;&#x1f680;&#x1f680;二、正文&#xff1a;??????2.1 考點十四&#xff1a;同步互斥的基本概念2.2 考點十五&#xff1a;實現臨界區互斥的基本方法2.3 考點十六&#xff1a;信號量的含義及常用信號量 一、前言&#x1f680;&#x1…