接上一篇:java
實戰SpringCloud響應式微服務系列教程(第一章)react
實戰SpringCloud響應式微服務系列教程(第二章)架構
實戰SpringCloud響應式微服務系列教程(第三章)app
若是想在代碼中集成 Reactor框架,則須要添加以下的 Maven依賴,分別引入 Reactor的核心功能以及用於支持測試的相關工具類。框架
<dependency> <groupid>io.projectreactor</groupid> <cartifactid>reactor-cores/artifactid> </dependency> <dependency> <groupid>io.projectreactor</groupid> <cartifactid>reactor-tests/artifactid> <scope>test</scope> </dependency>
Reactor框架在實現響應式流規範的基礎上有其特定的設計思想。本節先介紹 Reactor框架的異步數據序列,而後介紹Flux和Mono這兩個核心組件。異步
當使用 Reactor開發響應式應用程序時,不管採用何種操做符,都將獲得一個如圖所示的異步數據序列。函數
onNext x 0..N [onError |onComplete]微服務
以上公式包含三種不一樣類型方法的調用,分別處理不一樣場景下的消息通知。工具
onNext():正常的包含元素的消息通知。測試
onCompleted():序列結束的消息通知,能夠沒有。
onError():序列出錯的消息通知,能夠沒有。
按照響應式流規範,當這些消息通知產生時,異步序列的訂閱者中對應的這三個方法將被調用。若是序列沒有出錯,則 onerror()方法不會被調用;若是不調用 onComplete()方法,就會獲得一個無限異步序列。一般,無限異步序列應該只用於測試等特殊場景。
Flux表明0至N個元素的異步序列,以下圖,序列的三種消息通知都是用於Flux.
如下代碼示例展現了在具體項目中使用Fux組件的方法。若是咱們瞭解微服務架構中基於 Hystrix I的服務回退( Fallback)機制,就應該知道代碼中的 getordersfallbacko是一個典型的回退函數,咱們經過FIux.fromlterableo方法構建了 Flux<Order>
對象,做爲回退函數的返回值。
關於服務回退機制,將在以後章節中具體介紹
private Flux<order> getordersfallback(){ List<order> fallbacklist = new Arraylist<>(); Order order= new Order(); order.setid("orderinvalidid"); order.setaccountid("Invalidid"); order.setitem("Order list is not available"); order.setcreatetime (new Date(); fallbacklist.add (order); return Flux.fromiterable (fallbacklist); }
下面的示例更加容易理解一點,從位於方法名上的@ Getmapping註解能夠看出,這是個 Controller中的端點,用於返回一個 Order對象列表。這裏返回的 Order列表一樣經過Flux< Order>
對象進行呈現。
@getmapping("/vl/orders") public Flux<Order> getorderlist(){ Flux<order> orders= orderservice. getorders(); return orders; }
在 Reactor中,Mono表示包含0個或1個元素的異步序列,如圖所示,該序列中一樣能夠包含與Fux相同的三種類型的消息通知。
請注意,Mono也能夠用來表示一個空的異步序列,該序列沒有任何元素,僅僅包含序列結束的概念(相似於Java中的 Runnable)。咱們能夠用Mono<void>
表明一個空的異步序列。
與FIux組件同樣,經過服務回退來演示Mono組件的用法,示例代碼以下。
private Mono<order> getorderfallback(){ Order order = new Order(); order.setid("orderinvalidid"); order.setaccountid("Invalidid"); order.setitem("Order list is not available"); order.setcreatetime(new Date()); return Mono.just(order); }
這裏首構建一個 Order對象,而後經過 Mono.just()方法返回一個Mono對象。
Controller層組件也是同樣的,經過d獲取Mono<Order>
對象的端點示例以下。
@tapping("/vl/orders/{id}") public Mono<order> getorder(@Pathvariable String id){ Mono<order> order orderservice.getorderbyid(id); return order; }
相較Mono,Flux是更通用的一種響應式組件,因此針對FIux的操做要比Mono更豐富。另外一方面,FIux和Mono之間能夠相互轉換。例如,把兩個Mono序列合併起來就獲得一個Flux序列,而對一個FIux序列進行計數操做,獲得的就是Mono對象。