實戰SpringCloud響應式微服務系列教程(第一章)
前言
在當今網際網路飛速發展的時代,業務需求不斷的更新和產品的迭代給系統開發過程和程式設計模式也帶來巨大挑戰,Spring Cloud微服務也隨之應用而生,從springboot1.x到springboot2.x,springcloud也提供了相應的整合,而特別引人注目的是spring5的誕生確實為java程式設計模式帶來重大革命。
Spring5框架整合的project Reactor響應式開發框架為構建響應式RESTful服務、響應式資料訪問元件、響應式訊息通訊元件、響應式微服務帶來更好的便利之處。
接下來的文章會從“響應式程式設計模型和Reactor框架”,“構建響應式RESTful服務”,“構建響應式資料訪問元件”、“響應式訊息通訊元件”、“響應式微服務”等方面全面瞭解掌握如何利用Reactor框架中的Mono和Flux兩個核心元件,如何利用Spring5中的Spring WebFlux支援使用註解式程式設計模型和函數語言程式設計模型構建響應式RESTful服務。
同時也會全面講解springboot中WebFlux,如何利用Spring Data提供的 spring Reactive Data 構建響應式資料訪問元件,如何使用Reactiv Spring Cloud Stream實現響應式訊息通訊元件。
通過使用 Spring Cloud框架實現響應式微服務,我們將會從服務發現、服務治理、負載均衡、服務容錯、服務閘道器、服務監控等方面全面瞭解響應式微服務的核心元件及其實現方案。
在我們全面瞭解和掌握構建響應式微服務後將會有實際的專案原始碼供大家學習交流。
作者的水平和經驗也有限,文章中難免會有紕漏之處和錯誤之處,懇請各位看官理解、批評和指正。
響應式程式設計模型和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.使用緩衝區
當生產者生產的資料速度比消費者處理資料的速度快時,消費者可以採用一個邊緣界緩衝區來儲存快速傳入的元素。
緩衝區的作用相當於在生產者和消費者之間添加了儲存並轉發的一中機制,把生產者發出的資料暫時儲存起來供消費者慢慢消費。
c.呼叫棧阻塞
呼叫棧阻塞是最直接的方法就是同步執行緒。相當於很多車行駛在同一條公路上,兒公路只有一條車道,那麼排在前面的車就擋住了後面車的道路,只能等待前面的車行駛通過後撤才可以行駛。
d.使用背壓
背壓是一個全新的概念,意思也很明確,就是消費者需要到少生產者就生產多少,既不會出現生產者生產資料的速度比消費者過快,也不會出現生產者生產資料速度比消費者消費資料速度過慢的現象。類似於我們在銀行櫃檯辦理業務一樣,只被叫好的人才可以去辦理業務。
小結
本章節關於響應式程式設計模型和Reactor框架就暫時講解到這裡,目前我們提出了很多概念都需要加強理解,下一節我們將會全面講解“背壓”和“響應式流”這也是做好響應式微服務的關鍵所在。
前面幾節的文字描述會比較多,但這也是我們詳細瞭解響應式程式設計模型的關鍵和基礎,希望大家堅持。
作者: 瑾年
首發:Java知音,歡迎關注
&n