书籍详情
重构到微服务
作者:[英]萨姆 纽曼(Sam Newman)
出版社:中国电力出版社
出版时间:2023-08-01
ISBN:9787519879501
定价:¥98.00
购买这本书可以去
内容简介
本书作为一本改造指南,提供了大量针对如何将单体应用演进到微服务架构的实操建议。书中包含了大量图形化的示例、充满洞见的改造模式、涉及从改造的初始规划阶段到应用系统和数据库的解耦,涵盖了许多场景和策略,它们将帮助你实现成功的改造。你将从本书中学到这些经过实践检验过的模式和技巧。在改造过程,你一定会发现它们非常有价值。本书的主要内容有:适合于期望演进到微服务,而不是重写的组织。帮助组织决策是否要改造、何时改造、以及从哪里入手进行改造。如何解决遗留系统的通信、集成和迁移问题。阐述了若干不同的迁移模式,以及在什么情况下采用这些模式。提供了多种数据库迁移方法的案例,以及对应的同步机制。探索了应用系统解耦的方法,包括若干架构重构的模式。深入探讨了数据库解耦的细节,包括打破参照完整性和事务完整性的影响,新的失败模式等。
作者简介
作者介绍经历了几个创业公司,并在Thoughtworks工作了12年之后,目前Sam Newman是一位独立顾问。他专注于微服务、云技术、以及持续交付方面。通过培训和技术咨询服务,Sam帮助分布在全球的客户实现更快且更可靠的软件交付。他是经验丰富的演讲者,曾在全球多个大会上发表演讲。同时,他也是O’Reilly出版的《Building Microservices》一书的作者。译者介绍王威,Thoughtworks总监级咨询师,知朴咨询创始人,DDD中国社区联合创始人,Cynefin框架培训讲师,微服务架构、领域驱动设计、遗留系统重构的实践者。梅雪松,Thoughtworks总监级咨询师,遗留系统现代化服务负责人,微服务架构、领域驱动设计、遗留系统重构的实践者。姚琪琳,Thoughtworks专家级咨询师,遗留系统现代化服务负责人,极客时间《遗留系统现代化实战》专栏作者,技术书籍译者。
目录
目录
前言 1
第1 章 刚刚好的微服务 7
1.1 什么是微服务? 7
1.1.1 部署独立性 8
1.1.2 围绕业务领域建模 8
1.1.3 拥有自己的数据 12
1.1.4 微服务将带来哪些优势? 13
1.1.5 微服务会带来什么问题? 13
1.1.6 用户界面 .14
1.1.7 技术 14
1.1.8 颗粒度 15
1.1.9 所有权 17
1.2 单体架构19
1.2.1 单进程单体 19
1.2.2 分布式单体 21
1.2.3 第三方黑盒系统 22
1.2.4 单体架构的挑战 22
1.2.5 单体的优势 22
1.3 关于耦合和内聚 23
1.3.1 内聚 25
1.3.2 耦合 25
1.4 刚刚好的领域驱动设计 .36
1.4.1 聚合 37
1.4.2 限界上下文 38
1.4.3 将聚合和限界上下文映射到微服务 39
1.4.4 延伸阅读 .39
1.5 总结 .40
第2 章 规划迁移到微服务的过程 41
2.1 理解目标41
2.2 为什么要选择微服务? .43
2.2.1 提高团队自主性 44
2.2.2 缩短上市时间 45
2.2.3 经济高效地扩展负载.46
2.2.4 提高健壮性 47
2.2.5 扩展开发人员的数量.48
2.2.6 拥抱新技术 49
2.3 什么时候微服务可能是个坏主意?.51
2.3.1 不明确的业务领域 .51
2.3.2 初创公司 .52
2.3.3 客户安装和管理的软件 54
2.3.4 没有好的理由! 54
2.4 权衡利弊54
2.5 带人踏上旅途 .56
2.6 改变组织56
2.6.1 建立紧迫感 57
2.6.2 组建领导团队 58
2.6.3 制定愿景和战略 59
2.6.4 传达变革愿景 59
2.6.5 善于授权赋能 60
2.6.6 快速得到成果 61
2.6.7 促进变革深入 61
2.6.8 成果融入文化 62
2.7 增量迁移的重要性 62
2.8 变更成本64
2.8.1 可逆和不可逆的决定.64
2.8.2 更容易实验的地方 .66
2.9 那么我们从哪里开始呢? 66
2.10 领域驱动设计 66
2.10.1 你需要走多远? 67
2.10.2 事件风暴 68
2.10.3 利用领域模型进行优先级排序 68
2.11 一个组合模型 70
2.12 重组团队 .72
2.12.1 改变团队结构 .72
2.12.2 不要一刀切73
2.12.3 做出改变 75
2.12.4 改变技能 78
2.13 你如何知道转型成功与否? .81
2.13.1 有定期检查点 .81
2.13.2 定量度量 82
2.13.3 定性度量 82
2.13.4 避免沉没成本误区 83
2.13.5 对新方法持开放态度 83
2.14 总结 84
第3 章 拆分单体 87
3.1 单体系统,修改还是不修改? 87
3.1.1 剪切、复制或者重新开发? .88
3.1.2 重构单体系统 89
3.2 迁移模式90
3.3 模式:绞杀应用 91
3.3.1 它是如何工作的 91
3.3.2 在哪里使用它 93
3.3.3 示例:HTTP 反向代理 .95
3.3.4 数据 98
3.3.5 代理选项 .98
3.3.6 更改协议 102
3.3.7 示例:FTP 105
3.3.8 示例:消息拦截 106
3.3.9 其他协议 109
3.3.10 绞杀植物模式的其他例子 . 109
3.4 迁移功能时改变行为 110
3.5 模式:UI 组合 . 110
3.5.1 示例:页面组合 111
3.5.2 示例:小部件(Widget)组合 112
3.5.3 示例:微前端 . 115
3.5.4 在哪里使用它 . 116
3.6 模式:抽象分支 . 116
3.6.1 它是如何工作的 117
3.6.2 作为后备机制 . 124
3.6.3 在哪里使用它 . 125
3.7 模式:并行运行 . 126
3.7.1 示例:比较信用衍生品定价 126
3.7.2 示例:Homegate 列表 128
3.7.3 验证技术 129
3.7.4 使用Spy 129
3.7.5 GitHub Scientist 130
3.7.6 灰度发布与金丝雀发布 . 131
3.7.7 在哪里使用它 . 131
3.8 模式:装饰合作者 . 131
3.8.1 示例:会员计划 132
3.8.2 在哪里使用它 . 133
3.9 模式:变更数据捕获 133
3.9.1 示例:发行会员卡 133
3.9.2 实现变更数据捕获 135
3.9.3 在哪里使用它 . 137
3.10 总结 138
第4 章 分解数据库 139
4.1 模式:共享数据库 . 139
4.1.1 应对模式 141
4.1.2 何处使用 141
4.2 但这是不可能做到的! . 141
4.3 模式:数据库视图 . 143
4.3.1 数据库即公共契约 143
4.3.2 通过视图来对外展现 144
4.3.3 限制条件 145
4.3.4 所有权 146
4.3.5 何处使用 146
4.4 模式:数据库包装服务 146
4.5 模式:数据库即服务接口 . 149
4.5.1 实现映射引擎 . 151
4.5.2 与视图相比 . 151
4.5.3 何处使用 151
4.6 转让所有权 152
4.6.1 模式:暴露单体中的聚合 152
4.6.2 模式:变更数据所有权 . 155
4.7 数据同步. 156
4.8 模式:在应用程序中同步数据 158
4.8.1 步骤1:批量同步数据 158
4.8.2 步骤2:同步写入,从旧表结构中读取 159
4.8.3 步骤3:同步写入,从新表结构中读取 160
4.8.4 在哪里使用它(一) 161
4.8.5 在哪里使用它(二) 161
4.9 模式:追踪器写入 . 162
4.9.1 数据同步 165
4.9.2 案例:Square 的订单 . 167
4.9.3 在哪里使用它 . 171
4.10 拆分数据库 . 171
4.11 先拆分数据库,还是先拆分代码? 173
4.11.1 先拆分数据库 174
4.11.2 先拆分代码 178
4.11.3 将数据库和代码一起拆分 .183
4.11.4 那么,我应该先拆分哪个? .184
4.12 表结构拆分示例 184
4.13 模式:拆分表 184
4.14 模式:将外键关系移动到代码中 187
4.14.1 移动连表查询 188
4.14.2 数据一致性 190
4.14.3 在哪里使用 192
4.14.4 示例:共享静态数据 192
4.15 事务 201
4.15.1 ACID 事务 .202
4.15.2 仍然保持ACID,但缺乏整体的原子性? 203
4.15.3 两阶段提交 205
4.15.4 对分布式事务说不 207
4.16 saga . 208
4.16.1 saga 的失败模式 . 209
4.16.2 实施saga 213
4.16.3 saga 与分布式事务 220
4.17 总结 220
第5 章 成长的烦恼 223
5.1 服务越多,痛苦越多 223
5.2 规模化下的所有权 . 225
5.2.1 这个问题如何表现出来? 225
5.2.2 这个问题什么时候会发生? 226
5.2.3 潜在的解决方案 226
5.3 破坏性变更 227
5.3.1 这个问题如何表现出来? 227
5.3.2 这个问题什么时候会发生? 227
5.3.3 潜在的解决方案 228
5.4 报表 231
5.4.1 这个问题什么时候会发生? 232
5.4.2 潜在的解决方案 . 233
5.5 监控和故障排除 . 234
5.5.1 什么时候会出现这些问题? 234
5.5.2 这些问题是如何发生的? . 235
5.5.3 潜在的解决方案 . 235
5.6 本地开发者体验 . 239
5.6.1 这个问题如何表现出来? 239
5.6.2 什么时候会出现这些问题? 239
5.6.3 潜在的解决方案 240
5.7 运行太多东西 240
5.7.1 这个问题如何表现出来? 241
5.7.2 这个问题什么时候会发生? 241
5.7.3 潜在的解决方案 241
5.8 端到端测试 242
5.8.1 这个问题如何表现出来? 243
5.8.2 这个问题什么时候会发生? 243
5.8.3 潜在的解决方案 243
5.9 全局与局部优化 . 245
5.9.1 这个问题如何表现出来? 246
5.9.2 这个问题什么时候会发生? 246
5.9.3 潜在的解决方案 247
5.10 健壮性和弹性 248
5.10.1 这个问题如何表现出来? . 248
5.10.2 这个问题什么时候会发生? 249
5.10.3 潜在的解决方案 . 249
5.11 孤儿服务 250
5.11.1 这个问题如何表现出来? .250
5.11.2 这个问题什么时候会发生? .250
5.11.3 潜在的解决方案 .251
5.12 总结 252
第6 章 结语 . 255
附录A 参考书目 . 257
附录B 模式列表 . 261
前言 1
第1 章 刚刚好的微服务 7
1.1 什么是微服务? 7
1.1.1 部署独立性 8
1.1.2 围绕业务领域建模 8
1.1.3 拥有自己的数据 12
1.1.4 微服务将带来哪些优势? 13
1.1.5 微服务会带来什么问题? 13
1.1.6 用户界面 .14
1.1.7 技术 14
1.1.8 颗粒度 15
1.1.9 所有权 17
1.2 单体架构19
1.2.1 单进程单体 19
1.2.2 分布式单体 21
1.2.3 第三方黑盒系统 22
1.2.4 单体架构的挑战 22
1.2.5 单体的优势 22
1.3 关于耦合和内聚 23
1.3.1 内聚 25
1.3.2 耦合 25
1.4 刚刚好的领域驱动设计 .36
1.4.1 聚合 37
1.4.2 限界上下文 38
1.4.3 将聚合和限界上下文映射到微服务 39
1.4.4 延伸阅读 .39
1.5 总结 .40
第2 章 规划迁移到微服务的过程 41
2.1 理解目标41
2.2 为什么要选择微服务? .43
2.2.1 提高团队自主性 44
2.2.2 缩短上市时间 45
2.2.3 经济高效地扩展负载.46
2.2.4 提高健壮性 47
2.2.5 扩展开发人员的数量.48
2.2.6 拥抱新技术 49
2.3 什么时候微服务可能是个坏主意?.51
2.3.1 不明确的业务领域 .51
2.3.2 初创公司 .52
2.3.3 客户安装和管理的软件 54
2.3.4 没有好的理由! 54
2.4 权衡利弊54
2.5 带人踏上旅途 .56
2.6 改变组织56
2.6.1 建立紧迫感 57
2.6.2 组建领导团队 58
2.6.3 制定愿景和战略 59
2.6.4 传达变革愿景 59
2.6.5 善于授权赋能 60
2.6.6 快速得到成果 61
2.6.7 促进变革深入 61
2.6.8 成果融入文化 62
2.7 增量迁移的重要性 62
2.8 变更成本64
2.8.1 可逆和不可逆的决定.64
2.8.2 更容易实验的地方 .66
2.9 那么我们从哪里开始呢? 66
2.10 领域驱动设计 66
2.10.1 你需要走多远? 67
2.10.2 事件风暴 68
2.10.3 利用领域模型进行优先级排序 68
2.11 一个组合模型 70
2.12 重组团队 .72
2.12.1 改变团队结构 .72
2.12.2 不要一刀切73
2.12.3 做出改变 75
2.12.4 改变技能 78
2.13 你如何知道转型成功与否? .81
2.13.1 有定期检查点 .81
2.13.2 定量度量 82
2.13.3 定性度量 82
2.13.4 避免沉没成本误区 83
2.13.5 对新方法持开放态度 83
2.14 总结 84
第3 章 拆分单体 87
3.1 单体系统,修改还是不修改? 87
3.1.1 剪切、复制或者重新开发? .88
3.1.2 重构单体系统 89
3.2 迁移模式90
3.3 模式:绞杀应用 91
3.3.1 它是如何工作的 91
3.3.2 在哪里使用它 93
3.3.3 示例:HTTP 反向代理 .95
3.3.4 数据 98
3.3.5 代理选项 .98
3.3.6 更改协议 102
3.3.7 示例:FTP 105
3.3.8 示例:消息拦截 106
3.3.9 其他协议 109
3.3.10 绞杀植物模式的其他例子 . 109
3.4 迁移功能时改变行为 110
3.5 模式:UI 组合 . 110
3.5.1 示例:页面组合 111
3.5.2 示例:小部件(Widget)组合 112
3.5.3 示例:微前端 . 115
3.5.4 在哪里使用它 . 116
3.6 模式:抽象分支 . 116
3.6.1 它是如何工作的 117
3.6.2 作为后备机制 . 124
3.6.3 在哪里使用它 . 125
3.7 模式:并行运行 . 126
3.7.1 示例:比较信用衍生品定价 126
3.7.2 示例:Homegate 列表 128
3.7.3 验证技术 129
3.7.4 使用Spy 129
3.7.5 GitHub Scientist 130
3.7.6 灰度发布与金丝雀发布 . 131
3.7.7 在哪里使用它 . 131
3.8 模式:装饰合作者 . 131
3.8.1 示例:会员计划 132
3.8.2 在哪里使用它 . 133
3.9 模式:变更数据捕获 133
3.9.1 示例:发行会员卡 133
3.9.2 实现变更数据捕获 135
3.9.3 在哪里使用它 . 137
3.10 总结 138
第4 章 分解数据库 139
4.1 模式:共享数据库 . 139
4.1.1 应对模式 141
4.1.2 何处使用 141
4.2 但这是不可能做到的! . 141
4.3 模式:数据库视图 . 143
4.3.1 数据库即公共契约 143
4.3.2 通过视图来对外展现 144
4.3.3 限制条件 145
4.3.4 所有权 146
4.3.5 何处使用 146
4.4 模式:数据库包装服务 146
4.5 模式:数据库即服务接口 . 149
4.5.1 实现映射引擎 . 151
4.5.2 与视图相比 . 151
4.5.3 何处使用 151
4.6 转让所有权 152
4.6.1 模式:暴露单体中的聚合 152
4.6.2 模式:变更数据所有权 . 155
4.7 数据同步. 156
4.8 模式:在应用程序中同步数据 158
4.8.1 步骤1:批量同步数据 158
4.8.2 步骤2:同步写入,从旧表结构中读取 159
4.8.3 步骤3:同步写入,从新表结构中读取 160
4.8.4 在哪里使用它(一) 161
4.8.5 在哪里使用它(二) 161
4.9 模式:追踪器写入 . 162
4.9.1 数据同步 165
4.9.2 案例:Square 的订单 . 167
4.9.3 在哪里使用它 . 171
4.10 拆分数据库 . 171
4.11 先拆分数据库,还是先拆分代码? 173
4.11.1 先拆分数据库 174
4.11.2 先拆分代码 178
4.11.3 将数据库和代码一起拆分 .183
4.11.4 那么,我应该先拆分哪个? .184
4.12 表结构拆分示例 184
4.13 模式:拆分表 184
4.14 模式:将外键关系移动到代码中 187
4.14.1 移动连表查询 188
4.14.2 数据一致性 190
4.14.3 在哪里使用 192
4.14.4 示例:共享静态数据 192
4.15 事务 201
4.15.1 ACID 事务 .202
4.15.2 仍然保持ACID,但缺乏整体的原子性? 203
4.15.3 两阶段提交 205
4.15.4 对分布式事务说不 207
4.16 saga . 208
4.16.1 saga 的失败模式 . 209
4.16.2 实施saga 213
4.16.3 saga 与分布式事务 220
4.17 总结 220
第5 章 成长的烦恼 223
5.1 服务越多,痛苦越多 223
5.2 规模化下的所有权 . 225
5.2.1 这个问题如何表现出来? 225
5.2.2 这个问题什么时候会发生? 226
5.2.3 潜在的解决方案 226
5.3 破坏性变更 227
5.3.1 这个问题如何表现出来? 227
5.3.2 这个问题什么时候会发生? 227
5.3.3 潜在的解决方案 228
5.4 报表 231
5.4.1 这个问题什么时候会发生? 232
5.4.2 潜在的解决方案 . 233
5.5 监控和故障排除 . 234
5.5.1 什么时候会出现这些问题? 234
5.5.2 这些问题是如何发生的? . 235
5.5.3 潜在的解决方案 . 235
5.6 本地开发者体验 . 239
5.6.1 这个问题如何表现出来? 239
5.6.2 什么时候会出现这些问题? 239
5.6.3 潜在的解决方案 240
5.7 运行太多东西 240
5.7.1 这个问题如何表现出来? 241
5.7.2 这个问题什么时候会发生? 241
5.7.3 潜在的解决方案 241
5.8 端到端测试 242
5.8.1 这个问题如何表现出来? 243
5.8.2 这个问题什么时候会发生? 243
5.8.3 潜在的解决方案 243
5.9 全局与局部优化 . 245
5.9.1 这个问题如何表现出来? 246
5.9.2 这个问题什么时候会发生? 246
5.9.3 潜在的解决方案 247
5.10 健壮性和弹性 248
5.10.1 这个问题如何表现出来? . 248
5.10.2 这个问题什么时候会发生? 249
5.10.3 潜在的解决方案 . 249
5.11 孤儿服务 250
5.11.1 这个问题如何表现出来? .250
5.11.2 这个问题什么时候会发生? .250
5.11.3 潜在的解决方案 .251
5.12 总结 252
第6 章 结语 . 255
附录A 参考书目 . 257
附录B 模式列表 . 261
猜您喜欢