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

前言

在當今互聯網飛速發展的時代,業務需求不斷的更新和產品的迭代給系統開發過程和編程模式也帶來巨大挑戰,Spring Cloud微服務也隨之應用而生,從springboot1.x到springboot2.x,springcloud也提供了相應的集成,而特別引人注目的是spring5的誕生確實爲java編程模式帶來重大革命。java

Spring5框架集成的project Reactor響應式開發框架爲構建響應式RESTful服務、響應式數據訪問組件、響應式消息通訊組件、響應式微服務帶來更好的便利之處。spring

接下來的文章會從「響應式編程模型和Reactor框架」,「構建響應式RESTful服務」,「構建響應式數據訪問組件」、「響應式消息通訊組件」、「響應式微服務」等方面全面瞭解掌握如何利用Reactor框架中的Mono和Flux兩個核心組件,如何利用Spring5中的Spring WebFlux支持使用註解式編程模型和函數式編程模型構建響應式RESTful服務。編程

同時也會全面講解springboot中WebFlux,如何利用Spring Data提供的 spring Reactive Data 構建響應式數據訪問組件,如何使用Reactiv Spring Cloud Stream實現響應式消息通訊組件。springboot

經過使用 Spring Cloud框架實現響應式微服務,咱們將會從服務發現、服務治理、負載均衡、服務容錯、服務網關、服務監控等方面全面瞭解響應式微服務的核心組件及其實現方案。app

在咱們全面瞭解和掌握構建響應式微服務後將會有實際的項目源碼供你們學習交流。負載均衡

做者的水平和經驗也有限,文章中不免會有紕漏之處和錯誤之處,懇請各位看官理解、批評和指正。

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

響應式編程模型和Reactor框架

響應式編程模型(簡稱RP Reactive Programming)是一種全新的編程模型,包含流、背壓等核心概念。框架

百度百科解釋:響應式編程是一種面向數據流和變化傳播的編程範式。這意味着能夠在編程語言中很方便地表達靜態或動態的數據流,而相關的計算模型會自動將變化的值經過數據流進行傳播。異步

Reactor 框架是 Pivotal 公司(開發 Spring 等技術的公司)開發的,實現了 Reactive Programming 思想,符合 Reactive Streams 規範(Reactive Streams 是由 Netflix、TypeSafe、Pivotal 等公司發起的)的一項技術。其名字有反應堆之意,反映了其背後的強大的性能。編程語言

1.1響應式編程模型

首先從傳統編程模型到響應式編程模型咱們須要一個轉變。咱們將從簡單的接口定義實力開始,引出響應式編程中的一系列核心概念。函數式編程

例如咱們定義一個屬於數據訪問層的接口訪問use對象數據列表:

public interface userMapper{
  List<User> getUsers();
}

從上面的接口咱們能夠看出User對象多是一個也多是成千上萬個,在真實數據返回以前,咱們沒法知道具體的對象個數,顯然在平常開發中咱們認爲這種方式定義是有問題的,若是返回的數據量過大,則可能會致使內存溢出等問題,因此咱們在平常開發中對返回的數據作了一下調整:

public interface userMapper{
  Page<User> getUsers(Page page);
}

能夠看到咱們傳入了辦函分頁的Page對象,返回一個分頁結果對象Page。

在這個分頁機制當中,咱們通常須要傳入每一頁的大小參數,也就是咱們所理解的pageSize,以及咱們想要獲取的頁碼參數(pageNum)。也就是說每次請求返回對象的個數是固定的。

那麼咱們在響應式編程中該如何處理這種數據返回呢?

在響應式編程模型中,這件事情就會變的簡單不少。咱們將會返回一個容器,讓客戶端本身去選擇須要的對象個數,客戶端想要多少該容器就會爲他返回多少。爲了達到效果代碼能夠這樣書寫:

public interface userMapper{
  Flux<User> getUsers();
}

在這裏咱們引入了一個全新的對象模型Flux,這是Reactor框架中特有的一個對象類型,它包含0到n個元素的異步序列。咱們將會在《1.2Reactor框架》中詳細講解Flux。

1.1.1流

1.什麼是流

簡單的說流就是由生產者生產給一個或者多個消費者消費的元素的序列。像這種生產者/消費之組成的模型被稱爲Source/Sink模型或者發佈者/訂閱者模型。

關於流的處理通常有兩種最基本的實現機制,一種是推模型另外一種是拉模型。推模型就是由生產者推送給消費者,拉模型是由消費者主動向生產者拉取元素。

除此以外關於流的處理還有一個同步和異步的區別,若是說消費者請求生產者的元素不可用時就必須進入等待直到元素可用,這種狀況咱們稱之爲同步請求。解決這種現象就是在兩端進行異步處理,生產之能夠在消費者請求元素以後處理其餘業務,當元素準備就緒時由生產者再異步發送給消費者。

2.流量的控制

咱們再來假設一個場景,假如生產者發出的數據速度和消費者處理數據的速度不一樣,消費者應該採起特定的cel來消費數據流中的數據。一般狀況下,若是消費者處理數據的速度快,通常不會有問題,反之,若是不進行流量的控制就會出現消費者會被生產者快速生產的數據所淹沒。通常狀況下流量的控制有4種狀況:

a.節流

節流很簡單,就是消費者直接丟棄沒法消費的元素。

b.使用緩衝區

當生產者生產的數據速度比消費者處理數據的速度快時,消費者能夠採用一個邊緣界緩衝區來保存快速傳入的元素。

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

緩衝區的做用至關於在生產者和消費者之間添加了保存並轉發的一中機制,把生產者發出的數據暫時存儲起來供消費者慢慢消費。

c.調用棧阻塞

調用棧阻塞是最直接的方法就是同步線程。至關於不少車行駛在同一條公路上,兒公路只有一條車道,那麼排在前面的車就擋住了後面車的道路,只能等待前面的車行駛經過後撤才能夠行駛。

d.使用背壓

背壓是一個全新的概念,意思也很明確,就是消費者須要到少生產者就生產多少,既不會出現生產者生產數據的速度比消費者過快,也不會出現生產者生產數據速度比消費者消費數據速度過慢的現象。相似於咱們在銀行櫃檯辦理業務同樣,只被叫好的人才能夠去辦理業務。

小結

本章節關於響應式編程模型和Reactor框架就暫時講解到這裏,目前咱們提出了不少概念都須要增強理解,下一節咱們將會全面講解「背壓」和「響應式流」這也是作好響應式微服務的關鍵所在。

前面幾節的文字描述會比較多,但這也是咱們詳細瞭解響應式編程模型的關鍵和基礎,但願你們堅持。

 

做者: 瑾年

首發:Java知音,歡迎關注

相關文章
相關標籤/搜索