-- 會員 / 註冊 --  
 帳號:
 密碼:
  | 註冊 | 忘記密碼
3/26 新書到! 3/19 新書到! 3/14 新書到! 12/12 新書到!
購書流程Q & A站務留言版客服信箱
3ds MaxMayaRhinoAfter EffectsSketchUpZBrushPainterUnity
PhotoShopAutoCadMasterCamSolidWorksCreoUGRevitNuke
C#CC++Java遊戲程式Linux嵌入式PLCFPGAMatlab
駭客資料庫搜索引擎影像處理FluentVR+ARANSYS深度學習
單晶片AVROpenGLArduinoRaspberry Pi電路設計CadenceProtel
HadoopPythonStm32CortexLabview手機程式AndroidiPhone
可查書名,作者,ISBN,3dwoo書號
詳細書籍分類

Java編程方法論:響應式RxJava與代碼設計實戰

( 簡體 字)
作者:知秋類別:1. -> 程式設計 -> JAVA -> Java
譯者:
出版社:電子工業出版社Java編程方法論:響應式RxJava與代碼設計實戰 3dWoo書號: 51213
詢問書籍請說出此書號!

缺書
NT售價: 395

出版日:5/1/2019
頁數:296
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 版 )
加入購物車 加到我的最愛
(請先登入會員)
ISBN:9787121364174
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證)
作者序:

譯者序:

前言:

本書是“Java編程方法論系列叢書”的第一本書,“Java編程方法論系列叢書”將我多年的代碼經驗通過講述優秀的RxJava 2、Reactor 3、Reactor-Netty與Spring WebFlux等框架庫的源碼細節展現出來,目的是讓大家可以學習一種讀源碼的方式。也就是說,看源碼不僅要看懂它干了什么,而且更應該看相關源碼的設計思路以及技巧。這就好比研讀一篇好文章一樣,要揣摩作者的行文方式。
與理解代碼相比,我更愿意帶給大家的是一種生活態度。Java的第一個身份是語言,語言是用于描述我們的思想和生活的,所以帶著生活中的理念來讀源碼,你就會發現情況大為不同:各種編程技巧和實現思路通通擺在了你的眼前。本系列叢書就是從這個角度出發的,所以針對的讀者是那些想要提高自己對于基礎代碼掌控能力的中高級程序員。
下面具體介紹一下本書內容。本書主要講解了到底什么是響應式,從代碼設計層面將JDK 9+中的Flow API、RxJava 2中關于源的創建,以及調度與背壓等相關核心操作娓娓道來,并通過實戰案例幫助大家更好地理解和使用相關的API。本書涉及了大量并發編程方面的技巧,以及從基礎代碼角度介紹了各種接口、設計模式和與之相關的基礎知識點,并將它們融會貫通。這就好比我們上學的時候,老師向我們傳授基礎知識,然后通過習題讓我們掌握這些基礎知識的運用技巧。本書也遵循了這個思路,同時這也符合我寫書的初衷。
限于篇幅,有些內容沒能完全在書中呈現,為了降低圖書的閱讀理解難度,我專門錄制了相關的分享視頻,可以更直觀地帶領大家走進源碼世界。視頻可以說是圖書的有益補充,歡迎大家觀看、學習。另外,希望讀者通過學習本書了解響應式編程如何帶來程序性能的提升以及其正確的使用方式。在錄制本系列叢書的另一本書《Java編程方法論:響應式Reactor 3、Reactor-Netty和Spring WebFlux》(后續出版)的相關視頻時,使我感到很榮幸的是,視頻得到了Spring官方的肯定,并在Spring官方推特和博客上進行了宣傳、推廣,這增加了我對本系列叢書的信心。
最后,感謝尹相宇同學,沒有你聽我??唆唆地講代碼,我估計自己的這份激情難以維持,當然,這本書的順利出版也離不開你的審閱。另外,需要感謝的還有付睿編輯,她幫助我修正了很多表達細節上的錯誤。最后,感謝我的家人對我的理解和默默付出。

