前言 迈向云原生
作为一位技术领域的老兵,我在过去近20年的时间里见证了整个软件行业在技术架构上发生的翻天覆地的变化。
我依稀记得,自己在2004年刚刚加入IBM中国软件研发中心时,整个团队都专注于构建基于SOA(面向服务的架构)的项目和解决方案。当时的SOA还很“重”,底层的技术实现强依赖于J2EE、Web Service、SOAP等技术。对开发人员而言学习成本较高,实现和落地方案相对复杂,客户也需要花费一定时间去学习如何使用系统。另外,当时的技术栈对于分布式系统设计中需要着重考量的非功能性需求(如性能、可扩展性、安全性等)的支持也相对欠缺,这些非业务能力需要在设计阶段就被考虑并最终实现出来,任务繁重。
尽管如此,SOA这种在当时领先的系统架构设计理念还是给整个软件行业带来了很多启示和思考。“星星之火,可以燎原”,作为架构演进过程中不可或缺的一员,SOA对随后出现的各种致力于解耦软件系统复杂性的新技术、新架构的诞生起到了重要的推动作用。
现在,微服务、云原生技术几乎成为整个软件开发行业的风向标,很多公司、组织和团队都正在或计划将自己的业务迁移到云上,并基于微服务技术理念对系统架构进行改造升级。其实,不管是SOA还是微服务,最终的目的都是解耦复杂的系统设计,以“服务”的方式来定义和封装模块化的业务功能,从而实现系统设计、开发和维护的独立性。
然而凡事都有两面性,在我们享受微服务、云原生技术给系统设计开发工作带来便利的同时,同样也需要面对新技术带来的一系列挑战,例如分布式事务、服务治理等,而这些还只是构造一个强健、完备的微服务架构所要面临问题中的一小部分。究其根源,软件设计的本质即在各种制约因素之下小心翼翼地权衡利弊。银弹未现,取舍为真,在软件架构设计的道路上,我们仍需上下求索,朝夕不倦。
FreeWheel作为全球互联网视频广告技术的引领者和全美视频广告技术创新的奠基者,其业务和技术复杂度在微服务应用领域具有很强的代表性。从2016年开始,我们团队致力于技术架构的改造和升级,通过近4年的努力,团队基于微服务、云原生的理念重新设计并实现了整个广告核心业务系统。在技术架构升级的过程中,我们也不可避免地遇到了很多未知的技术问题和挑战,团队如涉世未深的少年,跌跌撞撞,消除了困惑与迷茫,不断探索并一路前行至今,也因此积累了很多宝贵的经验。
书中所有内容正是来源于我们在实际工作中的实践总结。参与撰写书中各章节的同事也都在一线负责具体的设计和开发工作,对技术细节有深入的了解。书中文字可能朴实无华,但字字珠玑,相信对致力于微服务架构设计的开发人员会大有裨益。
本书特色
本书具有以下特色。
(1)实践出真知
作为冲锋在第一线的工程师,我们团队深知真实案例对读者的重要性,也清楚实践对于技术学习的重要性。因此,书中所述案例大都来自真实发生的应用场景,相应的解决方案也是针对该场景的落地实践。这也是本书以“最佳实践”命名的原因。当然,我们也不能轻视理论学习的重要性,通过文献综述和知识溯源,团队力求以最准确的方式描述技术概念和底层原理,使实践有理可依,有法可循。
(2)全生命周期覆盖
不管基于何种架构风格来构建系统,都必然要经历从设计到部署上线的完整流程,微服务应用也如此。特别是在云原生技术的加持下,开发方式和设计思路在技术选型、实现、部署等多方面都会有所不同。因此,我们没有以离散的、无序的方式讲述这些技术,而是基于开发流程,循序渐进地将知识点融入整个软件开发生命周期,以带给读者合理和流畅的阅读体验。从技术选型到服务划分,从敏捷开发到代码管理,从服务治理到质量保证,我们在每一个阶段剖析相应的技术和实践,告诉读者如何将云原生技术融入软件开发生命周期的每个环节。
(3)个性化案例分享
重复性的记叙、随处可得的显性知识会让写作变得苍白,让读者失去翻书的兴趣。本书的一大特色就是基于团队自身经验总结了许多个性化的实践方法,比如用于构建无服务器计算的低代码开发平台、虚拟团队中台搭建法、有趣的Bug Bash活动等。相信这些会给读者耳目一新的感觉,我们也希望这些个性化案例能帮助各位读者优化自己的开发方式。
本书内容
本书主要介绍了基于云原生技术构建微服务应用的工程实践,全书共9章,每章的内容简介如下。
第1章 云原生时代下的微服务
云原生技术的出现改变了微服务应用的构建方式,传统的开发方式无法很好地与云环境适配。本章将从微服务的特性讲起,深入剖析云原生的概念和核心技术,探索在云原生时代下微服务应用需要以何种改变来应对技术洪流的挑战,总结从传统微服务转变到云原生应用的开发过程。
第2章 微服务应用设计方法
设计是软件开发生命周期中最重要的活动之一。本章我们将基于团队的实践经验,与读者探讨如何设计一个微服务应用。我们将从应用的架构选型谈起,介绍架构、通信层、存储层、业务层的解决方案,同时还会基于实际案例分析如何对遗留系统进行微服务改造。
第3章 服务开发与运维
“实现”是将软件设计的结果转化为软件产品的过程,是软件开发的实际产出。本章将围绕服务开发与运维,基于团队的工程实践,介绍如何通过Scrum敏捷开发方法完成整个开发过程,并介绍我们为了提高开发效率而构建的服务管理与运维平台。
第4章 微服务流量管理
服务网格是云原生时代下进行流量管理的首选方案。通过声明式配置,应用就能具有控制流量的能力,并且该配置对应用透明。本章将基于我们团队在服务网格方面的实践,为读者详细介绍如何使用Istio为微服务应用提供流量管理能力。
第5章 分布式事务
随着软件系统从单体时代迈向微服务和云原生时代,以及数据库选型呈现去中心化、异构化的趋势,单体应用上的本地事务会转变为分布式事务,这给数据一致性需求带来了挑战。本章将围绕分布式事务这一技术方向,介绍我们团队使用Saga模式进行的实践。
第6章 无服务器架构
通过无服务器计算技术构建弹性伸缩应用的优势越来越明显。作为一种新兴的应用架构,无服务器架构的核心概念是什么,它有哪些区别于传统架构的特点,它的优势和应用场景是什么,它能为应用的构建带来哪些变革?本章将对这些问题进行一一解答。
第7章 服务的可观察性
使用微服务架构并迁移上云后会面临诸多挑战,例如,查看应用中各个服务的状态,快速定位并解决线上问题,以及监控服务间的调用关系。构建具有可观察性的应用是保障服务质量的重要因素。本章将介绍服务可观察性的定义与应用,以及团队在该领域的落地实践。
第8章 质量保证实践
软件质量是贯穿于软件开发生命周期各个阶段的重要概念,在很大程度上决定了系统的可用性和用户体验。在这一章中,我们将为读者介绍在架构迁移过程中所积累的一些与质量保证相关的实践经验,讲述团队如何通过完善的测试技术和混沌工程来构建云原生时代下的质量保证体系。
第9章 持续集成和持续部署
持续集成和持续部署是构建云原生应用的必要条件,我们的团队在这方面积累了大量的经验。在这一章中,我们将从持续集成的自动化触发、差异化执行、产物归档等方面谈起,介绍经过微服务改造后的产品发布规划、云原生部署框架,以及持续部署对微服务应用全生命周期的支持。
致谢
感谢FreeWheel核心业务系统开发团队的首席工程师马若飞,作为本书的第一作者,他领导参与公司微服务架构升级工作的工程团队成员不断打磨书中的内容。感谢所有参与撰写本书的同事们,他们将自己的真知灼见汇聚于此,句句箴言。感谢公司兄弟团队的支持与协作。还要感谢电子工业出版社博文视点的孙奇俏编辑,她严谨认真的工作态度和极高的专业度是我们高质量成书的关键。
撰写本书的灵感萌生于新年伊始,新春为岁首,寓意万物新生。我们也希望这本书能够帮助更多的读者以全新的方式从零开始构建一个可扩展、可维护的云原生应用,也祝愿大家在构建企业级微服务应用的技术道路上少走弯路,享受微服务、云原生技术带给我们的便利!
王强,FreeWheel研发副总裁