• 【包邮】 Java编程方法论:响应式RxJava与代码设计实战 【正版九新】
21年品牌 40万+商家 超1.5亿件商品

【包邮】 Java编程方法论:响应式RxJava与代码设计实战 【正版九新】

九品消毒塑封

21.5 2.7折 79 九五品

仅1件

天津宝坻
认证卖家担保交易快速发货售后保障

作者知秋

出版社电子工业出版社

ISBN9787121364174

出版时间2019-06

装帧其他

开本16开

定价79元

货号9787121364174

上书时间2024-11-30

文渊文化传媒

已实名 已认证 进店 收藏店铺

   商品详情   

品相描述:九五品
商品描述
内容摘要
本书主要讲解了到底什么是响应式,从代码设计层面将JDK9+中的FlowAPI、RxJava2中关于源的创建,以及调度与背压等相关核心操作娓娓道来,并通过实战案例帮助大家更好地理解和使用相关的API。本书涉及了大量并发编程方面的技巧,以及从基础代码角度介绍了各种接口、设计模式和与之相关的基础知识点,并将它们融会贯通。这就好比我们上学的时候,老师向我们传授基础知识,然后通过习题让我们掌握这些基础知识的运用技巧。本书也遵循了这个思路,同时这也符合我写书的初衷。