知秋(李飛)
2019年2月15日


推薦序一

在Architecture and Design InfoQ Trends Report - January 2019 (2019年1月的InfoQ架構和設計趨勢報告)中,響應式編程(Reactive Programming)和函數式編程(Functional Programming)編列在第一季度(Q1)的Early Adopter(早期采納者)中。盡管這僅是一家之言,但是不少開發人員逐漸意識到響應式之風已然吹起。也許你的生產系統尚未出現響應式的身影,不過你可能聽說過Spring WebFlux或Netflix Hystrix等開源框架。筆者曾請教過Pivotal(Spring母公司)的布道師Josh Long :“Spring技術棧未來的重心是否要布局在響應式上?”對方的答復是:“沒錯,響應式是未來的趨勢。”同時,越來越多的開源項目開始簽署響應式宣言(The Reactive Manifesto) 并喊出了“Web Are Reactive”的口號。
或許開源界的種種舉動無法說服你向響應式的“港灣”中停靠,不過Java 9中Flow API 的引入,又給業界注入了一劑“強心針”。不難看出,無論是Java API,還是Java框架,均走向了響應式編程模型的道路,這并非一種巧合。
通常,人們談到的響應式可與響應式編程畫等號,以“非阻塞(Non-Blocking)”和“異步(Asynchronous)”的特性并述,以數據結構與操作相輔相成。響應式編程涉及函數式和并發兩種編程模型,前者關注語法特性,后者強調執行效率。簡言之,響應式編程的意圖在于“Less Code,More Efficient”。除此之外,筆者認為響應式更大的價值在于統一Java并發編程模型,使得同步和異步的實現代碼無異,同時做到Java編程風格與其他編程語言更好地融合,或許你已經發現Java與JavaScript在響應式方面并不存在本質區別。縱觀Java在響應式編程上的發展,其特性更新真可謂步步為營、如履薄冰。盡管Java線程API Thread與Runnable已具備異步以及非阻塞的能力,然而其同步和異步編程的模式并不統一,并且理解Thread API的細節和管理線程生命周期的成本均由開發人員承受。雖然在Java 5引入J.U.C框架(Java并發框架)之后,ExecutorService的實現減輕了以上負擔,但是開發人員仍須關注ExecutorService的實現細節。比如,怎樣合理地設置線程池空間及阻塞隊列又成為新挑戰。為此,Java 7引入了ForkJoinPool API,不過此時的J.U.C框架與響應式理念仍存在距離,即使是線程安全的數據結構也并不具備并行計算的能力(如集合并行排序),同時操作集合的手段也相當貧乏,缺少類似Map/Reduce等的操作。不過這些困難只是暫時的,終究會被Java 8“救贖”。Stream API的出現不僅具備數據操作在串行和并行間自由切換的能力(如sequential()及parallel()方法),而且淡化了并發的特性(如sorted()方法既可以進行傳統排序,也可以進行并行排序)。相同的設計哲學也體現在Java響應式實現框架中,如本書中提及的RxJava API io.reactivex.Observable。統一編程模型只是流的設計目標之一,它結合Lambda語法特性,雖然提供了數量可觀的操作方法,如flatMap()方法等,但是無論對比RxJava,還是Reactor ,流操作方法卻又相形見絀。值得一提的是,這些操作方法在響應式的術語中被稱為操作符(Operator)。當然框架內建操作符的多與少,并非判斷其是否為響應式實現的依據。其中的決定性因素在于數據必須來自發布端(生產者)的“推送(Push)”,而非消費端的“拉取(Pull)”。顯然,流屬于消費端已就緒(Ready)的數據集合,并不存在其他數據推送源。不過JVM語言早期的響應式定義處于模糊地帶,如RxJava API屬于觀察者模式(Observer Pattern) 的擴展,而非迭代器模式(Iterator Pattern) 的實現。而Reactor的實現則擁抱響應式流規范 ,該規范中消費端對于數據的操作是被動地處理,而非主動地索取。換言之,數據的到達存在著不確定性 。當推送的數據無法得到消費端的及時響應時,響應式框架必須提供背壓(Back Pressure) 實現,確保消費端擁有“拒絕的權力(cancel)”。在此理論基礎上,響應式流規范定義了一套抽象的API,作為Java 9中java.util.concurrent.Flow API的頂層設計。不過關于操作符的部分,該規范似乎不太關心,這也是RxJava和Reactor均稱自身為響應式擴展框架的原因,同時兩者在API級別提供了多種調度器(Scheduler) 實現,可適配不同并發場景。盡管響應式定義在不同的陣營之間存在差異,但援引本人在《Reactive Programming:一種技術,各自表述》 一文中的總結:
Reactive Programming作為觀察者(Observer)模式的延伸,不同于傳統的命令編程(Imperative Programming)同步拉取數據的方式,如迭代器模式(Iterator),而是采用數據發布者同步或異步地推送到數據流(Data Stream)的方案。當該數據流(Data Stream)的訂閱者監聽到變化傳播時,立即做出響應動作。在實現層面上,響應式編程可結合函數式編程簡化面向對象語言語法的臃腫性,屏蔽并發實現的復雜細節,提供數據流的有序操作,從而達到提升代碼的可讀性以及減少Bug出現的目的。同時,響應式編程結合背壓(Back Pressure)的技術解決了發布端生成數據的速度高于訂閱端消費數據的速度的問題。
不難看出,響應式是一門綜合的編程藝術,在實現框架的“加持”下,相同的代碼邏輯可實現同步與異步非阻塞功能,從而達到提升應用整體性能的目的。不過現實的情況或許沒有那么理想,Spring官方文檔在“Web on Reactive Stack”章節中提到,“響應式和非阻塞通常并不會讓應用運行得更快” :
Reactive and non-blocking generally do not make applications run faster.
為此,JHipster 給出了一份Spring 5 WebFlux性能測試報告 ,其中一條結論是“響應式應用并沒有表現出速度的提升(甚至其速度變得更慢)”:
No improvement in speed was observed with our reactive apps (the Gatling results are even slightly worse).
數月后,看似相反的結論卻在DZone 的一篇名為Raw Performance Numbers - Spring Boot 2 Webflux vs. Spring Boot 1 的文章中出現,測試結果是Spring Boot 2 WebFlux在高并發下的響應時間更平穩。實際上,這個測試結果有些“關公戰秦瓊”的味道,畢竟Spring Boot 2下的WebFlux和Spring Boot 1下的Servlet容器所使用的線程模型是不同的,并且Servlet 3.0的異步以及非阻塞特性默認是關閉的。
不過以上兩篇文章的結論并不矛盾,前者關注響應速度,后者則強調吞吐量,兩者都是性能的核心指標。遺憾的是,這兩篇文章均未對各自的測試用例做出調優,因此以上結論都存在一定的局限性,這也是筆者對響應式技術能否提升性能提出質疑的地方。
如果說筆者是國內提出響應式問題的第一人的話,那么知秋 就是國內第一個解決響應式問題的人。作為國內為數不多的響應式以及NIO方面的專家,在技術研究上,他追求格物致知,不輕易忽略技術細節;在知識分享上,他可謂知無不言,言無不盡,不僅在社交群中答疑解惑,而且錄制免費視頻,發布在B站 以及YouTube頻道 上,并得到了Josh Long等“大牛”的推文(Twitter)。或許以上方式還不足以完整地討論Java響應式技術,因此,知秋選擇了漫長而又艱苦的著書之路。盡管他是筆者的朋友,然而“內舉不避親”,筆者鄭重地向讀者朋友推薦本書。這是中國大陸地區(不含港澳臺地區)第一本全面解讀Java響應式技術的書籍,作者的技術積累雄厚,書中的知識脈絡循序漸進。同時,這也是一本引人深思的書,在進行源碼導讀的同時,也引導讀者對代碼設計進行思考。另外,這又是一本知識苦旅的書,因為它的涉及面較廣,讀者不僅需要具備一定的Java并發以及面向對象設計的基礎,而且需要花費較多的時間去反復推敲書中的有關內容。正所謂“夫夷以近,則游者眾;險以遠,則至者少” ,筆者希望讀者在購買本書后,不輕言放棄,當你面臨挑戰時,那才是成長的開始。同時,筆者也期盼讀者將響應式技術付諸實踐,提早“觸碰”未來。

