前言
本书目标读者
本书适合中级和高级Java程序员。你应该非常熟悉Java,但是并不需要预先掌握反应式编程的知识。本书中的很多概念都与函数式编程相关,不过你也无须预先了解这方面的知识。以下两类程序员都能从本书中获益。
• 想提升服务器性能或者想让移动设备的代码更具可维护性的软件工程师。如果你属于这一类的话,将会在本书中找到解决实际问题的理念和方案,还有切实中肯的建议。在这种情况下,RxJava只是本书帮助你掌握的另一个工具。
• 好奇的开发人员。他们可能听说过反应式编程,尤其是RxJava,并且想要真正地理解它。如果你属于这种情况,即使没计划在生产环境的代码中使用RxJava,本书也会开拓你的视野。
另外,如果你是一名真正的软件架构师,本书很可能会对你有所帮助。RxJava会影响整个系统的总体架构,所以值得去了解。即便你刚刚体验编程,也可以尝试翻阅本书的前几章,这几章介绍了基础知识。一些底层的理念是通用的,如转换和组合,它们并不是反应式编程特有的。
本•克里斯滕森的说明
2012年,我正在为Netflix API实现一种新的架构。在这个过程中逐渐明确的是,为了实现目标,我们需要拥抱并发和异步网络请求。在探索实现方式的过程中,我遇到了Jafar Husain,他努力向我“兜售”他在微软学到的名为“Rx”的方法。我当时虽然非常熟悉并发,但是依然按照命令式的方式进行思考,并且极度以Java为中心,因为Java一直是我的经济支柱,我在它上面花费了大量时间。
Jafar向我“兜售”Rx方法时,因其函数式编程风格,我很难理解这些理念,只能先搁置。
在数月的讨论之后,整体的系统架构不断成熟。在这个过程中,我和Jafar继续进行了多次白板会议,直到我掌握了这些理论原则,并且意识到Reactive Extensions的优雅和力量。
我们决定在Netflix API中采用Rx编程模型,最终创建了Reactive Extensions的Java实现,即RxJava,它遵循了微软从Rx.Net和RxJS开始的命名约定。
在我从事RxJava开发工作的大约三年间,大部分工作都是在GitHub上以开放的方式完成的。我有幸与一个不断成长的社区一起工作,120多位贡献者一起将RxJava变成了一个成熟的产品,它被用于很多生产系统中的服务器端和客户端。在GitHub上它获得了15000多颗星,成为了排名前200名的项目之一,同时在使用Java的项目中排名第三。
Netflix的George Campbell、Aaron Tull和Matt Jacobs在RxJava成熟的过程中起着关键作用,他们将RxJava从早期的构建版本变成了现在的样子,所做的工作包括添加了lift、Subscriber、回压以及JVM多语言支持。Dávid Karnok随后参与了进来,他提交代码的次数和行数都已经超过了我。他是项目取得成功的关键因素之一,并且已成为项目的领导者。
我必须要感谢Erik Meijer,他在微软期间创建了Rx。在他离开微软之后,我曾在Netflix就RxJava项目与他合作过。现在,我有幸和他一起在Facebook工作。和他在白板前花那么多的时间一起讨论是我的荣幸。Erik这样的良师益友大大提高了我的思想水平。
在这个过程中,我还在很多会议上阐述了RxJava和反应式编程的相关内容,并结识了很多人,他们帮助我学习了关于代码和架构的更多知识。如果是自学的话,我不可能学到这么多。
Netflix支持我在这个项目上花费时间和精力,并且在技术文档方面提供了支持。我自己可能永远也写不出这样的文档。如果没有“工作时间”的付出和拥有不同技能的许多人员的参与,这种成熟度和规模的开源项目是无法取得成功的。
在第1章中,我会试图讲解为何反应式编程是一种有用的编程方式,以及RxJava是如何具体实现这些原则的。
本书其余部分由托马什编写,他写得非常棒。我有机会审阅并提了一些建议,但这是他的书,从第2章开始他将负责详细内容的讲解。
托马什•努尔凯维茨的说明
2013年,我在一家金融机构工作的时候,第一次接触RxJava。当时,我们要实时处理大量市场数据。那时数据管道的组成是这样的:Kafka传递消息,Akka处理交易,Clojure转换数据,还有一个自定义构建的语言在整个系统中传播变更。RxJava是一个非常具有吸引力的选择,因为它有一个统一的API,能够很好地处理不同来源的数据。
随着时间的推移,我尝试在更多的场景中使用反应式编程。在这些场景中,可扩展性和吞吐量都至关重要。按照反应式的方式来实现系统肯定要求更高,但是它带来的好处更为重要,包括更高的硬件利用率以及由此带来的能源节省。为了充分理解这种编程模型的优势,开发人员必须拥有相对易用的工具。我们认为Reactive Extensions在抽象、复杂性以及性能之间实现了平衡。
除非特别说明,本书讲述的是RxJava 1.1.6版本。尽管RxJava支持Java 6及更高版本,但是几乎所有的示例都用到了Java 8中的lambda语法。在讨论Android的第8章中,有些示例展现了如何在不支持lambda表达式的环境中处理烦琐的语法。话虽如此,本书并不会一直采用最简短的语法(比如方法引用),这主要是为了在适当的场景下提升代码可读性。
本书结构
如果你从头读到尾的话,将会收获最大。如果你没有那么多的时间,也可以选择最感兴趣的部分。如果某个概念在本书前面的章节中介绍过了,那么你很可能会找到关于参考章节的说明。如下是各章的简要介绍。
第1章简要介绍RxJava的起源、基本概念以及理念(本)。
第2章讨论如何将RxJava用于自己的应用程序,以及如何与它交互。这一章非常基础,但是理解一些概念是特别重要的,比如热源和冷源(托马什)。
第3章快速介绍RxJava提供的很多操作符,讲解一些具有表现力且强大的函数,它们是这个库的基础(托马什)。
第4章更加实用,展现如何将RxJava嵌入代码库的不同地方,还会简单介绍并发性(托马什)。
第5章内容更高级,阐述如何从头到尾实现反应式应用程序(托马什)。
第6章解释流控制中一个非常重要的问题,并介绍RxJava中的回压机制是如何解决该问题的(托马什)。
第7章介绍基于Rx的应用程序的单元测试、维护以及问题排查等相关技术(托马什)。
第8章展现一些RxJava应用程序,尤其是分布式系统中的程序(托马什)。
第9章重点介绍RxJava 2.x未来的计划(本)。
在线资源
本书所有的弹珠图均来源于RxJava的官方文档,它们基于Apache许可证2.0版本发布。
排版约定
本书使用了下列排版约定。
黑体字
表示新术语或重点强调的内容。
等宽字体(constant width)
表示程序片段,以及正文中出现的变量、函数名、数据库、数据类型、环境变量、语句和关键字等。
加粗等宽字体(constant width bold)
表示应该由用户输入的命令或其他文本。
等宽斜体(constant width italic)
表示应该由用户输入的值或根据上下文确定的值替换的文本。
该图标表示提示或建议。
该图标表示一般注记。
该图标表示警告或警示
Safari®Books Online
Safari Books Online(http://www.safaribooksonline.com)是应运而生的数字图书馆。它同时以图书和视频的形式出版世界顶级技术和商务作家的专业作品。技术专家、软件开发人员、Web设计师、商务人士和创意专家等,在开展调研、解决问题、学习和认证培训时,都将Safari Books Online视作获取资料的首选渠道。
对于组织团体、政府机构和个人,Safari Books Online提供各种产品组合和灵活的定价策略。用户可通过一个功能完备的数据库检索系统访问O'Reilly Media、Prentice Hall Professional、Addison-Wesley Professional、Microsoft Press、Sams、Que、Peachpit Press、Focal Press、Cisco Press、John Wiley & Sons、Syngress、Morgan Kaufmann、IBM Redbooks、Packt、Adobe Press、FT Press、Apress、Manning、New Riders、McGraw-Hill、Jones & Bartlett、Course Technology以及其他几十家出版社的上千种图书、培训视频和正式出版之前的书稿。要了解Safari Books Online的更多信息,我们网上见。
联系我们
请把对本书的评价和问题发给出版社。
美国:
O'Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中国:
北京市西城区西直门南大街2号成铭大厦C座807室(100035)
奥莱利技术咨询(北京)有限公司
O'Reilly的每一本书都有专属网页,你可以在那儿找到本书的相关信息,包括勘误表、示例代码以及其他信息。本书的网站地址是http://bit.ly/reactive-prog-with-rxjava。
对于本书的评论和技术性问题,请发送电子邮件到:bookquestions@oreilly.com
要了解更多O'Reilly图书、培训课程、会议和新闻的信息,请访问以下网站:
我们在Facebook的地址如下:http://facebook.com/oreilly
请关注我们的Twitter动态:http://twitter.com/oreillymedia
我们的YouTube视频地址如下:http://www.youtube.com/oreillymedia
致谢
来自本的致谢
如果没有托马什的话,这本书将不会存在,他编写了这本书大部分的内容。当然,还有我们的编辑Nan Barber,他为我们提供了很多帮助并且非常有耐心,陪我们坚持到了最后。感谢托马什在Twitter上答复我寻找作者的消息,最终将这本书变成现实。
我还要感谢Netflix开源组织和Daniel Jacobson多年来对我本人和项目的支持。他们是这个项目的赞助者,并让我将大量的时间用在了这个社区上。非常感谢!
感谢Erik创建了Rx、教会我很多东西,并为本书作序。
来自托马什的致谢
首先,我要感谢我的父母,大约20年前他们给了我第一台计算机(带有8MB内存的486DX2,我永远也不会忘记)。我的编程之旅就是这样开始的。有很多人为这本书的撰写做出了贡献。首先是本,他同意编写本书的第1章和最后一章,并审阅了我编写的内容。
提到审阅者,Venkat Subramaniam花费了很多精力,让我能够用一种恰当且一致的方式来组织本书内容。他经常建议我使用不同的句子、段落和章节顺序组织内容,甚至建议删除整页不相关的内容。我们另外一位审阅者是极有见识和经验的Dávid Karnok。作为RxJava的项目负责人,他发现了许多bug、竞态条件、不一致性和其他问题。这两位审阅者都提供了数百条评论,极大地提高了这本书的质量。在这本书的最初阶段,我的许多同事阅读了手稿,并给出了非常有价值的反馈。我要感谢Dariusz Baciński、Szymon Homa、Piotr Pietrzak、Jakub Pilimon、Adam Wojszczyk、Marcin Zajączkowski和Maciej Ziarko。
电子书
扫描如下二维码,即可购买本书中文电子版。