spring-webflux的一些概念的理解

Spring5的webflux可以支持高吞吐量,使用相同的資源可以處理更加多的請求,它將會成為未來技術的趨勢,但是相對于學習其他的框架相比,它的學習曲線很高,綜合了很多現有的技術,即使按照教程學習能編寫代碼,但是仍然會感覺不夠理解,要想真正的理解webflux,我覺得需要掌握以下幾點:

1.學習jdk8的lambda表達式和stream流編程思想,

2.理解響應式編程概念,理解背壓和實現機制。

理解了以上兩點,很容易理解webflux的基石reactor,再學習webflux就很簡單了!

學習lambda表達式

Lambda 表達式是一個匿名函數,源于數學λ演算。是閉包函數,但閉包并不一定是Lambda 函數。

它可以賦值給變量,作為函數參數,作為函數返回值。

Lambda的本質在編譯的時候在類中動態生成method方法,方法可以是static的也可以是非static的,主要取決于表達式內是否包含this這個變量,如果包含就生成動態的method方法,如果不包含就生成靜態的method方法。

Lambda表達式的優點,大大的降低了編寫代碼的量,并大大提高了代碼的可維護和可閱讀性。

Lambda的惰性求值,只有在實際調用過程中才觸發,像日志輸出:

// 打印日志前需要先判斷日志級別if(logger.isLoggable(Level.DEBUG)){logger.debug("====用戶:"+username);}

如果沒有if條件判斷,即使level不是debug,也會把執行“====用戶:”+username的操作,浪費了性能,如果加上if條件判斷代碼量又很大,不利于代碼的維護。如果用Lambda表達式是如何呢?

// 使用lambda表達式的惰性求值,不需要判斷日志級別logger.debug(()->"====用戶:"+username);

因為Lambda的特點,實際上字符串相加的操作并不會執行,同時代碼也少了,也容易維護了。

Stream流的概念

Stream 不是集合元素,它不是數據結構并不保存數據,它是有關算法和計算的,它更像一個高級版本的 Iterator。原始版本的 Iterator,用戶只能顯式地一個一個遍歷元素并對其執行某些操作;高級版本的 Stream,用戶只要給出需要對其包含的元素執行什么操作,比如 “過濾掉長度大于 10 的字符串”、“獲取每個字符串的首字母”等,Stream 會隱式地在內部進行遍歷,做出相應的數據轉換。

Stream 就如同一個迭代器(Iterator),單向,不可往復,數據只能遍歷一次,遍歷過一次后即用盡了,就好比流水從面前流過,一去不復返。

而和迭代器又不同的是,Stream 可以并行化操作,迭代器只能命令式地、串行化操作。顧名思義,當使用串行方式去遍歷時,每個 item 讀完后再讀下一個 item。而使用并行去遍歷時,數據會被分成多個段,其中每一個都在不同的線程中處理,然后將結果一起輸出。Stream 的并行操作依賴于 Java7 中引入的 Fork/Join 框架(JSR166y)來拆分任務和加速處理過程。

這個特點大大提高了硬件設備的利用率,提高了系統性能。

雖然大部分情況下stream是容器調用Collection.stream()方法得到的,但stream和collections有以下不同:

無存儲。stream不是一種數據結構,它只是某種數據源的一個視圖,數據源可以是一個數組,Java容器或I/O channel等。

為函數式編程而生。對stream的任何修改都不會修改背后的數據源,比如對stream執行過濾操作并不會刪除被過濾的元素,而是會產生一個不包含被過濾元素的新stream。

惰式執行。stream上的操作并不會立即執行,只有等到用戶真正需要結果的時候才會執行。

可消費性。stream只能被“消費”一次,一旦遍歷過就會失效,就像容器的迭代器那樣,想要再次遍歷必須重新生成。

對stream的操作分為為兩類,中間操作(intermediate operations)和結束操作(terminal operations),二者特點是:

中間操作總是會惰式執行,調用中間操作只會生成一個標記了該操作的新stream,僅此而已。

結束操作會觸發實際計算,計算發生時會把所有中間操作積攢的操作以pipeline的方式執行,這樣可以減少迭代次數。計算完成之后stream就會失效。

響應式編程的概念

響應式編程是一種關注于數據流data streams)和事件傳遞的異步編程方式。它是面向對象編程中的“觀察者模式”的在多線程異步編程一種實現。

在響應式流中,當有新的數據到來的時候,由發布者(Publisher) 通知訂閱者(Subscriber)。此外,對推送來的數據的操作 是通過一種聲明式(declaratively)而不是命令式(imperatively)的方式表達的:開發者通過 描述“控制流程”來定義對數據流的處理邏輯。