精彩内容
推荐序一
在ArchitectureandDesignInfoQTrendsReport-January2019(2019年1月的InfoQ架构和设计趋势报告)中,响应式编程(ReactiveProgramming)和函数式编程(FunctionalProgramming)编列在第一季度(Q1)的EarlyAdopter(早期采纳者)中。尽管这仅是一家之言,但是不少开发人员逐渐意识到响应式之风已然吹起。也许你的生产系统尚未出现响应式的身影,不过你可能听说过SpringWebFlux或NetflixHystrix等开源框架。笔者曾请教过Pivotal(Spring母公司)的布道师JoshLong:“Spring技术栈未来的重心是否要布局在响应式上?”对方的答复是:“没错,响应式是未来的趋势。”同时,越来越多的开源项目开始签署响应式宣言(TheReactiveManifesto)并喊出了“WebAreReactive”的口号。
或许开源界的种种举动无法说服你向响应式的“港湾”中停靠,不过Java9中FlowAPI的引入,又给业界注入了一剂“强心针”。不难看出,无论是JavaAPI,还是Java框架,均走向了响应式编程模型的道路,这并非一种巧合。
通常,人们谈到的响应式可与响应式编程画等号,以“非阻塞(Non-Blocking)”和“异步(Asynchronous)”的特性并述,以数据结构与操作相辅相成。响应式编程涉及函数式和并发两种编程模型,前者关注语法特性,后者强调执行效率。简言之,响应式编程的意图在于“LessCode,MoreEfficient”。除此之外,笔者认为响应式更大的价值在于统一Java并发编程模型,使得同步和异步的实现代码无异,同时做到Java编程风格与其他编程语言更好地融合,或许你已经发现Java与JavaScript在响应式方面并不存在本质区别。纵观Java在响应式编程上的发展,其特性更新真可谓步步为营、如履薄冰。尽管Java线程APIThread与Runnable已具备异步以及非阻塞的能力,然而其同步和异步编程的模式并不统一,并且理解ThreadAPI的细节和管理线程生命周期的成本均由开发人员承受。虽然在Java5引入J.U.C框架(Java并发框架)之后,ExecutorService的实现减轻了以上负担,但是开发人员仍须关注ExecutorService的实现细节。比如,怎样合理地设置线程池空间及阻塞队列又成为新挑战。为此,Java7引入了ForkJoinPoolAPI,不过此时的J.U.C框架与响应式理念仍存在距离,即使是线程安全的数据结构也并不具备并行计算的能力(如集合并行排序),同时操作集合的手段也相当贫乏,缺少类似Map/Reduce等的操作。不过这些困难只是暂时的,终究会被Java8“救赎”。StreamAPI的出现不仅具备数据操作在串行和并行间自由切换的能力(如sequential()及parallel()方法),而且淡化了并发的特性(如sorted()方法既可以进行传统排序,也可以进行并行排序)。相同的设计哲学也体现在Java响应式实现框架中,如本书中提及的RxJavaAPIio.reactivex.Observable。统一编程模型只是流的设计目标之一,它结合Lambda语法特性,虽然提供了数量可观的操作方法,如flatMap()方法等,但是无论对比RxJava,还是Reactor,流操作方法却又相形见绌。值得一提的是,这些操作方法在响应式的术语中被称为操作符(Operator)。当然框架内建操作符的多与少,并非判断其是否为响应式实现的依据。其中的决定性因素在于数据必须来自发布端(生产者)的“推送(Push)”,而非消费端的“拉取(Pull)”。显然,流属于消费端已就绪(Ready)的数据集合,并不存在其他数据推送源。不过JVM语言早期的响应式定义处于模糊地带,如RxJavaAPI属于观察者模式(ObserverPattern)的扩展,而非迭代器模式(IteratorPattern)的实现。而Reactor的实现则拥抱响应式流规范,该规范中消费端对于数据的操作是被动地处理,而非主动地索取。换言之,数据的到达存在着不确定性。当推送的数据无法得到消费端的及时响应时,响应式框架必须提供背压(BackPressure)实现,确保消费端拥有“拒绝的权力(cancel)”。在此理论基础上,响应式流规范定义了一套抽象的API,作为Java9中java.util.concurrent.FlowAPI的顶层设计。不过关于操作符的部分,该规范似乎不太关心,这也是RxJava和Reactor均称自身为响应式扩展框架的原因,同时两者在API级别提供了多种调度器(Scheduler)实现,可适配不同并发场景。尽管响应式定义在不同的阵营之间存在差异,但援引本人在《ReactiveProgramming:一种技术,各自表述》一文中的总结:ReactiveProgramming作为观察者(Observer)模式的延伸,不同于传统的命令编程(ImperativeProgramming)同步拉取数据的方式,如迭代器模式(Iterator),而是采用数据发布者同步或异步地推送到数据流(DataStream)的方案。当该数据流(DataStream)的订阅者监听到变化传播时,立即做出响应动作。在实现层面上,响应式编程可结合函数式编程简化面向对象语言语法的臃肿性,屏蔽并发实现的复杂细节,提供数据流的有序操作,从而达到提升代码的可读性以及减少Bug出现的目的。同时,响应式编程结合背压(BackPressure)的技术解决了发布端生成数据的速度高于订阅端消费数据的速度的问题。
不难看出,响应式是一门综合的编程艺术,在实现框架的“加持”下,相同的代码逻辑可实现同步与异步非阻塞功能,从而达到提升应用整体性能的目的。不过现实的情况或许没有那么理想,Spring官方文档在“WebonReactiveStack”章节中提到,“响应式和非阻塞通常并不会让应用运行得更快”:Reactiveandnon-blockinggenerallydonotmakeapplicationsrunfaster.为此,JHipster给出了一份Spring5WebFlux性能测试报告,其中一条结论是“响应式应用并没有表现出速度的提升(甚至其速度变得更慢)”:Noimprovementinspeedwasobservedwithourreactiveapps(theGatlingresultsareevenslightlyworse).数月后,看似相反的结论却在DZone的一篇名为RawPerformanceNumbers-SpringBoot2Webfluxvs.SpringBoot1的文章中出现,测试结果是SpringBoot2WebFlux在高并发下的响应时间更平稳。实际上,这个测试结果有些“关公战秦琼”的味道,毕竟SpringBoot2下的WebFlux和SpringBoot1下的Servlet容器所使用的线程模型是不同的,并且Servlet3.0的异步以及非阻塞特性默认是关闭的。
不过以上两篇文章的结论并不矛盾,前者关注响应速度,后者则强调吞吐量,两者都是性能的核心指标。遗憾的是,这两篇文章均未对各自的测试用例做出调优,因此以上结论都存在一定的局限性,这也是笔者对响应式技术能否提升性能提出质疑的地方。
如果说笔者是国内提出响应式问题的第一人的话,那么知秋就是国内第一个解决响应式问题的人。作为国内为数不多的响应式以及NIO方面的专家,在技术研究上,他追求格物致知,不轻易忽略技术细节;在知识分享上,他可谓知无不言,言无不尽,不仅在社交群中答疑解惑,而且录制免费视频,发布在B站以及YouTube频道上,并得到了JoshLong等“大牛”的推文(Twitter)。或许以上方式还不足以完整地讨论Java响应式技术,因此,知秋选择了漫长而又艰苦的著书之路。尽管他是笔者的朋友,然而“内举不避亲”,笔者郑重地向读者朋友推荐本书。这是中国大陆地区(不含港澳台地区)第一本全面解读Java响应式技术的书籍,作者的技术积累雄厚,书中的知识脉络循序渐进。同时,这也是一本引人深思的书,在进行源码导读的同时,也引导读者对代码设计进行思考。另外,这又是一本知识苦旅的书,因为它的涉及面较广,读者不仅需要具备一定的Java并发以及面向对象设计的基础,而且需要花费较多的时间去反复推敲书中的有关内容。正所谓“夫夷以近,则游者众;险以远,则至者少”,笔者希望读者在购买本书后,不轻言放弃,当你面临挑战时,那才是成长的开始。同时,笔者也期盼读者将响应式技术付诸实践,提早“触碰”未来。
小马哥(mercyblitz)2019年3月5日推荐序二有幸与李飞兄相识多年,他严谨的治学态度和认真的工作作风让我敬佩不已。值得一提的是,李飞兄是一个非常乐于分享知识和帮助他人解惑的人。我经常在微信群中看到他热情地帮助他人分析问题并提供解答思路。此外,他晚上还经常开视频来分享自己对Java编程方法论的思考与心得。当然,这些视频是免费、公开的,其中很多内容涉及本书的知识点,可以认为是本书很好的补充。事实上,我也是他的忠实听众之一,所以非常推荐大家在购买本书的同时结合视频一起学习,如此则效果更佳。因此,我对他充沛的精力和满满的分享精神甚是佩服。写书殊为不易,分享精神更是难能可贵,因此,当我得知李飞兄要将他对Java编程和响应式编程的技术经验编写成书的时候,甚是欣喜,因为我相信这本书不仅会给读者带来响应式编程等核心知识的深入理解和技术成长,同时也会让读者对Java编程方法论有自己的思考。
响应式编程是未来架构的一次升级。事实上,我们业务的主流模式会使用RPC和SpringMVC的同步等待机制,以及通过并行调用缩短平均响应时间,这种做法对性能的提升非常显著。但是,随着业务的复杂演变,可能会出现回调地狱,而且冗余的业务代码和大量的并行代码也会导致程序越来越难以维护。此时,一个新的编程思想——响应式编程——应运而生,它通过避免等待以缩短平均响应时间来保证系统的利用率。在这里,响应式编程的关键元素之一是能够异步执行任务。这种全异步方式的优势在于,可以充分地利用线程的时间片。另外,响应式编程是一种面向数据流和变化传播的编程范式。事实上,它是一种新思路,我们可以认为任何东西都是一个数据流,即“万物皆为流”,因此我们需要面向数据流编程。它并不陌生,可以通过观察者模式来构建。我们可以创建事件流和数据流,然后让观察者/消费者订阅任何需要关心的数据流并执行相关的业务操作。例如,我们经常提到的事件总线,其本质上就是通过异步事件流对监听的事件变化做出响应。响应式编程还有一个很重要的概念——变化传播。例如,输入一个数据流,经过一系列的操作转化成另一个数据流。为了更好地理解这个特性,我们可以把数据流类比成一条河流:它可以被观测、被加工或者被合并成一条新河流。因此,随着响应式编程的发展成熟,如果能把全异步流式的能力引入业务开发中,不仅可以使项目的性能得以提升,而且也可以给项目带来更多的灵活性。
本书详细介绍了RxJava的源码细节和后端的实战使用方法,不论是刚接触响应式编程的入门读者,还是已经有响应式编程实战经验的进阶读者,阅读本书都会收获颇多。
梁桂钊阿里巴巴Java高级开发工程师推荐序三响应式编程日益流行,如今Java语言正经历着快速迭代,然而很多Java开发者仍沉浸在Java7/Java8的世界。在Java9发布前飞哥已经开始着手编写本系列丛书的准备工作,目标是让广大开发者能够学习全新的Java语言。如今的Java已经提供了函数式编程支持、模块化的JDK和模块化开发支持、对流式编程友好的G1垃圾回收器、低延迟的ZGC等特性,包含的内容非常丰富。由于计划写的内容很多,飞哥后来索性将响应式编程的部分拆分出来,成为现在我们所看到的这本书。时过境迁,Java语言早已不是被人诟病的臃肿语言,在其之上大量的精妙设计得以实现,事实证明Java拥有独特的魅力和经久不衰的生命力。
学习响应式编程最重要的是理解它的设计思想,我们不能只将RxJava、Reactor以及SpringWebFlux作为一个工具框架看待,会使用它们并不意味着能够驾驭它们。学习这本书会让你了解响应式编程如何带来程序性能的提升,以及什么是响应式编程的正确使用方式。如果说代码是躯体,那么什么才是灵魂?躯体和灵魂相比,谁又是永生的?本书所讲的不只是具体的使用方法,还会讲解其中的设计思想:从它的源码设计中学习如何设计,通过源码还原其本质。机会总是留给有准备的人,抓住Java的响应式编程趋势,追寻自己所向往的生活。
在阅读本书的过程中,切忌不可囫囵吞枣。如果读者的基础尚未稳固,建议在阅读时谨慎对待书中的内容。很多小段落不可只理解字面上的描述,在你多次回味并细细揣摩后,便可发现其中的深层次视角。书中内容大多前后关联,因此不推荐跳跃式阅读。
在阅读本书选取的源码时,切不可一眼过之,因为这些源码多为关键所在。本书拨开“浮云”,在大量的源码中直击要害,帮助读者了解程序的执行方式和设计思路。在阅读本书时,准备好对应的源码是一个聪明的选择。书中的案例均经过精心的设计,从简单使用开始,不断地增添和修改,让读者在学习的过程中不脱离实战,逐步掌握响应式编程。
响应式编程作为未来编程的趋势,具有异步、非阻塞的特点,它能够支持更大的吞吐量,相较于传统的服务实现方式其占用较少的资源。在学习本书的内容前,希望读者能够对Lambda表达式和Steam(流)有一些了解,不了解也没有关系,本系列丛书中关于JDK的书会在本书之后出版,让大家认识全新的Java。另外,配套视频教程已经准备好,在B站或YouTube上搜索“Java编程方法论”就可以找到它们。
尹相宇格力Java高级工程师

—  没有更多了  —

以下为对购买帮助不大的评价

此功能需要访问孔网APP才能使用
暂时不用
打开孔网APP