小馬哥(mercyblitz)
2019年3月5日


推薦序二

有幸與李飛兄相識多年,他嚴謹的治學態度和認真的工作作風讓我敬佩不已。值得一提的是,李飛兄是一個非常樂于分享知識和幫助他人解惑的人。我經常在微信群中看到他熱情地幫助他人分析問題并提供解答思路。此外,他晚上還經常開視頻來分享自己對Java編程方法論的思考與心得。當然,這些視頻是免費、公開的,其中很多內容涉及本書的知識點,可以認為是本書很好的補充。事實上,我也是他的忠實聽眾之一,所以非常推薦大家在購買本書的同時結合視頻一起學習,如此則效果更佳。因此,我對他充沛的精力和滿滿的分享精神甚是佩服。寫書殊為不易,分享精神更是難能可貴,因此,當我得知李飛兄要將他對Java編程和響應式編程的技術經驗編寫成書的時候,甚是欣喜,因為我相信這本書不僅會給讀者帶來響應式編程等核心知識的深入理解和技術成長,同時也會讓讀者對Java編程方法論有自己的思考。
響應式編程是未來架構的一次升級。事實上,我們業務的主流模式會使用RPC和Spring MVC的同步等待機制,以及通過并行調用縮短平均響應時間,這種做法對性能的提升非常顯著。但是,隨著業務的復雜演變,可能會出現回調地獄,而且冗余的業務代碼和大量的并行代碼也會導致程序越來越難以維護。此時,一個新的編程思想——響應式編程——應運而生,它通過避免等待以縮短平均響應時間來保證系統的利用率。在這里,響應式編程的關鍵元素之一是能夠異步執行任務。這種全異步方式的優勢在于,可以充分地利用線程的時間片。另外,響應式編程是一種面向數據流和變化傳播的編程范式。事實上,它是一種新思路,我們可以認為任何東西都是一個數據流,即“萬物皆為流”,因此我們需要面向數據流編程。它并不陌生,可以通過觀察者模式來構建。我們可以創建事件流和數據流,然后讓觀察者/消費者訂閱任何需要關心的數據流并執行相關的業務操作。例如,我們經常提到的事件總線,其本質上就是通過異步事件流對監聽的事件變化做出響應。響應式編程還有一個很重要的概念——變化傳播。例如,輸入一個數據流,經過一系列的操作轉化成另一個數據流。為了更好地理解這個特性,我們可以把數據流類比成一條河流:它可以被觀測、被加工或者被合并成一條新河流。因此,隨著響應式編程的發展成熟,如果能把全異步流式的能力引入業務開發中,不僅可以使項目的性能得以提升,而且也可以給項目帶來更多的靈活性。
本書詳細介紹了RxJava的源碼細節和后端的實戰使用方法,不論是剛接觸響應式編程的入門讀者,還是已經有響應式編程實戰經驗的進階讀者,閱讀本書都會收獲頗多。
梁桂釗
阿里巴巴Java高級開發工程師

