javascript
spring react_使用Spring WebFlux构建React性REST API –第1部分
spring react
在本文中,我們將看到如何使用Spring WebFlux構(gòu)建響應(yīng)式REST API。 在進入React式API之前,讓我們看看系統(tǒng)是如何發(fā)展的,傳統(tǒng)REST實現(xiàn)遇到的問題以及現(xiàn)代API的需求。
如果您查看從舊版系統(tǒng)到下文所述的現(xiàn)代系統(tǒng)的期望,
現(xiàn)代系統(tǒng)的期望是,應(yīng)用程序應(yīng)該是分布式的,Cloud Native,為實現(xiàn)高可用性和可伸縮性而擁抱。 因此,有效利用系統(tǒng)資源至關(guān)重要。 進入為什么要使用響應(yīng)式編程來構(gòu)建REST API? 讓我們看看傳統(tǒng)的REST API請求處理是如何工作的。
以下是傳統(tǒng)REST API遇到的問題,
- 阻止和同步→請求正在阻止和同步。 請求線程將等待任何阻塞的I / O,并且直到I / O等待結(jié)束后,線程才可以釋放以將響應(yīng)返回給調(diào)用方。
- 每個請求的線程 → Web容器使用每個請求模型的線程。 這限制了要處理的并發(fā)請求的數(shù)量。 除了某些請求之外,容器還會對請求進行排隊,這些請求最終會影響API的性能。
- 處理高并發(fā)用戶的限制 →由于Web容器按請求模型使用線程,因此我們無法處理高并發(fā)請求。
- 無法更好地利用系統(tǒng)資源 →線程將因I / O而阻塞并處于空閑狀態(tài)。 但是,Web容器不能接受更多請求。 在這種情況下,我們將無法有效地利用系統(tǒng)資源。
- 沒有反壓支持→我們無法從客戶端或服務(wù)器施加反壓。 如果請求突然激增,則可能導(dǎo)致服務(wù)器或客戶端中斷。 之后,用戶將無法訪問該應(yīng)用程序。 如果我們有背壓支持,則應(yīng)用程序應(yīng)在重負(fù)載期間持續(xù)運行,而不是無法使用。
讓我們看看如何使用React式編程解決上述問題。 以下是我們使用React式API所獲得的優(yōu)勢。
- 異步和非阻塞→React式編程為編寫異步和非阻塞應(yīng)用程序提供了靈活性。
- 驅(qū)動事件/消息 →系統(tǒng)將為任何活動生成事件或消息。 例如,來自數(shù)據(jù)庫的數(shù)據(jù)被視為事件流。
- 支持背壓 →我們可以通過施加背壓來優(yōu)雅地處理從一個系統(tǒng)到另一個系統(tǒng)的壓力,從而避免拒絕服務(wù)。
- 可預(yù)測的應(yīng)用程序響應(yīng)時間→由于線程是異步且非阻塞的,因此在負(fù)載下應(yīng)用程序響應(yīng)時間是可預(yù)測的。
- 更好地利用系統(tǒng)資源 →由于線程是異步且非阻塞的,因此不會為I / O 占用線程。 使用更少的線程,我們可以支持更多的用戶請求。
- 根據(jù)負(fù)載縮放
- 遠(yuǎn)離每個請求的線程 →借助React式API,我們正在遠(yuǎn)離每個請求的線程模型,因為線程是異步且非阻塞的。 發(fā)出請求后,它將與服務(wù)器一起創(chuàng)建事件,并且請求線程將被釋放以處理其他請求。
現(xiàn)在讓我們看看React式編程是如何工作的。 在下面的示例中,一旦應(yīng)用程序調(diào)用了從數(shù)據(jù)源獲取數(shù)據(jù)的操作,線程將立即返回,并且來自數(shù)據(jù)源的數(shù)據(jù)將作為數(shù)據(jù)/事件流出現(xiàn)。 在這里,應(yīng)用程序是訂閱者,數(shù)據(jù)源是發(fā)布者。 數(shù)據(jù)流完成后,將觸發(fā)onComplete事件。
下面是另一種情況,如果發(fā)生任何異常,發(fā)布者將觸發(fā)onError事件。
在某些情況下,可能沒有發(fā)布者要交付的任何物品。 例如,從數(shù)據(jù)庫中刪除一個項目。 在這種情況下,發(fā)布者將立即觸發(fā)onComplete / onError事件,而無需調(diào)用onNext事件,因為沒有數(shù)據(jù)可返回。
現(xiàn)在,讓我們看看什么是背壓? 以及我們?nèi)绾螌eact流施加背壓? 例如,我們有一個客戶端應(yīng)用程序正在從另一個服務(wù)請求數(shù)據(jù)。 該服務(wù)能夠以1000TPS的速率發(fā)布事件,但是客戶端應(yīng)用程序能夠以200TPS的速率處理事件。 在這種情況下,客戶端應(yīng)用程序應(yīng)緩沖其余數(shù)據(jù)以進行處理。 在隨后的調(diào)用中,客戶端應(yīng)用程序可能會緩沖更多數(shù)據(jù),并最終耗盡內(nèi)存。 這會對依賴于客戶端應(yīng)用程序的其他應(yīng)用程序產(chǎn)生級聯(lián)效應(yīng)。 為了避免這種情況,客戶端應(yīng)用程序可以要求服務(wù)在事件末尾緩沖事件,并以客戶端應(yīng)用程序的速率推送事件。 這稱為背壓。 下圖描述了相同的內(nèi)容。
在接下來的文章中,我們將看到React流規(guī)范及其實施的一個工程React堆一些示例應(yīng)用程序。 到那時, 快樂學(xué)習(xí)!!
翻譯自: https://www.javacodegeeks.com/2020/05/build-reactive-rest-apis-with-spring-webflux-part1.html
spring react
總結(jié)
以上是生活随笔為你收集整理的spring react_使用Spring WebFlux构建React性REST API –第1部分的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎样防止手机爆炸
- 下一篇: Spring_01_IoC初级总结