本书以Play框架为例阐述了反应式编程的理念以及在实际的编码中实践这些理念的方法,以实现更加灵活和高性能的Web应用程序。
本书共11章,分成三大部分。第一部分(第1章到第4章)主要介绍了反应式编程的基础理念,并讲解了函数式编程和Play框架的基础知识。第二部分(第5章到第8章)介绍了反应式Web编程的核心概念,如Future和Actor,还讲解了将反应式的理念应用到用户界面层的方法。第三部分(第9章到第11章)介绍了反应式Web编程的主题,涵盖反应式流以及应用程序的部署和测试等内容。
本书适合Java Web程序开发人员和架构师阅读,尤其适合希望借助反应式技术提升系统性能的开发人员参考,还可以作为Java编程人员学习函数式编程理念的进阶读物。
深度解析反应式编程的基础理念;
依托实例演示基础理念应用之法;
进一步讲解反应式流以及应用程序的部署和测试等内容
助力开发者编写高灵活性、高性能的Web应用程序
Manuel Bernhardt是一个很有热情的工程师、作者、演讲者和咨询师,对构建和运维网络应用方面的科学抱有强烈的兴趣。从2008年开始,他指导和训练企业团队将应用转移到分布式计算架构。最近几年,他关注的是反应式应用架构的生产型系统,在这个过程中,主要使用Scala、Play框架和Akka。
Manuel喜欢旅行,经常会在国际会议上演讲。他住在维也纳,并且是维也纳Scala用户组的联合组织者。除了思考、谈论和摆弄计算机,他喜欢将时光用在陪伴家人上,和他们一起跑步、潜水和阅读。读者可以在http://manuel.bernhardt.io了解到Manuel的动态。
第1章 你在谈论反应式编程吗 3
1.1 反应式的背景 4
1.1.1 反应式的起源 4
1.1.2 反应式宣言 5
1.1.3 反应式编程 6
1.1.4 反应式技术的涌现 7
1.2 重新思考计算资源的利用 8
1.2.1 基于线程与基于事件的Web应用服务器 8
1.2.2 开发适合多核架构的Web应用 11
1.2.3 水平应用架构 14
1.3 将故障处理作为第一考虑因素 16
1.3.1 故障是无法避免的 17
1.3.2 构建应用时,要充分考虑到故障 19
1.3.3 处理负载 21
1.4 小结 24
第2章 第一个反应式Web应用 25
2.1 创建并运行新工程 25
2.2 连接Twitter的流式API 28
2.2.1 获取到Twitter API的连接凭证 28
2.2.2 解决OAuth认证的一个bug 28
2.2.3 通过Twitter API获取流式数据 29
2.2.4 异步转换Twitter流 33
2.3 使用WebSocket将tweet以流的方式发送到客户端 36
2.3.1 创建Actor 37
2.3.2 搭建WebSocket连接并与之交互 38
2.3.3 发送tweet到WebSocket 40
2.4 让应用有弹性可扩展 42
2.4.1 让客户端变得有弹性 42
2.4.2 扩展 44
2.5 小结 46
第3章 函数式编程基础 47
3.1 函数式编程概述 47
3.2 不可变性 48
3.2.1 可变状态的谬误 48
3.2.2 将不可变值视为现实的快照 49
3.2.3 面向表达式编程 50
3.3 函数 52
3.3.1 面向对象编程语言中的函数 52
3.3.2 函数作为第一类的值 53
3.3.3 传递行为 53
3.3.4 组合函数 54
3.3.5 函数的大小 55
3.4 操作不可变集合 57
3.4.1 使用转换来替换循环 57
3.4.2 用来操作集合的高阶函数 58
3.5 转换到声明式编程风格 64
3.5.1 不要对Option使用get方法 64
3.5.2 只使用不可变值和数据结构 65
3.5.3 致力于编写小巧精炼的函数 65
3.5.4 迭代式地改善函数式编程风格 65
3.6 小结 66
第4章 快速掌握Play框架 67
4.1 Play应用的结构和配置 68
4.1.1 简单词汇教师应用简介 68
4.1.2 创建一个最小的Play应用脚手架 68
4.1.3 构建项目 71
4.2 请求处理 72
4.2.1 请求的生命周期 73
4.2.2 请求路由 76
4.2.3 控制器、Action和结果 80
4.2.4 WebSocket 86
4.2.5 调整默认的请求处理管道 89
4.3 小结 93
第二部分 核心概念
第5章 Future 97
5.1 使用Future 97
5.1.1 Future基础 98
5.1.2 Play中的Future 104
5.1.3 测试Future 111
5.2 用Future来设计异步业务 113
5.2.1 识别可并行的元素 114
5.2.2 组合服务的Future 116
5.2.3 错误的传播与处理 121
5.3 小结 125
第6章 Actor 127
6.1 Actor的基本原理 128
6.1.1 简单的Twitter分析服务 128
6.1.2 搭建基础框架:Actor及其子Actor 129
6.2 任其崩溃—监管与恢复 142
6.2.1 可靠的存储 142
6.2.2 任其崩溃 145
6.2.3 观察Actor的消亡并将其复活 146
6.3 系统对负载的反应,实现监控并预防服务过载 147
6.3.1 流控制消息 148
6.3.2 具有优先级的消息 151
6.3.3 断路器 153
6.4 小结 155
第7章 处理状态 157
7.1 在无状态的Play Web应用中使用状态 158
7.1.1 数据库 159
7.1.2 使用Play session保持客户端状态 170
7.1.3 使用分布式缓存保持服务端状态 171
7.2 命令查询职责分离与事件溯源 173
7.2.1 Twitter SMS服务 173
7.2.2 搭建SMS网关 177
7.2.3 通过持久化Actor编写事件流 179
7.2.4 配置Akka持久化,写入到MongoDB中 182
7.2.5 处理传入的命令:订阅用户在Twitter被提及的通知 183
7.2.6 将事件流转换为关系模型 185
7.2.7 查询关系模型 188
7.2.8 关于最终一致性 190
7.3 小结 190
第8章 反应式用户界面 191
8.1 集成Scala.js和Play 192
8.1.1 应用结构 192
8.1.2 搭建构建流程 193
8.1.3 创建简单的Scala.js应用 195
8.2 集成Scala.js和AngularJS 196
8.2.1 搭建AngularJS绑定 196
8.2.2 创建AngularJS应用 197
8.2.3 初始化AngularJS dashboard模块及其依赖 199
8.2.4 初始化Dashboard控制器 199
8.2.5 创建视图片段 200
8.2.6 在HTML中加载AngularJS应用 200
8.3 使用Scala.js集成已有的JavaScript库 201
8.3.1 将已有的JavaScript库包装为AngularJS服务 201
8.3.2 创建为图表获取数据的服务 203
8.3.3 使用Chart.js展现指标数据 205
8.4 处理客户端故障 207
8.4.1 借助测试防止出现缺陷 207
8.4.2 探测WebSocket连接故障 209
8.4.3 通知用户 209
8.4.4 监控客户端错误 211
8.5 小结 211
第三部分 高级话题
第9章 反应式流 215
9.1 为什么要有反应式流 215
9.1.1 带有非阻塞回压功能的流 216
9.1.2 操作异步流 217
9.2 Akka Streams简介 218
9.2.1 核心原理 218
9.2.2 操作流式的tweet数据 219
9.3 小结 230
第10章 部署反应式Play应用 231
10.1 为Play应用的生产环境部署做好准备 232
10.1.1 创建用于部署的简单应用 232
10.1.2 使用Selenium编写和运行测试 234
10.1.3 为应用的生产部署做好准备 236
10.2 搭建持续集成环境 239
10.2.1 在Docker中运行Jenkins 239
10.2.2 通过配置Jenkins来构建应用 241
10.3 部署应用 243
10.3.1 部署到Clever Cloud 243
10.3.2 部署到自己的服务器上 245
10.3.3 该选择哪种部署模式 248
10.4 小结 248
第11章 测试反应式Web应用 249
11.1 测试反应式特质 249
11.1.1 测试响应性 250
11.1.2 测试弹性 250
11.1.3 测试适应性 251
11.1.4 在哪里进行测试? 251
11.2 测试单个反应式组件 251
11.2.1 测试单个组件的响应性 252
11.2.2 测试单个组件的弹性 256
11.3 测试整个反应式应用 259
11.3.1 创建生成随机数的简单应用 259
11.3.2 使用Gatling测试弹性 261
11.3.3 使用Bees with Machine Guns测试扩展性 265
11.4 小结 270
附录A 安装Play框架 271
附录B 推荐读物 275
附录C 推荐资源 277