推薦序三

響應式編程日益流行,如今Java語言正經歷著快速迭代,然而很多Java開發者仍沉浸在Java 7/Java 8的世界。在Java 9發布前飛哥已經開始著手編寫本系列叢書的準備工作,目標是讓廣大開發者能夠學習全新的Java語言。如今的Java已經提供了函數式編程支持、模塊化的JDK和模塊化開發支持、對流式編程友好的G1垃圾回收器、低延遲的ZGC等特性,包含的內容非常豐富。由于計劃寫的內容很多,飛哥后來索性將響應式編程的部分拆分出來,成為現在我們所看到的這本書。時過境遷,Java語言早已不是被人詬病的臃腫語言,在其之上大量的精妙設計得以實現,事實證明Java擁有獨特的魅力和經久不衰的生命力。
學習響應式編程最重要的是理解它的設計思想,我們不能只將RxJava、Reactor以及Spring WebFlux作為一個工具框架看待,會使用它們并不意味著能夠駕馭它們。學習這本書會讓你了解響應式編程如何帶來程序性能的提升,以及什么是響應式編程的正確使用方式。如果說代碼是軀體,那么什么才是靈魂?軀體和靈魂相比,誰又是永生的?本書所講的不只是具體的使用方法,還會講解其中的設計思想:從它的源碼設計中學習如何設計,通過源碼還原其本質。機會總是留給有準備的人,抓住Java的響應式編程趨勢,追尋自己所向往的生活。
在閱讀本書的過程中,切忌不可囫圇吞棗。如果讀者的基礎尚未穩固,建議在閱讀時謹慎對待書中的內容。很多小段落不可只理解字面上的描述,在你多次回味并細細揣摩后,便可發現其中的深層次視角。書中內容大多前后關聯,因此不推薦跳躍式閱讀。
在閱讀本書選取的源碼時,切不可一眼過之,因為這些源碼多為關鍵所在。本書撥開“浮云”,在大量的源碼中直擊要害,幫助讀者了解程序的執行方式和設計思路。在閱讀本書時,準備好對應的源碼是一個聰明的選擇。書中的案例均經過精心的設計,從簡單使用開始,不斷地增添和修改,讓讀者在學習的過程中不脫離實戰,逐步掌握響應式編程。
響應式編程作為未來編程的趨勢,具有異步、非阻塞的特點,它能夠支持更大的吞吐量,相較于傳統的服務實現方式其占用較少的資源。在學習本書的內容前,希望讀者能夠對Lambda表達式和Steam(流)有一些了解,不了解也沒有關系,本系列叢書中關于JDK的書會在本書之后出版,讓大家認識全新的Java。另外,配套視頻教程已經準備好,在B站或YouTube上搜索“Java編程方法論”就可以找到它們。