除了數據推送以外,響應式編程對錯誤處理(error handling)和完成(completion)的定義實現也很完善。 一個 可以推送新的數據到它的 (調用 方法), 同樣也可以推送錯誤(調用 方法)和完成(調用 方法)信號。 錯誤和完成信號都可以終止響應式流。

響應式編程的背壓機制

背壓是指在異步場景中,被觀察者發送事件速度遠快于觀察者的處理速度的情況下,一種告訴上游的被觀察者降低發送速度的策略。簡而言之,背壓是流速控制的一種策略。

理解了背壓的概念,在整體設計的時候就要考慮流水線上的每一個操作的時候就知道該怎么設計,盡量每個環節的執行時間大約一致,保證整體的處理速度比較均衡。

reactor的概念

Project Reactor(以下簡稱“Reactor”)與Spring是兄弟項目,側重于Server端的響應式編程,主要 artifact 是 reactor-core,這是一個基于 Java 8 的實現了響應式流規范 (Reactive Streams specification)的響應式庫。

Reactor中的發布者(Publisher)由和兩個類定義,它們都提供了豐富的操作符(operator)。一個Flux對象代表一個包含0..N個元素的響應式序列,而一個Mono對象代表一個包含零/一個(0..1)元素的結果。

既然是“數據流”的發布者,Flux和Mono都可以發出三種“數據信號”:元素值、錯誤信號、完成信號,錯誤信號和完成信號都是終止信號,完成信號用于告知下游訂閱者該數據流正常結束,錯誤信號終止數據流的同時將錯誤傳遞給下游訂閱者。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/167609.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/167609.shtml
英文地址,請注明出處:http://en.pswp.cn/news/167609.shtml

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

相關文章

requests庫的學習(詳細篇)

一、request庫的安裝 requests屬于第三方庫,Python不內置,因此需要我們手動安裝。 pip3 install requests

HTML5新特性

HTML5新特性 前言語義化標簽常用語義化標簽優點 新增input屬性新增type屬性值內容其他新增input屬性 video(視頻)與audio(音頻)標簽 前言 本文主要講解HTML5中新增了哪些內容。 語義化標簽 HTML5新增了語義化標簽這個特性&…

第一類曲線積分@對弧長的曲線積分

文章目錄 abstract對弧長的曲線積分曲線形構件的質量第一類曲線積分曲線積分存在性利用曲線積分的定義描述曲線形構件質量問題推廣曲線積分可加性閉曲線積分 曲線積分性質曲線積分的計算方法證明(部分推導) 小結曲線弧顯函數形式方程下的曲線積分公式推廣例例例 abstract 在積…

html table樣式的設計 表格邊框修飾

