本系列文章索引《響應(yīng)式Spring的道法術(shù)器》
前情提要 響應(yīng)式編程 | 響應(yīng)式流創(chuàng)新互聯(lián)建站專注于循化企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開發(fā),商城網(wǎng)站建設(shè)。循化網(wǎng)站建設(shè)公司,為循化等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站制作,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務(wù)
關(guān)注“響應(yīng)式”的朋友不難搜索到關(guān)于“響應(yīng)式宣言”的介紹,先上圖:
這張圖凝聚了許多大神的智慧和經(jīng)驗(yàn),見官網(wǎng),中文版官網(wǎng),如果你認(rèn)可這個(gè)宣言的內(nèi)容,還可以簽下你的大名。雖然這些內(nèi)容多概念而少實(shí)戰(zhàn),讓人感覺是看教科書,但是字字千金,不時(shí)看一看都會(huì)有新的體會(huì)和收獲。
這也是新時(shí)代男朋友的行為準(zhǔn)則:
以響應(yīng)式系統(tǒng)方式構(gòu)建的系統(tǒng)更加靈活,松耦合和可擴(kuò)展。這使得它們更容易開發(fā),而且更加擁抱變化。及時(shí)地響應(yīng),以保證良好的用戶體驗(yàn)。系統(tǒng)錯(cuò)誤和異常在所難免,當(dāng)異常出現(xiàn)時(shí),要優(yōu)雅地處理之,不要任其蔓延、甚至到達(dá)用戶眼前。
關(guān)于宣言的具體內(nèi)容官網(wǎng)上很詳細(xì),就不多贅述了。
從落地方面,我們不難想到一些具體技術(shù)來支撐響應(yīng)式宣言的目標(biāo):
響應(yīng)式宣言是一組架構(gòu)與設(shè)計(jì)原則,符合這些原則的系統(tǒng)可以認(rèn)為是響應(yīng)式的系統(tǒng)。而響應(yīng)式系統(tǒng)與響應(yīng)式編程是不同層面的內(nèi)容。
看到網(wǎng)上有些文章在介紹RxJava、Reactor等響應(yīng)式編程技術(shù)的時(shí)候,會(huì)用響應(yīng)式宣言來引出話題,稍微有點(diǎn)驢唇對(duì)馬嘴的感覺(^_^)。響應(yīng)式系統(tǒng)(或響應(yīng)式宣言)與響應(yīng)式編程又是一對(duì)容易被揉在一起用的兩個(gè)術(shù)語(上一對(duì)容易被混用的術(shù)語是“響應(yīng)式編程RP”和“函數(shù)響應(yīng)式編程FRP”,見1.3.1 lambda與函數(shù)式),它們從關(guān)系上看雖然不如“雷鋒”和“雷峰塔”、Java和JavaScript那么遠(yuǎn),但并不存在必然的因果關(guān)系。
作為《響應(yīng)式宣言》的作者,Jonas Bonér和Viktor Klang解釋了響應(yīng)式編程與響應(yīng)式系統(tǒng)的區(qū)別與聯(lián)系(“Linux中國”上有翻譯版),其中也有對(duì)響應(yīng)式宣言四個(gè)原則的解讀,值得學(xué)習(xí)。我從中總結(jié)了一些二者的不同點(diǎn):
1)戰(zhàn)術(shù)與戰(zhàn)略的區(qū)別
響應(yīng)式編程是異步編程下的一個(gè)子集,是一種范式,有具體的開發(fā)庫,側(cè)重于由信息/數(shù)據(jù)流而不是命令式的控制流來推動(dòng)邏輯的前進(jìn)。
響應(yīng)式宣言是一組設(shè)計(jì)原則,一種關(guān)于分布式環(huán)境下系統(tǒng)架構(gòu)與設(shè)計(jì)的思考方式,響應(yīng)式系統(tǒng)是符合這一架構(gòu)風(fēng)格的系統(tǒng)。
2)事件驅(qū)動(dòng)與消息驅(qū)動(dòng)的區(qū)別
響應(yīng)式編程——專注于短時(shí)間的數(shù)據(jù)流鏈條上的計(jì)算——因此傾向于事件驅(qū)動(dòng);而響應(yīng)式系統(tǒng)——關(guān)注于通過分布式系統(tǒng)的通信和協(xié)作所得到的彈性和可靠性——?jiǎng)t是消息驅(qū)動(dòng)的。
響應(yīng)式宣言中從定義上闡述了消息驅(qū)動(dòng)與事件驅(qū)動(dòng)的不同:
一條消息就是一則被送往一個(gè)明確目的地的數(shù)據(jù)。一個(gè)事件則是達(dá)到某個(gè)給定狀態(tài)的組件發(fā)出的一個(gè)信號(hào)。在一個(gè)消息驅(qū)動(dòng)系統(tǒng)中,可尋址到的接收者等待消息的到來然后響應(yīng)它,否則保持休眠狀態(tài)。在一個(gè)事件驅(qū)動(dòng)系統(tǒng)中,通知的監(jiān)聽者被綁定到消息源上,這樣當(dāng)消息被發(fā)出時(shí)它就會(huì)被調(diào)用。這意味著一個(gè)事件驅(qū)動(dòng)系統(tǒng)專注于可尋址的事件源而消息驅(qū)動(dòng)系統(tǒng)專注于可尋址的接收者。
3)組件范圍與系統(tǒng)范圍的區(qū)別
響應(yīng)式編程的“活動(dòng)范圍”是在組件內(nèi)的,是一種管理組件或服務(wù)內(nèi)部邏輯和數(shù)據(jù)流的技術(shù),即使像1.4.2節(jié)中那樣數(shù)據(jù)流從服務(wù)B向服務(wù)A的流動(dòng),也并非跨服務(wù)的消息傳遞,只是基于API的調(diào)用而已。
響應(yīng)式系統(tǒng),強(qiáng)調(diào)組件/服務(wù)間的信息交流,并通過響應(yīng)式宣言提供了一種處理分布式系統(tǒng)彈性與可靠性的原則,因此是面向分布式的系統(tǒng)范圍的。
4)空間解耦能力的區(qū)別
正如前邊介紹到的異步調(diào)用方式那樣,事件驅(qū)動(dòng)的響應(yīng)式編程側(cè)重于時(shí)間上的解耦,從而在技術(shù)層面提供了一種更高性能的并發(fā)方式。然而其范圍限定了它不易于實(shí)現(xiàn)空間上的解耦。
消息驅(qū)動(dòng)的異步性使得響應(yīng)式系統(tǒng)既能夠在時(shí)間上解耦,還具有空間的解耦能力。服務(wù)間不僅可以通過消息隊(duì)列實(shí)現(xiàn)分布式協(xié)作,還可以根據(jù)負(fù)載實(shí)現(xiàn)單個(gè)服務(wù)的彈性伸縮,從而實(shí)現(xiàn)響應(yīng)式宣言中Elastic的能力。
5)總結(jié)
響應(yīng)式編程技術(shù)通常用于在單個(gè)節(jié)點(diǎn)或服務(wù)中對(duì)數(shù)據(jù)流進(jìn)行異步非阻塞的處理。當(dāng)有多個(gè)結(jié)點(diǎn)時(shí),就需要認(rèn)真考量數(shù)據(jù)一致性(data consistency)、跨結(jié)點(diǎn)溝通(cross-node communication)、協(xié)調(diào)(coordination)、版本控制(versioning)、編排(orchestration)、錯(cuò)誤管理(failure management)、關(guān)注與責(zé)任(concerns and responsibilities)分離等等的內(nèi)容——這些都是響應(yīng)式系統(tǒng)架構(gòu)要考慮的內(nèi)容。
類似的,Spring WebFlux是一種響應(yīng)式編程框架,用于開發(fā)響應(yīng)式應(yīng)用,而Spring Cloud不僅是更是一套適應(yīng)于當(dāng)今云原生環(huán)境下微服務(wù)架構(gòu)基礎(chǔ),更加接近響應(yīng)式宣言的目標(biāo)和響應(yīng)式系統(tǒng)的設(shè)計(jì)原則。
不過也應(yīng)該看到,也正是由于響應(yīng)式宣言中對(duì)現(xiàn)代系統(tǒng)的Responsive、Resilient、Elastic和Message Driven的要求,使得對(duì)響應(yīng)式編程技術(shù)的呼聲越來越高,顯然響應(yīng)式編程技術(shù)是構(gòu)建響應(yīng)式系統(tǒng)的合適工具之一。尤其是隨著面向響應(yīng)式宣言的響應(yīng)式流規(guī)范(Reactive Streams Specification)這一頂層設(shè)計(jì)的提出,類似Reactor、RxJava、Vert.x、Spring WebFlux等的響應(yīng)式編程技術(shù)在響應(yīng)式系統(tǒng)中必將發(fā)揮越來越大的作用。
關(guān)于響應(yīng)式系統(tǒng)的話題比較大,涉及到許多的理念、技術(shù)。本系列的文章仍主要聚焦于響應(yīng)式編程的范疇,并在最后討論響應(yīng)式編程在Spring Cloud中的應(yīng)用。