尹相宇
格力Java高級工程師
內容簡介:

本書主要講解了到底什么是響應式,從代碼設計層面將JDK 9+中的Flow API、RxJava 2中關于源的創建,以及調度與背壓等相關核心操作娓娓道來,并通過實戰案例幫助大家更好地理解和使用相關的API。本書涉及了大量并發編程方面的技巧,以及從基礎代碼角度介紹了各種接口、設計模式和與之相關的基礎知識點,并將它們融會貫通。這就好比我們上學的時候,老師向我們傳授基礎知識,然后通過習題讓我們掌握這些基礎知識的運用技巧。本書也遵循了這個思路,同時這也符合我寫書的初衷。


目錄:

第1章 響應式編程總覽(Reactive Programming) 1
1.1 異步編程模式 1
1.1.1 并發 2
1.1.2 并行開發初探 3
1.2 流(Stream) 3
1.3 響應式流(Reactive Stream) 4
1.3.1 響應式流的特性 4
1.3.2 響應式開發的設計原則 5
1.3.3 響應式開發的好處 6
1.4 響應式開發工具庫 6
1.4.1 RxJava簡介 6
1.4.2 Reactor簡介 7
1.4.3 MongoDB簡介 8
1.4.4 響應式項目用例 8
1.5 Java 9中的響應式編程 10
1.5.1 響應式編程接口 10
1.5.2 Java 9響應式編程入門Demo 12
1.5.3 SubmissionPublisher類的源碼解讀 18
1.5.4 響應式編程整合Spring實戰案例 23
1.6 小結 29
第2章 在RxJava中創建Observable 30
2.1 響應式編程所涉及的設計模式 30
2.1.1 觀察者模式 30
2.1.2 迭代器模式 30
2.2 解讀reactivex.Observable 31
2.2.1 從Flow.Publisher到Observable 33
2.2.2 subscribe的二三事 33
2.2.3 create方法的設計思想 36
2.2.4 各式各樣的Observable 40
2.2.5 Observable.cache 43
2.2.6 無限流 49
2.2.7 在Observable內處理錯誤 54
2.2.8 定時控制Observable發送數據 56
2.2.9 Disposable延伸 59
2.2.10 ConnectableObservable解讀 67
2.2.11 Observable中的publish.refCount解讀 76
2.2.12 RxJava中的Subject解讀 79
2.3 小結 89
第3章 RxJava 2中的操作 90
3.1 核心操作 90
3.1.1 使用filter進行條件過濾 90
3.1.2 使用map進行元素轉換 96
3.1.3 使用flatMap進行扁平化轉換 98
3.1.4 使用scan累加器 112
3.1.5 使用groupBy進行分組 114
3.2 多個Observable的合并操作 122
3.2.1 使用merge對Observable進行合并 122
3.2.2 使用zip方法進行合并 124
3.2.3 combineLatest操作 135
3.2.4 withLatestFrom操作 141
3.2.5 amb操作 142
3.3 高級操作 143
3.3.1 再談累加器scan 143
3.3.2 聚合操作reduce 144
3.3.3 收集操作collect 146
3.3.4 使用distinct去重 148
3.3.5 使用distinctUntilChanged過濾重復數據 152
3.3.6 其他操作 152
3.3.7 自定義操作 153
3.4 小結 159
第4章 對RxJava 2的設計探索 160
4.1 源的創建設計思路 160
4.2 中間操作的轉承 162
4.3 小結 166
第5章 Observable實戰 167
5.1 初版架子實現 167
5.1.1 DAO層面的處理工作 167
5.1.2 控制層的響應式實現 172
5.2 基于架子實現一個匯率查詢的服務 175
5.3 rxjava-web-spring-boot-starter的抽取設計 179
5.4 ObservableSseEmitter的設計實現 188
5.5 小結 196
第6章 RxJava 2中的多線程操作 197
6.1 初探RxJava并發編程 197
6.2 subscribeOn操作 211
6.3 observeOn操作 216
6.4 unsubscribeOn操作 220
6.5 調度器Scheduler 226
6.5.1 Schedulers.newThread方式 227
6.5.2 Schedulers.io方式 227
6.5.3 Schedulers.computation方式 228
6.5.4 Schedulers.from(Executor executor)自定義方式 228
6.6 小結 230
第7章 Flowable與背壓 231
7.1 回顧背壓 231
7.2 引入Flowable 233
7.3 探索Flowable.create 234
7.3.1 BackpressureStrategy.BUFFER策略 239
7.3.2 BackpressureStrategy.LATEST策略 246
7.3.3 BackpressureStrategy.DROP策略 249
7.4 將一個Observable轉化為一個Flowable 251
7.5 通過onBackpressureXXX操作來實現背壓策略 252
7.5.1 onBackPressureBuffer操作 255
7.5.2 onBackpressureLatest與onBackpressureDrop操作 256
7.6 Flowable.generate操作 257
7.7 小結 262
第8章 Flowable實戰 263
8.1 使用Flowable封裝JDBC 263
8.1.1 封裝部分查詢邏輯 263
8.1.2 封裝update邏輯 265
8.2 結合Spring Web應用使用Flowable 268
8.2.1 接口數據的獲取 269
8.2.2 響應式服務的源設計 271
8.3 單元測試 274
8.3.1 使用Mock Service Server進行測試 274
8.3.2 使用@Mock來進行一些服務測試 277
8.4 controller層的實現邏輯改造 279
8.5 小結 282
序: