溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Reactive中有哪些 Streams規(guī)范

發(fā)布時間:2021-06-24 14:15:19 來源:億速云 閱讀:535 作者:Leah 欄目:互聯(lián)網(wǎng)科技

Reactive中有哪些 Streams規(guī)范,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

1)什么是Reactive Streams:

Reactive Streams is an initiative to provide a standard for asynchronous stream processing with non-blocking back pressure. This encompasses efforts aimed at runtime environments (JVM and JavaScript) as well as network protocols.

概括的說,Reactive Streams 是個規(guī)范,它規(guī)范了“有非阻塞背壓機(jī)制的異步的流處理”。挺簡單的定義,但是能夠真正正確理解異步、非阻塞并不容易,以后單獨開寫一篇。實際上Reactive Streams規(guī)范或者說它的第三方代碼實現(xiàn)包含的內(nèi)容更加豐富:除了non-blocking,還有:Composable、Deferred、Flow Controll、Resilient、Interruptible。

其中Composable就是函數(shù)式編程思想的用武之地。 可體會下Java8里的Stream API各種算子的參數(shù),所以Lamda表達(dá)式是進(jìn)行Reactive Streams實現(xiàn)的基本前提,否則很難想象臃腫的面向?qū)ο蟮腃omposable。有了JDK8的鋪墊,Reactive Streams接口被JDK9定義在Flow里才是可能的。

As of August 23rd, 2019 we have released version 1.0.3 of Reactive Streams for the JVM, including Java API, a textual Specification, a TCK and implementation examples.

這個規(guī)范由三部分組成:Java API(org.reactive-streams)、以文字描述的規(guī)范、技術(shù)兼容工具包。
Reactive Streams 規(guī)范 僅限于 Java(JavaScript、網(wǎng)絡(luò)協(xié)議)世界,其它語言雖然也有 Reactive 這樣的工具(參考這里:ReactiveX)實現(xiàn),但好像沒有類似的規(guī)范。

2)為什么要有 Reactive Streams

因為很多廠商開發(fā)了 reactive 庫,但是它們直接很難/不可能互操作。用 Reactive Streams 進(jìn)行規(guī)范就使得它們可以互操作,也就讓它們串起來形成一個 reactive 鏈成為了可能。

3)為什么要用 Reactive

因為 reactive 可以榨干 CPU...,所以從老板的角度講是省錢、從環(huán)保的角度講是省電、從碼農(nóng)的角度講是有意思。

4)Java 世界里知名的 Reactive 庫

RxJava

從 Reactive 宣言、到 Reactive Streams 規(guī)范,再到各種 Reactive 庫是很自然的一個脈絡(luò)。但現(xiàn)實是大家先有了 Reactive 系統(tǒng)的思想,聰明的程序開發(fā)出各種蘊(yùn)含著 reactive 思想的庫(比如 RxJava 1.0)。為了各個庫之間的統(tǒng)一性、可操作性,大家一起協(xié)商出了 Reactive Streams 規(guī)范。繼而這些已經(jīng)存在的 reactive 庫便改進(jìn)自己的 API 設(shè)計,向 reactive streams 規(guī)范靠攏并提供各種轉(zhuǎn)化 api 讓用戶在原生 api 和 reactive streams 接口直接轉(zhuǎn)換。比如 RxJava 2.0 的 Flowable 就直接繼承自 org.reactive-streams.Publisher 并提供了 toObservable() toFlowable()。因為各個庫的實現(xiàn)細(xì)節(jié)不同,用到具體轉(zhuǎn)換 api 需要參考其手冊。

RxJava雖然是java ractive編程的領(lǐng)路人,并且RxJava跟Project Reactor 3.0 基本是等價的。但是考慮到Spring生態(tài)的強(qiáng)大,估計其前途不會太光明了。

JDK

這個規(guī)范被的 API 形式定義從 JDK 9 這個版本開始,以 java.util.concurrent.Flow 靜態(tài)子類的形式被定義。其實,既然已經(jīng)有了 org.reactive-streams 這樣的規(guī)范,為什么還要在 JDK 中弄出個 Flow 來再重新定義一次。難道就是要宣示 JDK 自身有支持 reactive streams 的東西?

這個思路的本意應(yīng)該就像 JDBC 接口一樣,讓 Flow 里定義的接口成為 SPI,讓不同供應(yīng)商的 reactive sreams 可互操作吧。所以 JDK 里的 Flow 中定義的東西不能算是庫,而是個 SPI:Service Provider Interface。

Vert.x、MongoDB 響應(yīng)式流驅(qū)動

這些都做了改進(jìn)以符合 org.reactive-streams 中的 API 定義。其中Vert.x不僅提供了對 java 的 reactive 庫,還有 JavaScritp、Ruby、Scala 等。

Spring 的 Project Reactor

https://projectreactor.io/docs/core/release/reference/

既然 Spring 都提供了對 Reactive Streams 的實現(xiàn),感覺其實上面列出的幾個庫已經(jīng)沒有太多的意義。各家對Reactive Streams規(guī)范的實現(xiàn)在細(xì)節(jié)上都有很大不同,因為Spring 的生態(tài)太強(qiáng)大了,如果沒有特殊的需求,比如 JDK 小于 8,那么我們的項目基本于 Project Reactor,那么應(yīng)該是較好的選擇。這個網(wǎng)頁 https://tech.io/playgrounds/929/reactive-programming-with-reactor-3/Intro 可以幫助操練 Reactor Api。  

Project Reactor 到目前為止經(jīng)歷了 1.0, 2.0, 3.3。其中 1.0 這個階段還沒有 Reactive Stream 是規(guī)范。在 2.0 開始 follow 規(guī)范并基本定型。3.0 感覺是個重構(gòu)版,形成 reactive-streams-commons 庫。這里是 3.0 的 release 文檔: https://github.com/reactor/reactor-core/releases?after=v3.0.0.RELEASE 。

有了 Project Reactor 這樣的基礎(chǔ)庫,整個 Spring 組件基本都有了 Reactive Style 的版本,在這個基礎(chǔ)上用 Netty(或 Servet 3.1 Containe)+ Reactive Streams 適配層 + Spring Security Reactive + WebFlux + Spring Data Reactive Repository,就可以構(gòu)建出重頭到尾的 Reactive 應(yīng)用。

從 Spring Cloud 的組件角度講,也衍生出 Reactive Discovery Client, Reactive Load Balancer, Blockhound, Reactor Debug, Improved Reactor Micrometer Support, Reactor Netty Metric ...

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI