日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Sping5——响应式编程

發布時間:2023/12/4 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Sping5——响应式编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、響應式編程基礎

1.1、什么是響應式編程?

響應式編程是一種面向數據流和變化傳播的編程范式。
使用它可以在編程語言中很方便地表達靜態或動態的數據流,而相關的計算模型會自動將變化的值通過數據流進行傳播。我們可以使用聲明的方式構建應用程序的能力,形成更加敏感和有彈性的應用。

1.2、響應式編程的優勢

  • 提高了代碼的可讀性,因此開發人員只需要關注定義業務邏輯。

  • 在高并發環境中,可以自然的處理消息。

  • 可以控制生產者和消費者之間的流量,避免內存不足。

  • 對于一個或多個線程,IO綁定任務可以通過異步和非阻塞方式執行,而且不阻塞當前線程。

  • 可以有效的管理多個連接系統之間的通信。

1.3、應用場景

  • 大量的交易處理服務,如銀行部門。

  • 大型在線購物應用程序的通知服務,如亞馬遜。

  • 股票價格同時變動的股票交易業務。

2、Spring 5 響應式編程實踐

作為Java中的首個響應式Web框架,Spring 5.0最大的亮點莫過于提供了完整的端到端響應式編程的支持。

2.1 架構介紹


如上圖所示左側是傳統的基于Servlet的Spring Web MVC框架,右側是spring 5.0新引入的基于Reactive Streams的Spring WebFlux框架,從上往下依次是:Router Functions,WebFlux,Reactive Streams三個新組件,其中:

  • Router Functions: 對標@Controller,@RequestMapping等標準的Spring MVC注解,提供一套函數式風格的API,用于創建Router,Handler和Filter。

  • WebFlux: 核心組件,協調上下游各個組件提供響應式編程支持。

  • Reactive Streams: 一種支持背壓(Backpressure)的異步數據流處理標準,主流實現有RxJava和Reactor,Spring WebFlux默認集成的是Reactor。

2.2 簡單示例

Spring 5 大力支持了 Reactive Programming(響應式開發),server 和 client 都可以使用這種開發模式,Spring 5 是基于 Reactor項目實現的。

簡單來說,Reactive Programming 是一種非阻塞、事件驅動數據流的開發方案,使用函數式編程的概念來操作數據流,系統中某部分的數據變動后會自動更新其他部分,而且成本極低。

reactive streams 是非阻塞的,所以數據的處理過程中無需等待,對于系統的擴展性非常有幫助,因為工作線程不必等待其他資源,可以自由的處理更多的請求。

下面看一個例子,有助于更好的理解,例如我們要從數據庫加載用戶數據,然后把用戶名形成一個新的集合。

① 傳統方式

② 函數式處理集合數據流

③ 響應式

函數式比傳統方式更加簡潔,但如果數據庫比較忙,那么我們的線程就被阻塞了,而響應式就可以解決這個問題,非阻塞,主線程不會捆綁在這個操作上,如果調用者也是響應式的,那么就形成了一個非阻塞的傳播鏈條。

如果 web server 是響應式的,那么處理請求的線程就可以立即去處理其他請求,當數據庫返回數據后,自動就發送給了調用者。

2.3 背壓

使響應式開發超越傳統方式的關鍵因素是背壓機制,就是數據流的生產端能夠知道消費端的處理能力,并以此調整生產量。

這種感知能力非常重要,比如數據庫操作的成本較高,那么在消費端真正準備好處理這些數據之后再進行數據庫操作就很關鍵。

再比如消費端受限(如網絡帶寬不足),背壓機制就可以確保生產端不會過度生產,就是說,當客戶端不能很快的消費數據時,就會反向影響到響應式數據流,從而可以盡快通知數據庫停止發送數據,數據庫也就可以處理其他請求了,使系統的整體效率得到提升。

2.4 Reactor 項目的核心概念

Spring 5 是基于 Reactor 項目實現的響應式開發,Reactor 中有兩個核心類型 - Mono 和 Flux。

他們都是數據流,Mono 是一個最多有1個值的流,Flux 是一個可以有無限個值的流。

流的處理是延遲的,生產者只有在收到消費者的指示時才會真正生產數據,是通過調用 subscribe() 來實現的,例如:


subscribe() 中傳入的是一個消費者,會處理接收到的每條數據。

Java 9 中已經集成了reactive stream,思路和Reactor項目相同。

2.5 完整示例

控制器

可以看到,和我們之前的寫法沒有多少不同,還是使用熟悉的注解,只是返回類型不同了,使用了 Flux 和 Mono,用來返回響應式類型的數據,其他的工作都由框架來幫我們做。

我們再簡單對比下傳統方式和響應式的不同:

傳統方式下,數據是全部從數據庫讀取出來之后才從server發送到client,圖示:


響應模式下,只要有數據就緒了,就立即發送給client,像流一樣,圖示:


這樣client就可以更快的展示首條數據,server也不需要存放全部數據,數據的處理和傳輸都是即時的。

操作數據庫的代碼也需要是響應式的,Spring Data 已經提供了支持,只是目前還不全面,例如 MongoDB沒問題,但 JDBC 還不行,需要等待一段時間。

下面以 mongodb 為例,看看響應式的數據庫操作代碼什么樣:


和我們平時的代碼有兩點不同,一是使用的接口從普通的 CrudRepository 變為 ReactiveCrudRepository,二是返回類型使用了 Flux,編碼方式變動非常小。

3、總結

Reactive Programming 是非常好的開發方法,可維護性和可擴展性都非常好,相對于阻塞式開發,相同資源下性能會得到明顯提升。

總結

以上是生活随笔為你收集整理的Sping5——响应式编程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。