天天看點

響應式Spring的道法術器(Spring WebFlux 快速上手 + 全面介紹)1. Spring WebFlux 2小時快速入門2. 響應式Spring的道法術器前言Reactor 3 簡介

https://blog.51cto.com/liukang/2090163

1. Spring WebFlux 2小時快速入門

Spring 5 之使用Spring WebFlux開發響應式應用。

  1. lambda與函數式(15min)
  2. Reactor 3 響應式程式設計庫(60min)
  3. 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

    create

    等方法生成自定義的資料流,是指令式程式設計與響應式程式設計的橋梁。然後通過實作一個docker事件推送的例子進一步熟悉它。
  • 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中(這裡還定義了使用者角度的業務邏輯)。
  • 還拿放水舉例,如果我們放水不是為了單純放水而是為了制造肥宅快樂水。
    • 這樣就不是一個人接水了,中間加入了原漿流程,
    • 下一個接的人接到的是原漿勾兌水,
    • 那麼這個人充當了源頭的消費者,也充當了他下遊的生産者。
    • 他的下遊還有加氣兒的。
    • 他下遊的下遊還有罐裝等一系列操作。
    • 到最後裝箱整個工藝才算告一段落。
    • 另外如果下遊沒有開工,上遊也是不開工的。這樣也符合常理,不可能上遊空轉。
響應式Spring的道法術器(Spring WebFlux 快速上手 + 全面介紹)1. Spring WebFlux 2小時快速入門2. 響應式Spring的道法術器前言Reactor 3 簡介

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