具体描述
本书全面介绍了微服务的建模、集成、测试、部署和监控,通过一个虚构的公司讲解了如何建立微服务架构。主要内容包括认识微服务在保证系统设计与组织目标统一上的重要性,学会把服务集成到已有系统中,采用递增手段拆分单块大型应用,通过持续集成部署微服务,等等。
作者简介
作者简介:
Sam Newman
是ThoughtWorks公司的技术专家、ThoughtWorks内部系统架构师,同时还为全球的客户提供咨询服务。他在开发和IT运维方面与全球多个领域的公司有过合作。
译者简介:
崔力强
阿里巴巴技术专家,目前专注于持续交付相关的产品开发。曾在ThoughtWorks任职多年,从事软件定制开发、敏捷软件开发的相关咨询等工作,帮助过数个团队和项目进行精益需求管理、软件设计、自动化测试和持续集成等实践。微信号:blade_1986
张骏
2010年加入ThoughtWorks公司。作为开发人员、项目经理、资深敏捷教练和资深咨询师,在金融、电信和能源服务行业的大型复杂业务系统的设计、开发、管理、咨询等方面有丰富的经验。曾为国内外诸多客户提供软件设计、开发以及咨询服务。拥有10年工作经验,在Scrum、看板、规模化敏捷等方法论,以及精益需求管理、自动化测试、持续集成、领域驱动设计、微服务等具体实践方面都有丰富的积累。微信号:zhangjun695339
目录信息
第1章 微服务 1
1.1 什么是微服务 2
1.1.1 很小,专注于做好一件事 2
1.1.2 自治性 3
1.2 主要好处 3
1.2.1 技术异构性 3
1.2.2 弹性 4
1.2.3 扩展 5
1.2.4 简化部署 5
1.2.5 与组织结构相匹配 6
1.2.6 可组合性 6
1.2.7 对可替代性的优化 6
1.3 面向服务的架构 7
1.4 其他分解技术 7
1.4.1 共享库 8
1.4.2 模块 8
1.5 没有银弹 9
1.6 小结 10
第2章 演化式架构师 11
2.1 不准确的比较 11
2.2 架构师的演化视角 12
2.3 分区 14
2.4 一个原则性的方法 15
2.4.1 战略目标 15
2.4.2 原则 15
2.4.3 实践 16
2.4.4 将原则和实践相结合 16
2.4.5 真实世界的例子 16
2.5 要求的标准 17
2.5.1 监控 18
2.5.2 接口 18
2.5.3 架构安全性 18
2.6 代码治理 18
2.6.1 范例 19
2.6.2 裁剪服务代码模板 19
2.7 技术债务 20
2.8 例外管理 21
2.9 集中治理和领导 21
2.10 建设团队 22
2.11 小结 23
第3章 如何建模服务 24
3.1 MusicCorp简介 24
3.2 什么样的服务是好服务 25
3.2.1 松耦合 25
3.2.2 高内聚 25
3.3 限界上下文 26
3.3.1 共享的隐藏模型 26
3.3.2 模块和服务 27
3.3.3 过早划分 28
3.4 业务功能 28
3.5 逐步划分上下文 29
3.6 关于业务概念的沟通 30
3.7 技术边界 30
3.8 小结 31
第4章 集成 32
4.1 寻找理想的集成技术 32
4.1.1 避免破坏性修改 32
4.1.2 保证API的技术无关性 32
4.1.3 使你的服务易于消费方使用 33
4.1.4 隐藏内部实现细节 33
4.2 为用户创建接口 33
4.3 共享数据库 33
4.4 同步与异步 35
4.5 编排与协同 35
4.6 远程过程调用 38
4.6.1 技术的耦合 38
4.6.2 本地调用和远程调用并不相同 39
4.6.3 脆弱性 39
4.6.4 RPC很糟糕吗 40
4.7 REST 41
4.7.1 REST和HTTP 41
4.7.2 超媒体作为程序状态的引擎 42
4.7.3 JSON、XML还是其他 44
4.7.4 留心过多的约定 44
4.7.5 基于HTTP的REST的缺点 45
4.8 实现基于事件的异步协作方式 46
4.8.1 技术选择 46
4.8.2 异步架构的复杂性 47
4.9 服务即状态机 48
4.10 响应式扩展 48
4.11 微服务世界中的DRY和代码重用的危险 49
4.12 按引用访问 50
4.13 版本管理 51
4.13.1 尽可能推迟 51
4.13.2 及早发现破坏性修改 52
4.13.3 使用语义化的版本管理 53
4.13.4 不同的接口共存 53
4.13.5 同时使用多个版本的服务 54
4.14 用户界面 55
4.14.1 走向数字化 56
4.14.2 约束 56
4.14.3 API组合 57
4.14.4 UI片段的组合 57
4.14.5 为前端服务的后端 59
4.14.6 一种混合方式 60
4.15 与第三方软件集成 61
4.15.1 缺乏控制 61
4.15.2 定制化 62
4.15.3 意大利面式的集成 62
4.15.4 在自己可控的平台进行定制化 62
4.15.5 绞杀者模式 64
4.16 小结 65
第5章 分解单块系统 66
5.1 关键是接缝 66
5.2 分解MusicCorp 67
5.3 分解单块系统的原因 68
5.3.1 改变的速度 68
5.3.2 团队结构 68
5.3.3 安全 68
5.3.4 技术 68
5.4 杂乱的依赖 69
5.5 数据库 69
5.6 找到问题的关键 69
5.7 例子:打破外键关系 70
5.8 例子:共享静态数据 71
5.9 例子:共享数据 72
5.10 例子:共享表 73
5.11 重构数据库 74
5.12 事务边界 75
5.12.1 再试一次 76
5.12.2 终止整个操作 77
5.12.3 分布式事务 77
5.12.4 应该怎么办呢 78
5.13 报告 78
5.14 报告数据库 78
5.15 通过服务调用来获取数据 80
5.16 数据导出 81
5.17 事件数据导出 82
5.18 数据导出的备份 83
5.19 走向实时 84
5.20 修改的代价 84
5.21 理解根本原因 84
5.22 小结 85
第6章 部署 86
6.1 持续集成简介 86
6.2 把持续集成映射到微服务 87
6.3 构建流水线和持续交付 90
6.4 平台特定的构建物 91
6.5 操作系统构建物 92
6.6 定制化镜像 93
6.6.1 将镜像作为构建物 94
6.6.2 不可变服务器 95
6.7 环境 95
6.8 服务配置 96
6.9 服务与主机之间的映射 97
6.9.1 单主机多服务 97
6.9.2 应用程序容器 99
6.9.3 每个主机一个服务 100
6.9.4 平台即服务 101
6.10 自动化 101
6.11 从物理机到虚拟机 102
6.11.1 传统的虚拟化技术 103
6.11.2 Vagrant 104
6.11.3 Linux容器 104
6.11.4 Docker 106
6.12 一个部署接口 107
6.13 小结 109
第7章 测试 110
7.1 测试类型 110
7.2 测试范围 111
7.2.1 单元测试 112
7.2.2 服务测试 113
7.2.3 端到端测试 114
7.2.4 权衡 114
7.2.5 比例 115
7.3 实现服务测试 115
7.3.1 mock还是打桩 115
7.3.2 智能的打桩服务 116
7.4 微妙的端到端测试 117
7.5 端到端测试的缺点 118
7.6 脆弱的测试 118
7.6.1 谁来写这些测试 119
7.6.2 测试多长时间 119
7.6.3 大量的堆积 120
7.6.4 元版本 120
7.7 测试场景,而不是故事 121
7.8 拯救消费者驱动的测试 121
7.8.1 Pact 123
7.8.2 关于沟通 124
7.9 还应该使用端到端测试吗 124
7.10 部署后再测试 125
7.10.1 区分部署和上线 125
7.10.2 金丝雀发布 126
7.10.3 平均修复时间胜过平均故障间隔时间 127
7.11 跨功能的测试 128
7.12 小结 129
第8章 监控 131
8.1 单一服务,单一服务器 132
8.2 单一服务,多个服务器 132
8.3 多个服务,多个服务器 133
8.4 日志,日志,更多的日志 134
8.5 多个服务的指标跟踪 135
8.6 服务指标 135
8.7 综合监控 136
8.8 关联标识 137
8.9 级联 139
8.10 标准化 139
8.11 考虑受众 140
8.12 未来 140
8.13 小结 141
第9章 安全 143
9.1 身份验证和授权 143
9.1.1 常见的单点登录实现 144
9.1.2 单点登录网关 145
9.1.3 细粒度的授权 146
9.2 服务间的身份验证和授权 146
9.2.1 在边界内允许一切 146
9.2.2 HTTP(S) 基本身份验证 147
9.2.3 使用SAML或OpenID Connect 148
9.2.4 客户端证书 148
9.2.5 HTTP之上的HMAC 149
9.2.6 API密钥 149
9.2.7 代理问题 150
9.3 静态数据的安全 152
9.3.1 使用众所周知的加密算法 152
9.3.2 一切皆与密钥相关 153
9.3.3 选择你的目标 153
9.3.4 按需解密 153
9.3.5 加密备份 153
9.4 深度防御 154
9.4.1 防火墙 154
9.4.2 日志 154
9.4.3 入侵检测(和预防)系统 154
9.4.4 网络隔离 155
9.4.5 操作系统 155
9.5 一个示例 156
9.6 保持节俭 158
9.7 人的因素 158
9.8 黄金法则 158
9.9 内建安全 159
9.10 外部验证 159
9.11 小结 159
第10章 康威定律和系统设计 161
10.1 证据 161
10.1.1 松耦合组织和紧耦合组织 162
10.1.2 Windows Vista 162
10.2 Netflix和Amazon 162
10.3 我们可以做什么 163
10.4 适应沟通途径 163
10.5 服务所有权 164
10.6 共享服务的原因 164
10.6.1 难以分割 164
10.6.2 特性团队 164
10.6.3 交付瓶颈 165
10.7 内部开源 166
10.7.1 守护者的角色 166
10.7.2 成熟 166
10.7.3 工具 167
10.8 限界上下文和团队结构 167
10.9 孤儿服务 167
10.10 案例研究:RealEstate.com.au 168
10.11 反向的康威定律 169
10.12 人 170
10.13 小结 170
第11章 规模化微服务 171
11.1 故障无处不在 171
11.2 多少是太多 172
11.3 功能降级 173
11.4 架构性安全措施 174
11.5 反脆弱的组织 175
11.5.1 超时 176
11.5.2 断路器 176
11.5.3 舱壁 178
11.5.4 隔离 179
11.6 幂等 179
11.7 扩展 180
11.7.1 更强大的主机 181
11.7.2 拆分负载 181
11.7.3 分散风险 181
11.7.4 负载均衡 182
11.7.5 基于worker的系统 184
11.7.6 重新设计 184
11.8 扩展数据库 185
11.8.1 服务的可用性和数据的持久性 185
11.8.2 扩展读取 185
11.8.3 扩展写操作 186
11.8.4 共享数据库基础设施 187
11.8.5 CQRS 187
11.9 缓存 188
11.9.1 客户端、 代理和服务器端缓存 188
11.9.2 HTTP缓存 189
11.9.3 为写使用缓存 190
11.9.4 为弹性使用缓存 190
11.9.5 隐藏源服务 191
11.9.6 保持简单 191
11.9.7 缓存中毒:一个警示 192
11.10 自动伸缩 192
11.11 CAP定理 193
11.11.1 牺牲一致性 194
11.11.2 牺牲可用性 195
11.11.3 牺牲分区容忍性 195
11.11.4 AP还是CP 196
11.11.5 这不是全部或全不 196
11.11.6 真实世界 197
11.12 服务发现 197
11.13 动态服务注册 199
11.13.1 Zookeeper 199
11.13.2 Consul 200
11.13.4 构造你自己的系统 201
11.13.5 别忘了人 201
11.14 文档服务 201
11.14.1 Swagger 202
11.14.2 HAL 和HAL浏览器 202
11.15 自描述系统 203
11.16 小结 203
第12章 总结 204
12.1 微服务的原则 204
12.1.1 围绕业务概念建模 205
12.1.2 接受自动化文化 205
12.1.3 隐藏内部实现细节 205
12.1.4 让一切都去中心化 206
12.1.5 可独立部署 206
12.1.6 隔离失败 206
12.1.7 高度可观察 207
12.2 什么时候你不应该使用微服务 207
12.3 临别赠言 208
关于作者 209
关于封面 209
· · · · · · (收起)
读后感
Over the past 10 years, distributed systems have become more fine-grained. From the large multi-million line long monolithic applications, we are now seeing the benefits of smaller self-contained services. Heavy-weight, hard to change Service Oriented Archi...
一本比较全面介绍Micro-Service 架构的书,从Micro-Service 的优势,讲到转型过程中可能遇到的挑战。有组织结构上的也有技术层面的,譬如在测试,集成,发布,运维,安全等等。由于篇幅较短,概括的内容很多,所以讨论的问题没有很深入。其实本身来说Micro-Service也没有什么新...
1. 这本书全面系统的介绍了实践微服务的方方面面,包括构建、集成、分解、部署、测试、安全等; 2. 这本书虽然包含了一些实例,但是更多的是方法论,虽然有些人觉得这样有点泛泛而谈,但是我感觉现在微服务的实践已经非常多,而这本书站在一个更高的高度上让我们系统地认识到微...
> 如果你有四个小组开发编译器,那么你会得到一个四步编译器。 这是《新黑客字典》的说法。 另一种更学术化的说法是: > 任何组织在设计一套系统(广义概念上的系统)时,所交付的设计方案在结构上都与该组织的沟通架构保持一致。 如果一个系统很大,以至于开发的它的人分...
用户评价
**第五段评价** 这本书的价值,并不在于它罗列了多少新的技术栈,而在于它提供了一种处理“不确定性”的哲学。在快速迭代的互联网环境中,架构设计永远是面向未来的妥协。作者敏锐地指出了当前行业内对“高可用”的过度追求如何导致资源浪费和过度复杂化。他倡导的“恰到好处的冗余”和“可接受的失败”,是经过无数生产事故洗礼后的智慧结晶。书中对于“可观测性”(Logging, Metrics, Tracing)的讨论,不再是简单地推荐工具,而是强调了如何基于这些数据来驱动架构决策和性能优化,形成一个自我修正的闭环。读完之后,我不再盲目地追求最新的技术标签,而是开始反思我们团队当前的技术债务和业务复杂度是否真的需要引入那些复杂的工具链。这本书就像一位睿智的导师,帮助我学会了在复杂性与简洁性之间,找到那个最符合当前业务生命周期的“甜点区域”。它更像是一部关于系统演化和工程智慧的沉思录,而非冰冷的技术手册。
**第四段评价** 阅读体验上,这本书的排版和图示设计也值得称赞。很多复杂的交互流程和状态转换,通过清晰的序列图和架构蓝图得到了直观的展现,大大降低了理解成本。这本书的深度在于它不仅仅停留在单个服务的技术实现层面,而是将视野拉高到整个系统的运维和治理框架。例如,它对“服务网格”(Service Mesh)的引入时机、对“混沌工程”在验证系统韧性中的作用,都有细致入微的讨论。这些内容往往是初阶书籍会略过,而高级工程师又迫切需要的知识点。更令人惊喜的是,作者对安全性的考量贯穿始终,从服务间的零信任认证(mTLS)到API网关的速率限制与熔断策略,构建了一个全面的防御体系视图。这让我意识到,一个“设计良好”的微服务系统,绝不仅仅是代码上的模块化,更是一个在容错、可观测和安全边界上都经过深思熟虑的整体。这本书为构建下一代弹性云服务提供了坚实的技术基石。
**第二段评价** 坦白讲,我拿到这本厚厚的册子时,心里是抱着一丝怀疑的,因为市面上充斥着太多“过度设计”和“过度宣传”的分布式系统读物。然而,这本书最大的亮点在于其罕见的务实主义精神。它没有沉溺于不切实际的“纯净架构”的乌托邦幻想,而是赤裸裸地展示了在现实世界的约束下(比如遗留系统、团队技能短板、预算压力等)如何落地并成功运行分布式架构。书中对于服务间通信机制的对比分析,简直是拆解得入木三分,无论是同步调用(如REST/gRPC)的性能陷阱,还是异步消息队列(Kafka/RabbitMQ)在最终一致性上的挑战,作者都给出了业界成熟的实践和应对模式。更让我印象深刻的是对“服务契约”和“版本兼容性”的详尽论述,这往往是项目交付阶段最容易被忽视的“定时炸弹”。读完后,我感觉自己像是完成了一次高强度的实战演习,对如何在不引发“分布式灾难”的前提下,逐步建立起健壮的、可维护的分布式服务生态,有了一个清晰且可操作的路线图。这本书的价值在于,它把“知道”和“做到”之间的鸿沟,用无数经验之谈填平了。
**第一段评价** 这本书的结构简直是教科书级别的典范,逻辑推进得丝滑流畅,每一个章节的衔接都像精心编排的乐章,让人读起来毫不费力却又收获颇丰。尤其赞赏作者在概念阐述上的深度和广度,不是那种浮于表面的概念堆砌,而是深入到技术选型背后的权衡取舍,那种对复杂系统设计哲学的探讨,着实令人醍醐灌顶。我尤其喜欢其中对于“恰当的分解”这一核心难题的剖析,作者并没有给出一个放之四海而皆准的银弹方案,而是引导读者思考业务域、数据边界与团队结构之间的复杂耦合关系,并通过多个不同规模的案例,展示了如何根据实际场景打磨出最适合自己的拆分策略。对于我这种在架构转型阵痛期挣扎的工程师来说,这本书提供的不是现成的代码或框架,而是一套思考问题的底层方法论,它教会了我如何用更宏观、更具前瞻性的视角去审视现有系统的瓶颈,并有理有据地规划出渐进式的演进路径。即便是对微服务领域有所涉猎的老手,也能从中挖掘出关于治理、可观测性和分布式事务处理等高阶议题的精辟见解。
**第三段评价** 这本书的语言风格非常独特,它不像传统的技术手册那样枯燥乏味,反而带有一种沉稳而富有洞察力的叙事感。作者似乎是一位经验极其丰富的架构师,他不是在“教”你技术,而是在“分享”他踩过的所有坑,以及如何优雅地绕过它们。特别是关于“数据一致性”和“分布式事务”那几章,简直是神来之笔。他没有简单地推荐SAGA模式或两阶段提交,而是深入剖析了每种模式适用的业务场景、其带来的复杂性开销,以及如何在某些特定领域(比如金融结算)采用“业务补偿”而非纯粹的技术锁定来实现最终一致性。这种对技术应用边界的深刻理解,远超出了普通教程的范畴。我尤其欣赏作者对“面向领域驱动设计(DDD)”与服务拆分之间关系的精妙阐述,他成功地将一个偏向理论建模的学科,转化为了指导实践划分服务边界的利器,让原本抽象的“限界上下文”变得可触摸、可落地。对于希望从单体应用向云原生演进的团队而言,这本书是必备的“避坑指南”。
#技术书少有的风格,很多地方让人心有戚戚然,忽然感到“这个坑我也踩过”。书中一些观点解释了我心中一些长期的困惑,比如对于DRY的原则,在系统架构上不可过分强调,应该实现微服务内部的代码复用,对于服务之间应该保持技术自治。还有一个观点也很令人深思:当你有四个小组开发一个编译器,你一定会得到一个四步编译器。企业软件的架构是由企业的组织架构决定的,设计一个软件,如果不适合企业的架构,不把大家都拉到一条船上,从一开始就注定要失败。
以前对于这种近似于方法论的书,一贯都是看完目录就无法读下去。现在渐渐发现其实是因为工程经验和项目经验太少的原因,就好像屠龙之术在一般屠夫看来既不知所云也毫无意义一样。幸运的是,第一次尝试就遇到了这本书,打开了新的大门;否则我估计在未来几年内我还是会对这类书敬而远之。
原作者逻辑混乱,且代码演示太少空讲概念;中文版的翻译也是灾难。
内容偏虚
很多面都提到了,指导性的说明