實戰SpringCloud響應式微服務系列教程(第三章)

接上一篇:java

實戰SpringCloud響應式微服務系列教程(第一章)react

實戰SpringCloud響應式微服務系列教程(第二章)
編程

1.1.3Reactor框架

響應式編程是一種編程模型,本節將介紹這種編程模型的具體實現工具 Project Reactor框架。 Reactor框架也是 Spring5中實現響應式編程採用的默認框架。bash

Project Reactor: https://projectreactor.io/網絡

1.1.4響應式編程實現技術概述

響應式編程就是利用異步數據流進行編程,本質上就是觀察者( Observer)模式的一種表現形式。本節首先討論實現異步操做的幾種常見方式,而後引出響應式編程的主流實現技術。架構

1.實現異步操做的常見方式併發

在Java中,爲了實現異步非阻塞,通常會採用回調( Callback)和 Future這兩種機制,但這兩種機制都存在必定侷限性。框架

(1)回調異步

回調的含義如圖所示,即類A的 method A()方法調用類B的 method B()方法,而後類B的 methodB()方法執行完畢後再主動調用類A的 callback()方法。回調體現的是一種雙向的調用方式。分佈式

實戰SpringCloud響應式微服務系列教程(第三章)

能夠看到,回調在任務執行過程當中不會形成任何阻塞,任務結果一且就緒,回調就會被執行。但咱們也應該看到在使用回調機制時,代碼會從一個類中的某個方法跳到另外一個類中的某個方法,從而形成流程的不連續性。對於單層的異步執行而言,回調很容易使用。

可是對於嵌套的多層異步組合而言,就顯得很是笨拙。因此回調很難大規模地組合起來使用,由於很快就會致使代碼難以理解和維護,即造成所謂的「回調地獄( Callback Hell)」問題。

(2) Future

能夠把 Future模式簡單理解爲這樣一種場景:有一個但願處理的任務,把這個任務提交到 Future, Future就會在必定時間內完成這個任務,而在這段時間內咱們能夠去作其餘事情。

做爲 Future模式的實現,Java中的 Future接口只包含以下5個方法

public interface Puture<v>{
   boolean cancel (boolean mayinterrupt Ifrunning):
   boolean iscancelled
   boolean isdone ():
   V get() throws Interruptedexception, Executionexception;
   V get (long timeout, Timeunit unit)?
      throws Interruptedexception, Executionexception, Timeoutexception
}複製代碼

Future接口中的 cancel方法用於取消任務的執行; iscancelledo方法用於判斷任務是否已經取消;兩個get()方法會等待任務執行結束並獲取結果,區別在因而否能夠設置超時時間,最後 isDone()方法判斷任務是否已經完成。

Future雖然能夠實現獲取異步執行結果的需求,可是它沒有提供通知機制,咱們沒法得知 Future何時完成。爲了獲取結果,咱們要麼使用阻塞的兩種get()方法等待 Future結果的返回,這時至關於執行同步操做;

要麼使用 isDone方法輪詢地判斷 Future是否完成,這樣會耗費CPU資源。因此, Future適合單層的簡單調用,對於嵌套的異步調用而言一樣很是笨重,不適合複雜的服務鏈路構建。

鑑於Future機制存在的缺陷,Java8中引入了 Completablefuture 機制。 Completablefuture在必定程度上彌補了普通 Future的缺點。在異步任務完成後,咱們使用任務結果時就不須要等待,能夠直接經過 thenaccept()、 thenApply()、 thencompose()等方法將前面異步處理的結果交給另一個異步事件處理線程來處理。

Completablefuture提供了很是強大的 Future擴展功能,能夠幫助咱們簡化異步編程的複雜性,而且提供了函數式編程的能力,能夠經過回調的方式處理計算結果,也支持轉換和組合 Completablefuture所提供的各類方法。

對平常開發工做而言,大多數時候咱們是在處理簡單的任務,這時使用 Completablefuture確實能夠知足需求。可是,當系統愈來愈複雜,或者咱們須要處理的任務自己就很是複雜時,Completablefuture對於多個處理過程的組合仍然不夠便捷。使用 Completablefuture編排多個Future是可行的,但並不容易。咱們會擔憂寫出來的代碼是否真的沒有問題,而隨着時間的推移,這些代碼會變得愈來愈複雜和難以維護。爲此,咱們須要引入響應式編程的相關技術和框架,這些技術和框架可以支持將來更輕鬆地維護異步處理代碼。

2.響應式編程的主流實現技術

目前,響應式編程的主流實現技術包括 Rxjava、 Akka Streams、Vert.x和 Project Reactor等。

(1)Rxjava

Reactive Extensions(Rx)是一個類庫,它集成了異步基於可觀察( Observable)序列的事件驅動編程,最先應用於微軟的NET平臺。而 Rxjava是 Reactive Extensions 的Java實現用於經過使用 Observable/ Flowable序列來構建異步和基於事件的程序庫,目前有1x版本和2.x版本兩套實現。

Rxjava1.x誕生於響應式流規範以前,雖然能夠和響應式流的接口進行轉換,可是因爲底層實現的緣由,使用起來並非很直觀。 Rxjava2在設計和實現時考慮到了與現有規範的整合,按照響應式流規範對接口進行了重寫,並把1.x版本中的背壓功能單獨分離出來。但爲了保持與 Rxjava1x的兼容性, Rxjava2在不少地方的使用也並不直觀。關於 Rxjava的更多內容,可參考官網(http://reactivex.io/),咱們這裏不作過多介紹。

(2)Akka Streams

Akka運行在JVM上,是構建高併發、分佈式和高彈性的消息驅動應用程序的一個工具件。 Actor是Akka中最核心的概念,它是一個封裝了狀態和行爲的對象,Actor之間能夠經過交換消息的方式進行通訊。經過 Actor可以簡化鎖及線程管理,能夠很是容易地開發出正確的併發程序和並行系統。

Akka也是響應式流規範的初始成員,而 Akka Streams是以Aka爲基礎的響應式流的實現,在Akka現有的角色模型之上提供了一種更高層級的抽象,支持背壓等響應式機制。

(3) Vertx

Vert. x是 Eclipse基金會下的一個開源的Java工具,是一個異步網絡應用開發框架,用來構建高併發、異步、可伸縮、多語言支持的Web應用程序。Vert.x就是爲了構建響應式系統而設計的,基於事件驅動架構, Vert x實現了非阻塞的任務處理機制。

verx中包含Vert.x Reactive Streams工具庫,該工具庫提供了Vver.x上響應式流規範的實現。咱們能夠經過 Vert x提供的可讀流和可寫流處理響應式流規範中的發佈者和訂閱者。

(4) Project Reactor

Spring S中引入了響應式編程機制,而 Spring5中默認集成了 Project Reactor做爲該機制的實現框架。 Reactor誕生較晚,能夠認爲是第二代響應式開發框架。

因此,它是一款徹底基於響應式流規範設計和實現的工具庫,沒有 Rxjava那樣的歷史包,在使用上更加直觀、易懂。但從設計理念和API的表現形式上, Reactor與 Rxjava比較相似,能夠說 Reactor基於響應式流規範,但在API方面又儘量向 Rxjava靠攏。

Flux和Mono是 Reactor中的兩個核心組件,Flux表明包含0到n個元素的異步序列,而Mono則表示0個或者一個元素的序列。Reactor框架使咱們討論的重點,下一節咱們將從Reactor框架的引入具體講解Flux和Mono。

相關文章
相關標籤/搜索