编辑推荐
- 第21届Jolt大奖获奖作品
- Martin Fowler作序推荐
- 软件开发领域新经典
软件发布是一个令人头痛的过程,非常耗时且风险很高。本书独特而有条理地阐述了以快速、高效、可靠的方式向用户交付新功能的原则和技术实践。通过实现自动化的构建、部署和测试过程,并改进开发人员、测试人员、运维人员之间的协作,交付团队可以在几小时(甚至几分钟)内发布软件变更,而这不受项目大小和代码复杂性的影响。
本书首先给出了实现快速、可靠、低风险交付过程的基础知识,然后介绍了部署流水线,即从签入到发布的过程中管理所有变更的一个自动化过程。书中探讨了支撑持续交付的“交付生态圈”,内容涉及基础设施、数据和配置的管理,以及组织治理。
作者为我们呈现了新的技术,包括自动化的基础设施管理和数据迁移,以及虚拟化的使用,并分别探讨了各种技术中的关键问题和实践,演示了降低风险的方法。
无论是开发人员、系统管理人员、测试人员,还是经理人员,本书都能前所未有地加速你将想法变成可发布软件的步伐,为企业迅速可靠地增添价值。
内容简介
本书讲述如何实现更快、更可靠、低成本的自动化软件交付,描述了如何通过增加反馈,并改进开发人员、测试人员、运维人员和项目经理之间的协作来达到这个目标。本书由三部分组成:部分阐述了持续交付背后的一些原则,以及支持这些原则的实践;二部分是本书的核心,全面讲述了部署流水线;第三部分围绕部署流水线的投入产出讨论了更多细节,包括增量开发技术、高级版本控制模式,以及基础设施、环境和数据的管理和组织治理。
本书适合所有开发人员、测试人员、运维人员和项目经理学习参考。
作者简介
Jez Humble ThoughtWorks公司首席咨询顾问,致力于帮助企业快速、可靠地交付高质量软件,经常在各种敏捷技术大会上发表演讲,拥有牛津大学物理学学士学位和伦敦大学民族音乐学硕士学位。2000年至今,他曾在各行业和不同技术领域担任系统管理员、开发人员、培训人员、咨询师和经理人员。
David Farley 具有20多年的大型分布式系统开发经验,是采用敏捷开发技术的先行者,曾作为技术负责人参加了ThoughtWorks公司许多极具挑战性的软件项目。目前帮助构建伦敦多项金融衍生品交易所(London Multi-Asset Exchange,LMAE)。
内页插图
目录
Part I: Foundations / 基础篇 1
Chapter 1: The Problem of Delivering Software / 软件交付的问题 3
Introduction / 引言 3
Some Common Release Antipatterns / 一些常见的发布反模式 4
Antipattern: Deploying Software Manually / 反模式:手工部署软件 5
Antipattern:Deploying to a Production-like Environment Only after Development Is Complete / 反模式:开发完成之后才向类生产环境部署 7
Antipattern: Manual Configuration Management of Production Environments / 反模式:生产环境的手工配置管理 9
Can We Do Better? / 我们能做得更好吗 10
How Do We Achieve Our Goal? / 如何实现目标 11
Every Change Should Trigger the Feedback Process / 每次修改都应该触发反馈流程 13
The Feedback Must Be Received as Soon as Possible / 必须尽快接收反馈/ 14
The Delivery Team Must Receive Feedback and Then Act on It / 交付团队必须接收反馈并作出反应 15
Does This Process Scale? / 这个流程可以推广吗 16
What Are the Benefits? / 收效 17
Empowering Teams / 授权团队 17
Reducing Errors / 减少错误 18
Lowering Stress / 缓解压力 20
Deployment Flexibility / 部署的灵活性 21
Practice Makes Perfect / 多加练习,使其完美 22
The Release Candidate / 候选发布版本 22
Every Check-in Leads to a Potential Release 23
Principles of Software Delivery / 软件交付的原则 24
Create a Repeatable,Reliable Process for Releasing Software / 为软件的发布创建一个可重复且可靠的过程 24
Automate Almost Everything / 将几乎所有事情自动化 25
Keep Everything in Version Control / 把所有的东西都纳入版本控制 26
If It Hurts, Do It More Frequently, and Bring the Pain Forward / 提前并频繁地做让你感到痛苦的事 26
Build Quality In / 内建质量 27
Done Means Released / “DONE”意味着“已发布” 27
Everybody Is Responsible for the Delivery Process / 交付过程是每个成员的责任 28
Continuous Improvement / 持续改进 28
Summary / 小结 29
Chapter 2: Configuration Management / 配置管理 31
Introduction / 引言 31
Using Version Control / 使用版本控制 32
Keep Absolutely Everything in Version Control / 对所有内容进行版本控制 33
Check In Regularly to Trunk / 频繁提交代码到主干 35
Use Meaningful Commit Messages / 使用意义明显的提交注释 37
Managing Dependencies / 依赖管理 38
Managing External Libraries / 外部库文件管理 38
Managing Components / 组件管理 39
Managing Software Configuration / 软件配置管理 39
Configuration and Flexibility / 配置与灵活性 40
Types of Configuration / 配置的分类 41
Managing Application Configuration / 应用程序的配置管理 43
Managing Configuration across Applications / 跨应用的配置管理 47
Principles of Managing Application Configuration / 管理配置信息的原则 47
Managing Your Environments / 环境管理 49
Tools to Manage Environments / 环境管理的工具 53
Managing the Change Process / 变更过程管理 53
Summary / 小结 54
Chapter 3: Continuous Integration / 持续集成 55
Introduction / 引言 55
Implementing Continuous Integration / 实现持续集成 56
What You Need Before You Start / 准备工作 56
A Basic Continuous Integration System / 一个基本的持续集成系统 57
Prerequisites for Continuous Integration / 持续集成的前提条件 59
Check In Regularly / 频繁提交 59
Create a Comprehensive Automated Test Suite / 创建全面的自动化测试套件 60
Keep the Build and Test Process Short / 保持较短的构建和测试过程 60
Managing Your Development Workspace / 管理开发工作区 62
Using Continuous Integration Software / 使用持续集成软件 63
Basic Operation / 基本操作 63
Bells and Whistles / 铃声和口哨 63
Essential Practices / 必不可少的实践 66
Don’t Check In on a Broken Build / 构建失败之后不要提交新代码 66
Always Run All Commit Tests Locally before Committing, or Get Your CI Server to Do It for You / 提交前在本地运行所有的提交测试,或者让持续集成服务器完成此事 66
Wait for Commit Tests to Pass before Moving On / 等提交测试通过后再继续工作 67
Never Go Home on a Broken Build / 回家之前,构建必须处于成功状态 68
Always Be Prepared to Revert to the Previous Revision / 时刻准备着回滚到前一个版本 69
Time-Box Fixing before Reverting / 在回滚之前要规定一个修复时间 70
Don’t Comment Out Failing Tests / 不要将失败的测试注释掉 70
Take Responsibility for All Breakages That Result from Your Changes /为自己导致的问题负责 70
Test-Driven Development / 测试驱动的开发 71
Suggested Practices / 推荐的实践 71
Extreme Programming (XP) Development Practices / 极限编程开发实践 71
Failing a Build for Architectural Breaches / 若违背架构原则,就让构建失败 72
Failing the Build for Slow Tests / 若测试运行变慢,就让构建失败 73
Failing the Build for Warnings and Code Style Breaches / 若有编译警告或代码风格问题,就让测试失败 73
Distributed Teams / 分布式团队 75
The Impact on Process / 对流程的影响 75
Centralized Continuous Integration / 集中式持续集成 76
Technical Issues /技
前言/序言
《构建弹性与韧性:企业级系统进化之道》 在瞬息万变的数字时代,软件系统早已不再是简单的代码集合,它们是驱动业务发展、连接全球用户的核心动脉。然而,随着系统复杂性的指数级增长,以及市场需求的快速迭代,如何确保这些关键系统在承受压力、面对变化时依然能够稳定运行、持续交付价值,已成为摆在每一位技术领导者和工程师面前的严峻挑战。本书《构建弹性与韧性:企业级系统进化之道》并非探讨特定的工具或流程,而是深入剖析企业级系统在持续进化过程中,必须掌握的一系列核心原则、设计哲学以及管理智慧,旨在帮助组织构建起真正具备弹性与韧性的软件体系,从而在不确定性中脱颖而出。 本书的出发点,是对当前软件开发与运维领域普遍存在的“僵化”与“脆弱”现象的反思。我们看到太多系统在小小的变动下便不堪重负,在突发事件面前束手无策。这种脆弱性不仅导致了高昂的修复成本,更严重的是,它直接影响了业务连续性,损害了用户信任,最终阻碍了企业的创新步伐。因此,本书将引导读者跳出“短期优化”的陷阱,着眼于“长期健康”,构建一套能够适应变化、自我修复、并能在压力下保持高性能的系统。 第一部分:理解系统的内在生命力——从单体到微服务,再到演化式架构 我们将首先回顾软件架构的演进历程,从最初的单体应用,到分布式微服务,再到当下备受关注的演化式架构。但这并非简单的技术栈介绍,而是着重于不同架构模式背后所蕴含的“可变性”与“可维护性”的设计理念。 单体架构的局限与反思: 并非否定单体,而是深入理解其在规模化、团队协作以及技术更新方面的天然瓶颈。我们探讨如何在设计单体时,为未来的演进埋下伏笔,例如模块化的设计、清晰的边界。 微服务的赋能与挑战: 微服务带来的独立部署、技术异构性等优势是显而易见的。然而,本书将聚焦于微服务“治理”的深层问题:服务间的依赖管理、分布式事务的复杂性、以及如何避免“分布式单体”的陷阱。我们将讨论如何通过合理的划分、契约管理和自治性,真正发挥微服务的优势。 演化式架构的哲学: 本章将是本书的核心之一。演化式架构并非预设最终形态,而是强调系统的适应性和持续改进能力。我们不再追求一次性定义所有需求,而是建立一套能够随着业务发展和技术进步而“生长”的机制。这包括: 持续的反馈回路: 如何从生产环境中获取最真实、最有价值的信息,并将其转化为改进的驱动力?这涉及监控、日志、追踪以及用户反馈的有效整合。 增量的改变: 如何设计系统,使其能够轻松地进行增量改进,而不是大规模的重构?我们探讨“低耦合、高内聚”在实践中的具体体现,以及如何通过“特征开关”等机制,实现安全、可控的演进。 适应性与弹性: 系统的设计应该能够预测并应对未知的变化。这包括如何通过解耦、抽象、以及拥抱不确定性来构建弹性。 第二部分:构建健康的系统心脏——数据、通信与状态的管理 软件系统的核心是数据的流动、服务的交互以及状态的维护。本部分将深入探讨如何在这几个关键领域构建起坚实的基石,确保系统的健壮性。 数据治理与一致性: 在分布式系统中,数据一致性是一个绕不开的难题。本书将超越简单的ACID模型,介绍CAP定理在实际应用中的权衡,以及各种分布式一致性算法(如Paxos、Raft)的原理与适用场景。更重要的是,我们将强调“最终一致性”的哲学,以及如何在业务逻辑层面处理可能出现的数据不一致情况,从而在可用性与一致性之间找到最佳平衡点。 领域驱动设计(DDD)与数据边界: 如何利用DDD的思想,清晰地界定数据的所有权与边界,减少跨服务的数据冗余与冲突。 事件驱动架构(EDA)与异步通信: 探讨如何利用事件驱动的模式,实现服务间的解耦与松耦合。我们将深入分析消息队列(MQ)的选型与使用策略,以及如何设计健壮的事件处理流程,应对消息丢失、重复消费等问题。 健壮的服务通信: 在微服务架构中,服务间的通信是系统的命脉。本书将聚焦于构建“故障转移”与“容错”能力的通信机制。 重试、超时与熔断: 深入剖析这些容错模式的设计原理、实现方式以及最佳实践。我们将通过具体的案例,展示如何避免“雪崩效应”,将局部故障的影响控制在最小范围内。 服务注册与发现: 如何确保服务能够可靠地找到彼此,并应对服务的动态变化。 API设计与契约: 强调清晰、稳定的API契约的重要性,以及如何通过版本管理、向后兼容性等手段,降低服务升级带来的风险。 状态管理的艺术: 许多系统的高可用性依赖于对状态的有效管理。本书将探讨如何在分布式环境下,可靠地维护和同步应用状态。 分布式缓存策略: 如何设计高效、可靠的分布式缓存,减少对后端数据源的压力。 状态机与工作流引擎: 对于具有复杂业务流程的系统,如何通过状态机和工作流引擎来管理和协调复杂的业务状态,确保流程的可靠执行。 第三部分:打造自动化的生命支持系统——从构建到监控的全面实践 一个真正有韧性的系统,离不开强大的自动化能力,它贯穿于从代码编写到生产运维的每一个环节。 持续集成与交付的精髓: 本章将深入探讨“持续”的真正含义,以及如何构建一个高效、可靠的CI/CD流水线。 自动化测试的金字塔: 强调单元测试、集成测试、端到端测试的合理分层与协同工作,以及如何通过自动化测试保障代码质量与变更的安全性。 基础设施即代码(IaC): 如何将基础设施的管理和配置自动化,实现可重复、可追溯的部署。Terraform, Ansible等工具的应用场景与实践。 蓝绿部署与金丝雀发布: 探讨这些高级部署策略如何实现零停机部署,以及如何最小化新版本发布带来的风险。 全方位的系统可观测性: “看不见”的系统是无法被管理的。本书将详细阐述如何构建强大的可观测性体系。 日志(Logging): 如何设计有效的日志策略,收集有用的信息,并实现结构化日志,便于查询和分析。 指标(Metrics): 识别关键的系统性能指标,并建立起有效的监控和告警机制。 追踪(Tracing): 在分布式系统中,理解请求的完整生命周期至关重要。我们将探讨分布式追踪的实现原理和工具。 告警与响应: 如何设置有效的告警阈值,避免告警疲劳,并建立起清晰的告警响应流程。 自动化运维与自愈能力: 目标是让系统具备一定的自我修复能力,减轻运维负担。 自动化故障检测与恢复: 如何利用监控数据,自动检测常见的故障模式,并触发预设的恢复脚本。 混沌工程(Chaos Engineering): 引入“故意制造故障”的思想,主动发现系统在异常情况下的脆弱性,从而提前加固。 弹性伸缩(Auto-scaling): 如何根据负载自动调整资源,应对流量高峰,同时避免资源浪费。 第四部分:塑造适应性文化——人的因素与组织的进化 技术是工具,而文化则是土壤。再先进的技术,也需要与之匹配的组织文化和人才培养体系来支撑。 拥抱不确定性与持续学习: 鼓励团队拥抱变化,将每一次事故都视为学习的机会,并建立起持续改进的机制。 跨职能团队与协作: 打破开发与运维之间的壁垒,建立以交付业务价值为核心的跨职能团队。 安全左移与责任共担: 将安全性融入到开发的早期阶段,以及建立起全员参与安全防护的文化。 建立面向未来的技术愿景: 如何在日常工作中,平衡短期业务需求与长期技术债务的管理,为系统的可持续发展奠定基础。 《构建弹性与韧性:企业级系统进化之道》不仅是一本技术书籍,更是一种思维方式的转变。它将引导读者从被动的“救火队员”转变为主动的“系统设计师”,从构建脆弱的系统转变为培育具备生命力的有机体。通过理解和实践本书提出的原则与方法,您将能够打造出真正能够应对复杂性、拥抱变化、并持续为业务创造价值的卓越软件系统。
读完这本书,我最大的感受就是它给了我一种“掌控感”。在之前的软件开发过程中,发布新版本往往伴随着一种不确定性和焦虑感,而这本书则提供了一套系统性的方法,让我们能够以一种更加自信和从容的态度来面对发布。作者对“持续集成”和“持续部署”的深入剖析,让我明白了自动化流水线的重要性,以及如何通过精心的设计来确保每一个环节的稳定运行。 书中对于“反馈和学习”的重视,也让我受益匪浅。它强调了构建一个能够快速响应和学习的机制,无论是来自用户的反馈,还是系统自身的监控数据,都应该成为我们持续改进的驱动力。作者提出的“度量驱动的改进”理念,让数据成为了我们决策的依据,而不是凭感觉去猜测。我特别关注了书中关于“A/B测试”的讲解,这是一种非常有效的验证新功能和优化策略的方法,它能帮助我们在降低风险的同时,最大化地提升用户体验。 让我眼前一亮的是,作者还花了不少篇幅来讨论“团队协作”和“沟通机制”。它深刻地认识到,再先进的技术也需要人的协作才能发挥出最大的价值。书中关于“建立信任”、“促进透明度”以及“鼓励知识共享”的建议,都非常有实践指导意义。我感觉,这本书不仅仅是教我们技术,更是在教我们如何构建一个高效、协作的开发团队。 另外,书中对于“基础设施自动化”的讲解也非常有深度。它不仅仅是搭建虚拟机,而是如何通过“基础设施即代码”的方式,让基础设施的管理变得像代码一样可靠和可重复。这种思想的转变,让我看到了自动化运维的巨大潜力,也为我们构建弹性和可扩展的系统奠定了基础。 总而言之,这本书提供了一个非常全面和深入的视角来理解“持续交付”。它不仅仅是一本技术指南,更是一种思维方式的转变。它教会我如何系统地思考软件交付的每一个环节,如何通过自动化、反馈和协作来构建一个可靠的发布系统,最终实现稳定、高效的软件交付。