挖一個(gè)大坑,WebFlux 開(kāi)搞!
隨著 Spring5 的推出,WebFlux 被置于越來(lái)越重要的位置,無(wú)論是內(nèi)在的學(xué)習(xí)驅(qū)動(dòng),還是公司的項(xiàng)目要求,很多小伙伴們都開(kāi)始關(guān)注 WebFlux 了,也有很多小伙伴在微信上私我能不能整一套 WebFlux 教程?
整當(dāng)然是能整,不過(guò)最近忙是真的忙,松哥最近開(kāi)始帶團(tuán)隊(duì)了,有很多需要和其他部門(mén)對(duì)接的事情,晚上十一點(diǎn)還在出方案。。。寫(xiě)公號(hào)的時(shí)間被嚴(yán)重壓縮了,但是不管怎么樣,該寫(xiě)還是要寫(xiě),不僅僅是對(duì)小伙伴們的承諾,也是對(duì)自己的承諾。
想來(lái)想去,這次就整 WebFlux 吧,有小伙伴已經(jīng)催了快一年了,該搞了。
今天我們就先來(lái)介紹下響應(yīng)式系統(tǒng),畢竟不了解響應(yīng)式系統(tǒng),那學(xué)習(xí) WebFlux 干嘛?
1.什么是響應(yīng)式系統(tǒng)
響應(yīng)式系統(tǒng)的目標(biāo)是靈敏度高,系統(tǒng)穩(wěn)健一直有回復(fù),松耦合和可擴(kuò)展。響應(yīng)式系統(tǒng)是一種架構(gòu),可以應(yīng)用于任何地方,無(wú)論是一個(gè)小小的博客網(wǎng)頁(yè),還是復(fù)雜的網(wǎng)購(gòu)系統(tǒng),都可以使用響應(yīng)式架構(gòu)。
一般來(lái)說(shuō),響應(yīng)式系統(tǒng)有四個(gè)顯著的特點(diǎn):
- 即時(shí)響應(yīng)(responsive)
- 回彈性(resilience)
- 彈性(elastic)
- 消息驅(qū)動(dòng)(message driven)
下面這張圖很好的描述了這幾者之間的關(guān)系:
消息驅(qū)動(dòng)是手段,彈性和回彈性是形式,最終的即時(shí)響應(yīng)就是它的價(jià)值。
接下來(lái)我們來(lái)逐個(gè)介紹這四種特性。
2.四大特點(diǎn)
2.1 即時(shí)響應(yīng)(responsive)
即時(shí)響應(yīng)的特點(diǎn)就是一個(gè)字,快!
現(xiàn)在 4G 的普及,百兆千兆帶寬的使用,CPU 計(jì)算能力的提高,都在降低用戶對(duì)于一個(gè)系統(tǒng)的耐心,一個(gè)網(wǎng)頁(yè),5s 沒(méi)加載完,用戶已經(jīng)覺(jué)得體驗(yàn)很差了,30s 還沒(méi)加載出來(lái),那你可能失去這個(gè)用戶。
所以我們需要構(gòu)建一個(gè)健壯的、能夠快速響應(yīng)的即時(shí)響應(yīng)系統(tǒng),特別是在一些高并發(fā)的場(chǎng)景下,響應(yīng)延遲還能保持在合理范圍內(nèi),這才是最重要的。
要實(shí)現(xiàn)這一目標(biāo),要用到很多具體的技術(shù),例如異步加載、預(yù)加載等。另外還涉及到彈性(elastic)與回彈性(resilience)這樣一些原則性問(wèn)題。
2.2 彈性(elastic)
彈性其實(shí)就是指系統(tǒng)隨時(shí)可以動(dòng)態(tài)擴(kuò)展。
舉個(gè)例子,一個(gè)電商網(wǎng)站,平時(shí)活躍用戶有限,所需要的服務(wù)器數(shù)量足夠支撐日常服務(wù)即可,沒(méi)有必要多買(mǎi),畢竟都是要花錢(qián)的。一旦遇上大促,系統(tǒng)的流量在短時(shí)間內(nèi)爆發(fā)出來(lái),這個(gè)時(shí)候就需要能夠隨時(shí)隨地方便的為系統(tǒng)擴(kuò)容,這就是系統(tǒng)的彈性。
松哥在之前的文章中和大家聊過(guò) Nginx 負(fù)載均衡,這其實(shí)就是一種擴(kuò)容的手段。現(xiàn)在很多中小公司可能回采用云服務(wù),如果使用云服務(wù),一般都可以非常方便的實(shí)現(xiàn)動(dòng)態(tài)擴(kuò)容。
2.3 回彈性(resilience)
回彈性就是指當(dāng)系統(tǒng)遭遇到失敗時(shí),依然能夠?qū)ν馓峁┓?wù)。松哥在之前和大家分享 Spring Cloud 時(shí),Hystrix 的功能之一就是容錯(cuò),當(dāng)一個(gè)服務(wù)崩掉的時(shí)候,不會(huì)拖累到其他服務(wù)。通過(guò)服務(wù)的降級(jí)、隔離等手段,可以保證回彈性。回彈性還會(huì)要求在系統(tǒng)出錯(cuò)的時(shí)候,能夠自動(dòng)進(jìn)行重試。
其實(shí)大家看回彈性這個(gè)單詞 resilience,不知道有沒(méi)有想起來(lái)在 Spring Cloud 體系中,用來(lái)替代 Hystrix 的工具就叫做 resilience4j,所以如果你了解 Hystrix 的功能,大概就知道什么是回彈性。不了解 Spring Cloud 的話,可以看看這個(gè)網(wǎng)站:www.itboyhub.com。
2.4 消息驅(qū)動(dòng)(message driven)
消息驅(qū)動(dòng)是具體的實(shí)現(xiàn)手段。
在分布式系統(tǒng)中,我們要解耦、隔離服務(wù)、提高可伸縮性,為了達(dá)成這一目標(biāo),消息驅(qū)動(dòng)是最佳選擇。因?yàn)橹挥邢Ⅱ?qū)動(dòng)能夠同時(shí)滿足即時(shí)響應(yīng)、彈性以及回彈性這些要求。
有的小伙伴在學(xué)習(xí)微服務(wù)的時(shí)候,可能會(huì)看到一個(gè)名詞,就叫做消息驅(qū)動(dòng)的微服務(wù)。
在松哥的微人事中,有一個(gè)郵件發(fā)送的功能,就用到了消息驅(qū)動(dòng),發(fā)件人只需要把郵件內(nèi)容扔到消息中間件中即可,剩余的事情都不用管了,郵件服務(wù)器會(huì)自動(dòng)從消息中間件中讀取郵件信息然后將郵件發(fā)送出去,發(fā)送失敗的事務(wù)、回滾等等操作,都由郵件服務(wù)器自行處理,發(fā)送方只管把消息扔出去就行了,這就很好的實(shí)現(xiàn)了解耦。
這就是我們常說(shuō)的響應(yīng)式系統(tǒng)的四大特點(diǎn)。
3.身邊的響應(yīng)式系統(tǒng)
響應(yīng)式系統(tǒng)其實(shí)離我們并不遠(yuǎn),不是說(shuō)用了 WebFlux、用了 Gateway、用了異步 Servlet 就是響應(yīng)式系統(tǒng),這其實(shí)沒(méi)有必然聯(lián)系,上面那些都是實(shí)現(xiàn)響應(yīng)式系統(tǒng)的一個(gè)具體方案,具體技術(shù)而已。
舉一個(gè)很簡(jiǎn)單的消息驅(qū)動(dòng)微服務(wù)的案例,如下圖:
引入了消息中間件 RabbitMQ/Kafka 之后,能夠很好的實(shí)現(xiàn) A 服務(wù)和 B 服務(wù)的解耦,同時(shí)利用 RabbitMQ/Kafka 自帶的消息消費(fèi)失敗重試的功能也能很好的提高系統(tǒng)的容錯(cuò)性和可靠性。
松哥之前專門(mén)錄過(guò)提高消息中間件可靠性的視頻,感興趣的小伙伴可以看看:
提高可靠性:
處理冪等性:
4.小結(jié)
總之,響應(yīng)式系統(tǒng)是一個(gè)架構(gòu)層面的東西,它有四個(gè)基本特點(diǎn),它還有很多具體的實(shí)現(xiàn)手段,這些具體的實(shí)現(xiàn)手段松哥將在未來(lái)的文章中和大家逐一進(jìn)行介紹。
本文轉(zhuǎn)載自微信公眾號(hào)「江南一點(diǎn)雨」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系江南一點(diǎn)雨公眾號(hào)。