<!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <title>今日小說排行榜</title> <style> table {border-collapse: collapse;border: 4px double red; /*…

Python之Pygame游戲編程詳解

一、介紹 1.1 定義 Pygame是一種流行的Python游戲開發庫&#xff0c;它提供了許多功能&#xff0c;使開發人員可以輕松創建2D游戲。它具有良好的跨平臺支持&#xff0c;可以在多個操作系統上運行&#xff0c;例如Windows&#xff0c;MacOS和Linux。在本文中&#xff0c;我們將…

單鏈表的反轉?太細了哥們!細到離譜!

單鏈表的反轉&#xff08;面試常出&#xff09;&#xff1a; ? 單鏈表的反轉&#xff0c;可以通過很多種方法實現。包括迭代法&#xff0c;遞歸法&#xff0c; 迭代法&#xff1a; 定義三個指針&#xff1a;prev、current和next&#xff0c;它們分別表示前一個節點、當前節點…

NSGA-III求解微電網多目標優化調度(MATLAB)

一、NSGA-III簡介 NSGA-III算法由Kalyanmoy Deb和Himanshu Jain于 2014年提出。 參考文獻&#xff1a;Deb K , Jain H . An Evolutionary Many-Objective Optimization Algorithm Using Reference Point-Based Nondominated Sorting Approach, Part I: Solving Problems With …

[chroot+seccomp逃逸] THUCTF2019 之 固若金湯

題目分析 附件為一個源碼, 其中注釋我都寫好了, 主要就講關鍵的知識點. #define _GNU_SOURCE#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <string.h> #include <errno.h> #include <sched.h> #include <uni…

【C/PTA —— 10.函數1(課外實踐)】

C/PTA —— 10.函數1&#xff08;課外實踐&#xff09; 一.函數題6-1 符號函數6-2 求排列數6-3 求一個大于10的n位整數w的后n-1位的數&#xff0c;并作為函數值返回。6-4 其右上三角&#xff08;含主對角線&#xff09;元素之和。6-5 字符串比較6-6 使用函數求素數和6-7 使用函…

【電子通識】為什么說做產品不是簡單的將不同的技術進行搭積木?

很多人說做產品的硬件工程師&#xff0c;其實就是將專項技術工程師已經調好的模塊進行拼接。類似于小孩將積木搭成一個房子的形狀&#xff0c;雖然不同人搭的房子風格迥異&#xff0c;但所使用的原材料卻都是一樣的。 首先我并不同意這種看法&#xff0c;原因是產品工程師是需要…

JVM深入理解

JVM深入理解&#xff08;一&#xff09; JVM是什么 JRE、JDK和JVM 的關系 JVM原理 1、JVM是什么&#xff1f; JVM是Java Virtual Machine&#xff08;Java虛擬機&#xff09;的縮寫&#xff0c;由一套字節碼指令集、一組寄存器、一個棧、一個垃圾回收堆和一個存儲方法域等組…

MediaCodec詳解

MediaCodec 是Android平臺提供的一個API&#xff0c;用于對音頻和視頻數據進行編碼&#xff08;轉換為不同的格式&#xff09;和解碼&#xff08;從一種格式轉換回原始數據&#xff09;。它是Android 4.1&#xff08;API級別16&#xff09;及以上版本的一部分&#xff0c;允許開…

Sulfo-CY5 Azide在其他生物學研究中的應用

除了生物成像、生物分子標記、分子生物學研究和生物傳感與診斷等領域外&#xff0c;Sulfo-CY5 Azide還在其他生物學研究中有多種應用&#xff0c;**(來自星戈瑞的花菁染料)**如下&#xff1a; ****細胞追蹤和細胞遷移研究&#xff1a;****Sulfo-CY5 Azide可以被用作細胞標記劑&…

【教3妹學編程-算法題】統計和小于目標的下標對數目

2哥 : 3妹&#xff0c;OpenAI的宮斗劇迎來了大結局&#xff01;OpenAI宣布阿爾特曼復職CEO&#xff0c;董事會重組 3妹&#xff1a;啊&#xff1f;到底誰才是幕后操縱者啊&#xff0c;有咩有揪出來 2哥 : 也不是很清楚&#xff0c;據說在被開除的幾周前&#xff0c;前CEO曾譴責…

Linux 家目錄和根目錄

摘要&#xff1a; 在 Linux 操作系統中&#xff0c;家目錄和根目錄是兩個非常重要的概念。它們是 Linux 文件系統中的兩個關鍵節點&#xff0c;為用戶和系統進程提供存儲、管理和訪問文件和目錄的接口。本文旨在深入探討和理解這兩個目錄的結構、功能和使用方式&#xff0c;同時…

行情分析 - - 加密貨幣市場大盤走勢(11.24)

大餅昨日震蕩幅度很小&#xff0c;而今天延續昨日的空頭思路。當然如果從MACD日線來看&#xff0c;處于上漲趨勢&#xff0c;穩健的可以選擇觀望等待。空頭思路是因為目前EMA21均線和EMA55均線依然保持很遠&#xff0c;最近兩個月BTC上漲40%&#xff0c;而最近持續保持高位很快…

同時可視化原始中心點和經過坐標轉換后的中心點

std::vector<Eigen::Vector2d> centroids_unknown_motion_underk;std::vector<Eigen::Vector2d> measurements_centroids_unknown_motion_k= transformLandmarks(centroids_unknown_motion_k, weights_pose); // 數據填充 // k時刻經過轉換到k-1時刻坐標系下的中心…

Twincat使用:EtherCAT通信掃描硬件設備鏈接PLC變量

EtherCAT通信采用主從架構&#xff0c;其中一個主站設備負責整個EtherCAT網絡的管理和控制&#xff0c;而從站設備則負責在數據環網上傳遞數據。 主站設備可以是計算機、工控機、PLC等&#xff0c; 而從站設備可以是傳感器、執行器、驅動器等。 EL3102:MDP5001_300_CF8D1684;…

Arduino驅動PT100數字K型高溫傳感器(溫濕度傳感器)

目錄 1、傳感器特性 2、控制器和傳感器連線圖 3、硬件原理圖 4、驅動程序 PT100適用于大部分400℃以下高溫的測量,但是通常家用天然氣灶焰芯溫度可達800℃以上,燒制陶瓷的窖子或者大功率電爐溫度更可超過1000℃,在這些超高溫度的場景下就需要用到K型熱電偶。

C# 無法將“int[]“類型隱式轉換為“int?[]“,無法將“string[]“類型隱式轉換為“string?[]“

在 C# 中&#xff0c;不能將 int[] 隱式轉換為 int?[]&#xff0c;因為它們是兩種不同的類型。int[] 是一個整數數組&#xff0c;而 int?[] 是一個可空整數數組。要解決這個問題&#xff0c;你可以使用顯式轉換或創建一個新的可空整數數組。 兩種解決方案供大家選擇 // 示例…