https://blog.51cto.com/liukang/2090163
1. Spring WebFlux 2小時快速入門
Spring 5 之使用Spring WebFlux開發響應式應用。
- lambda與函數式(15min)
- Reactor 3 響應式程式設計庫(60min)
- Spring Webflux和Spring Data Reactive開發響應式應用(45min)
通過以上内容相信可以對Spring 5.0 推出的響應式開發有了初步的體會。如果希望有更加深入的了解,歡迎閱讀下邊的系列文章——
2. 響應式Spring的道法術器
這個系列的文章是為了記錄下自己 學習Spring響應式程式設計 的所得,也希望能夠幫助到更多的朋友。
原諒我标題黨了,希望能從道、法、術、器四個層面盡量全面地學習和介紹關于Spring響應式程式設計的方方面面。
【道】響應式程式設計的概念、原則、特性與方法
- 1.1 什麼是響應式程式設計:響應式程式設計= 資料流 + 變化傳遞 + 聲明式;
- 1.2 響應式流:響應式流的 異步非阻塞和 回壓(也有翻譯為“背壓”、“負壓”的)特性,分析與多線程并發方案以及基于回調和CompletableFuture的異步開發方式的不同;
- 1.3 Hello,reactive world,通過執行個體學習用lambda、Reactor 3、Spring Webflux和Spring Data Reactive開發響應式應用的方法和技巧;
- 1.4 異步非阻塞有多給力,使用gatling對基于Spring Webmvc和Spring Webflux的Web服務端應用進行負載測試,通過Spring WebClient與RestTemplate的性能對比并結合Netflix的案例了解異步Http用戶端的性能提升,然後使用YCSB對MongoDB的同步和異步驅動進行負載測試,通過測試資料分析異步非阻塞的性能優勢;
- 1.5 響應式系統,介紹響應式宣言,以及響應式程式設計和響應式系統的差別與聯系。
【法】系統介紹響應式程式設計庫的使用與原理
- 2.1 照虎畫貓深入了解響應式流規範,介紹響應式流規範及響應式開發核心接口,通過自己動手編寫響應式開發庫,了解内部實作機制,是了解本章後續内容的基礎,重要。
- 2.2 自定義資料流,在Reactor 3中如何通過
和generate
等方法生成自定義的資料流,是指令式程式設計與響應式程式設計的橋梁。然後通過實作一個docker事件推送的例子進一步熟悉它。create
- 2.3 Reactor的backpressure(背壓/回壓)政策,介紹Reactor3中的幾種回壓政策,及其在生成和消費資料流的時候如何起作用。
- 2.4 Reactor排程器與線程模型,從原理角度分析Reactor 3的排程器以及
和subscribeOn
的作用原理,最後介紹用于并行執行的publishOn
。ParallelFlux
- 2.5 Reactor 3 operators,Reactor 3提供了豐富的操作符,介紹如何選擇合适的操作符,以及如何進行操作符的打包。
- 2.6 測試,介紹使用
、StepVerifier
和PublisherProbe
三種工具進行自動化測試的方法。TestPublisher
- 2.7 調試,介紹基于hook的全局調試模式、基于
的局部調試模式的調試方法,以及之前用過的checkpoint()
操作符觀察内部執行情況。log()
- 2.8 Hot vs Cold,介紹使用Reactor 3 操作“熱序列”的方法。
- 2.9 Processor,介紹Reactor 3内置的幾種Processor的實作。
- 2.10 操作符熔合,介紹操作符熔合的優化思路。
【術】響應式關鍵技術與底層機制
預告:看網上關于Actor/Reactor/Preactor模型、異步I/O的内容很詳細也很棒,我就不贅述了,初步考慮直接通過模仿reactor-netty項目,從零編寫一套基于Netty的響應式伺服器和用戶端,相信無論是對于我自己還是對于關注本系列文章的朋友來說,都是一次不錯的提升Netty和響應式程式設計的嘗試,也是為下一章做鋪墊。這樣一套基于Netty的響應式伺服器和用戶端工具是Spring WebFlux與Netty之間的适配層,用于将Netty的入站和出站資料進行響應式轉換。
(最近事情有點多,會稍遲些發出來,還是有點難的,光讀源碼就讀了兩周,囧)
【器】執行個體了解Spring各種響應式元件
系統了解Spring中支援響應式的元件,如Spring WebFlux、Spring Data Reactive、Spring Security Reactive,以及使用Spring Boot 2和Spring Cloud建構響應式系統的方法。
(學習中)
系列文章目錄
相關源碼見:https://github.com/get-set/get-reactive。
Reactor3 Reference Guide參考文檔中文版(跟随版本更新):http://blog.csdn.net/get_set/article/details/79471861。
- (1)什麼是響應式程式設計
- (2)響應式流
- ——附1:多線程并發方案的不爽
- (3)lambda與函數式
- (4)Reactor快速上手
- (5)Spring WebFlux快速上手(五個例子,含響應式資料通路、服務端推送)
- (6)Spring WebFlux服務端性能測試
- (7)WebClient與RestTemplate性能對比
- (8)案例:Netflix對API網關的異步化改造
- (9)異步Mongo驅動的性能測試
- (10)響應式宣言、響應式系統、響應式程式設計
- (11)DIY了解響應式流實作原理
- (12)自定義資料流(實戰Docker事件推送的REST API)
- (13)Reactor的backpressure政策
- (14)Reactor排程器與線程模型
- (15)Reactor 3 Operators
- ——附2:Reactor 3 之選擇合适的操作符
- (16)Reactor的測試——響應式Spring的道法術器
- (17)Reactor的調試——響應式Spring的道法術器
- (18)Hot vs Cold——響應式Spring的道法術器
- (19)Reactor Processors——響應式Spring的道法術器
- (20)操作符熔合——響應式Spring的道法術器
(未完待續)
2017年9月,Spring Framework 5釋出了其GA版本,這是自2013年12月以來的又一個大版本更新。除了一些人們期待已久的改進,最令人興奮的新特性是它提供了
- 完整的端到端響應式程式設計的支援。
- 這是一種不同于Servlet的全新的程式設計範式和技術棧,
- 它基于異步非阻塞的特性,
- 能夠借助EventLoop以少量線程應對高并發的通路,
- 對微服務架構也頗有助益。不誇張的說,Spring 5使得Java世界擁有了Node.js那樣骨骼驚奇的神器。
2018年3月1号,Spring Boot 2.0如約釋出,也是一個大版本更新。
[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-treDhdxa-1612524393059)(https://leanote.com/api/file/getImage?fileId=5a9dea18ab644159cf00065a)]
從這個圖就可以看出對支援Spring 5的Spring Boot 2.0來說,新加入的響應式技術棧是其主打核心特性。具體來說,Spring Boot 2支援的響應式技術棧包括如下:
- Spring Framework 5提供的非阻塞web架構Spring Webflux;
- 遵循響應式流規範的兄弟項目Reactor;
- 支援異步I/O的Netty、Undertow等架構,以及基于Servlet 3.1+的容器(如Tomcat 8.0.23+和Jetty 9.0.4+);
- 支援響應式的資料通路Spring Data Reactive Repositories;
- 支援響應式的安全通路控制Spring Security Reactive;
- 等。
由于水準有限,如果文中有任何問題和不足,煩請您留言告知,不勝感激。
前言
- Reactor 3是一個圍繞Reactive Streams規範建構的庫,
- 它在JVM上引入了響應式程式設計的一個範例。
- 目前Spring5 引入的Webflux就是reactor 3實作的一個響應式web架構。
- Spring Cloud Gateway是Webflux的一個網關場景實踐。想學好上面這兩項技術必須搞明白響應式程式設計以及Reactor 3。
為什麼要搞響應式
有這麼一個場景,産品提了一個這麼需求:
- 商品打折,根據商品的原價來計算商品的折扣價。這個需求不是很簡單嘛,按照我們通常的做法,搞一個如下的方法就搞定了。
- 但是如果我折扣改了呢,這時有人該說重新計算啊。這樣是不是重新走了一次流程呢,我們需要花精力來維護這種流程邏輯。
- 那麼能不能我下遊能直接響應上遊的變化?
- 就像excel表格計算一樣,下遊始終監聽上遊,有點風吹草動,結果就會變化。這種潛在的需求就是響應式。
- 響應式程式設計正是用 某種操作符 幫助你建構這種關系,而不是執行某種指派指令。這種思想其實在前端的一些架構中已經風靡很久了。
響應式的特點
基于以上的一個簡單事例。
- 我們可以看出如果是響應式一定要有一個觸發點。
- 就像我們點選了計算機桌面的QQ圖示一隻企鵝跳啊跳。我們點選了迅雷圖示有一隻飛鳥在撲騰着翅膀。
- 計算機隻維護一個點選圖示的事件。也就是說響應式程式設計一定是一個事件觸發機制。
- 并且是以異步 和 非阻塞的方式 發送和接收的。不是我們平常請求-響應的同步模型。
事件驅動的系統通過push 而不是pull來處理,
- 生産者有消息時才推送消息給消費者,
- 而不是通過一種浪費資源方式:讓消費者不斷地輪詢或等待資料。
基于這個機制相對 高的吞吐量 和 實時響應也是響應式的特點。
- 事件驅動由于 Publisher 隻關心資料源,
- Consumer隻用關心對處理結果的消費。
完全是松耦合的。
這就給我們很大的操作空間來定制化我們的邏輯組合,進而使異步代碼更易讀和可維護。
Reactor 3 簡介
Reactor 3架構是Pivotal(Spring 母公司)
- 基于Reactive Programming思想實作的。
- 它實作了Reactive Streams(該規範由 Netflix、TypeSafe、Pivotal等公司發起的響應式規範)。
- 其他諸如RxJava 2, Akka Streams, Vert.x和Ratpack也都實作了該規範。
Reactor有一個很重要概念的就是backpressure。
由于生産者消費者處理資料的能力不對等,很容易産生下遊消費能力過載的問題。
這就需要一個backpressure處理,來告訴上遊生産者避免過載。
- 打個比方,一個人負責放水,一個人負責接水,如果放水的速度太快,水桶勢必會濺出來,
- 接水的人會根據情況來告訴放水的人什麼速度最合适,并且在快滿的時候告知放水人關閉開關。
Reactor還添加了 運算符的概念,
- 這些運算符被連結在一起以描述在每個階段對資料應用的處理。
- 應用運算符傳回一個中間Publisher(實際上,它可以被認為是 上遊運算符的 訂閱者和 下遊的釋出者)。
- 資料的最終歸納點在最終Subscriber中(這裡還定義了使用者角度的業務邏輯)。
- 還拿放水舉例,如果我們放水不是為了單純放水而是為了制造肥宅快樂水。
- 這樣就不是一個人接水了,中間加入了原漿流程,
- 下一個接的人接到的是原漿勾兌水,
- 那麼這個人充當了源頭的消費者,也充當了他下遊的生産者。
- 他的下遊還有加氣兒的。
- 他下遊的下遊還有罐裝等一系列操作。
- 到最後裝箱整個工藝才算告一段落。
- 另外如果下遊沒有開工,上遊也是不開工的。這樣也符合常理,不可能上遊空轉。

上圖揭示了一個最小單元的Reactor流程。其實這些概念更重要的是了解它們。了解了Reactor的特性才能為後面更好的學習java響應式程式設計打下基礎。後面我們會一起慢慢深入響應式這個話題。