
云原生之路,漫漫而修远,因为云在发展,应用也在发展。如何让应用充分利用云的特性焕发全新面貌,这是每个云原生应用架构领域的人应该思考的问题。 本书分为两篇,从技术演进讲起,让读者充分了解系统资源、应用架构和软件工程的发展历程,从而拥有技术角度的全局视野;然后介绍云原生应用的最佳实践,手把手教你设计一个云原生应用。 本书适合云原生应用开发人员、架构师、云计算从业者阅读,部分章节对产品团队、运维人员亦有一定的参考价值。
前言 谈到一个应用,我们首先考虑的是运行这个应用所需要的系统资源。其次,关于应用自身的架构模式也要考虑,从传统的单体架构模式到后来的微服务模式、服务网格,以业务功能为维度进行分拆更有利于应用的不断演进。最后,还需要从软件工程的角度来考虑云原生应用的设计、开发、部署、运维等不同阶段。 设计云原生应用需要从以上三个维度进行全方位的思考。所谓原生为云设计的应用,就是指从最初便被设计为在云上以最佳方式运行的应用,这种应用能充分发挥云平台的各种优势。 架构师是推动上述应用设计、开发,真正将云原生应用落地的人。那么何为架构师? 架构师的基本职责是在项目早期就设计好基本的框架,这个框架既能够确保团队成员顺利编写代码,满足近期业务需求的变化,又能为进一步的发展留出空间(所谓scalability),即确定技术选型。 20多年前的经典著作Design Patterns中讲过学习设计模式的意义,放在架构师的定义中非常贴切:成为架构师并不是要我们学习一种新的技术或者编程语言,而是要建立一种用于交流的共同语言和词汇,在设计方案时方便沟通,同时也帮助我们从更抽象的层次去分析问题本质,不被一些实现的细枝末节所困扰。当把很多问题抽象出来之后,我们也能更深入、更好地去了解现有系统——这些意义,对于今天的后端系统设计来说,也仍然是正确的。 总而言之,架构设计对应用有着深远的影响,它的好坏决定了应用的整体质量,并且决定了开发人员开发、维护和扩展应用的难易程度。 对架构师而言,不能为了架构而设计架构,在选择架构前,要始终理解问题和需求,不要本末倒置。一方面,需要精心设计应用架构;另一方面,需要对前端UI、测试、运维、数据管理等方面都非常熟悉,从而做出正确的决定。 本书将从全栈视角出发,从系统资源到应用架构,再到软件工程,深入浅出地讲解计算机技术的演进,给架构师或想要成为架构师的人一个非常好的角度来看待不同时代的技术,以及其能解决的问题。本书还会介绍在现有的云原生技术下,如何以最佳的形态和方式来构建一个应用,使其能够真正发挥云的能力,从而达到1+1>2的效果。 本书内容 本书分为“技术演进篇”和“最佳实践篇”两篇,涉及4个部分,共19章,大概的内容分布及简介如下。 技术演进篇 第1部分 系统资源(第1~5章) 基础架构解决的是一些通用性问题,主要涉及应用运行时所需要的系统资源,这些系统资源是设计任何类型的应用都需要重视的内容。针对不同的系统资源,应用的部署、运行方式也不尽相同。这一部分将首先介绍操作系统、虚拟化等基本知识,然后讲解云计算相关内容,以及容器与容器编排的核心知识。 第2部分 应用架构(第6~11章) 架构的重要性在于实现应用的非功能性需求。非功能性需求往往能决定一个应用运行时的质量,也能决定开发时的质量。这一部分将宏观介绍应用架构的定义、分类、目标等,列举主流架构视图,并按照技术演进过程介绍单体架构、分布式架构、SOA架构、微服务架构等内容。 第3部分 软件工程(第12~16章) 1968?年,世界各地的计算机科学家在德国的Garmisch召开了一次国际会议,在会上正式提出了“软件工程”一词。软件工程管理的核心目的是支撑新的演进式架构。软件工程的整个流程分为5个阶段:应用设计、软件开发、开发运维一体化、SRE运维、数字化运营。在这一部分中,我们将紧密围绕以上5个技术演进阶段,从软件工程角度讲解云原生应用架构的实现。 最佳实践篇 第4部分 架构、应用落地与中台构建(第17~19章) 在这一部分中,我们将详细剖析云原生架构,介绍其定义、涉及的关键技术,以及具体的实现过程。本部分还会介绍应用落地的最佳实践,涉及应用改造、应用拆分、API设计与治理等。此外,“中台”这个概念也与云原生密不可分,本部分还会阐述云原生应用与中台之间的关系,以及如何通过中台使应用的云原生化更加便捷。
目录 技术演进篇 第1部分 系统资源 2 第1章 操作系统 3 1.1 操作系统简介 3 1.1.1 主要功能 4 1.1.2 系统结构 5 1.2 CPU指令集原理 6 1.2.1 特权指令集和非特权指令集 6 1.2.2 保护模式及内核态、用户态 7 1.2.3 指令工作流程 8 1.3 内核 9 1.3.1 组成模块化 9 1.3.2 单内核 9 1.3.3 微内核 10 1.3.4 外内核 11 第2章 虚拟化 13 2.1 虚拟化概述 13 2.1.1 直接使用物理设备 13 2.1.2 虚拟化原理 14 2.2 虚拟化指令集 16 2.2.1 敏感指令集 17 2.2.2 虚拟化指令集的工作模式 17 2.3 虚拟化类型 20 2.3.1 全虚拟化 20 2.3.2 类虚拟化 21 2.3.3 硬件辅助虚拟化 22 2.4 虚拟化架构 24 2.4.1 裸金属架构 24 2.4.2 宿主模式架构 25 2.5 常见的虚拟化产品 25 2.5.1 VMware 25 2.5.2 Xen 26 2.5.3 KVM 26 2.5.4 QEMU 27 2.5.5 NEMU 28 2.5.6 Firecracker 28 2.5.7 VirtualBox 28 2.5.8 Libvirt 29 2.5.9 Vagrant 30 第3章 云计算 32 3.1 云计算概述 32 3.1.1 虚拟化的不足 32 3.1.2 云计算的特点 33 3.2 IaaS 34 3.2.1 云的部署模式 34 3.2.2 IaaS的主要功能 36 3.2.3 IaaS架构 36 3.2.4 云平台组织架构 37 3.2.5 OpenStack 39 3.2.6 云平台部署架构 41 3.3 PaaS 42 3.3.1 简介 43 3.3.2 核心功能 45 3.3.3 微软Azure 47 3.3.4 PaaS的优缺点 48 3.4 SaaS 49 第4章 容器 53 4.1 容器简介 53 4.1.1 容器技术的优缺点 53 4.1.2 大事记 54 4.2 基本技术 55 4.2.1 namespace 56 4.2.2 cgroup 59 4.2.3 rootfs 60 4.3 Docker 61 4.3.1 容器运行时 61 4.3.2 镜像 63 4.3.3 Docker总结 64 4.4 内核容器技术 64 4.4.1 Kata 64 4.4.2 Firecracker 65 4.4.3 gVisor 66 4.4.4 Unikernel 67 4.5 容器与虚拟机 68 4.6 容器与PaaS 69 第5章 容器编排 70 5.1 容器编排简介 70 5.1.1 大事记 70 5.1.2 Swarm与Kubernetes之争 71 5.1.3 容器编排工具的核心功能 73 5.2 Kubernetes 74 5.2.1 设计理念与特性 74 5.2.2 运行架构 76 5.2.4 API对象 80 5.3 容器编排与PaaS 90 5.4 Kubernetes企业级实战:OpenShift 91 5.5 实现有状态应用和无状态应用 91 5.5.1 无状态应用与有状态应用 92 5.5.2 从无状态应用到Severless 92 5.5.3 Kubernetes对有状态应用的管理 92 5.5.4 容器编排的最终目标 93 第2部分 应用架构 95 第6章 应用架构概述 96 6.1 架构与框架的区别 97 6.2 狭义的和广义的应用架构 97 6.2.1 狭义的应用架构 97 6.2.2 广义的应用架构 98 6.3 应用架构的定义 98 6.4 应用架构的目标 99 第7章 主流架构 101 7.1 “4+1”架构视图 101 7.1.1 逻辑视图 102 7.1.2 开发视图 102 7.1.3 进程视图 102 7.1.4 物理视图 103 7.1.5 场景视图 103 7.2 ArchiMate 104 7.2.1 ArchiMate概述 104 7.2.2 业务层 106 7.2.3 应用层 106 7.2.4 技术层 107 7.3 TOGAF框架 109 第8章 架构详解 114 8.1 业务架构 114 8.1.1 业务场景 114 8.1.2 业务用例 115 8.1.3 业务实体 115 8.1.4 业务流程 116 8.2 应用架构 116 8.2.1 功能架构 117 8.2.2 数据架构 121 8.2.3 实现架构 124 8.3 基础架构 131 8.3.1 物理架构 131 8.3.2 运行架构 131 第9章 典型的应用架构模式 133 9.1 单体架构 133 9.1.1 单体架构的特点 133 9.1.2 功能架构 134 9.1.3 单体应用的数据优化 136 9.1.4 单体架构的优缺点 142 9.2 基于组件的架构 143 9.2.1 特性 144 9.2.2 微内核架构 145 9.2.3 两种基于组件的应用开发、运行框架 145 9.2.4 组件设计原则 146 9.3 分布式与SOA 148 9.3.1 分布式 148 9.3.2 SOA 150 第10章 微服务架构 160 10.1 微服务架构简介 160 10.1.1 微服务与应用 161 10.1.2 微服务架构与SOA 162 10.1.3 微服务架构与容器编排 162 10.1.4 微服务架构与组织架构 163 10.2 采用微服务架构的优势与难点 163 10.3 微服务架构详解 165 10.3.1 功能架构 165 10.3.2 实现架构 166 10.3.3 部署单元 167 10.4 设计原则 167 10.4.1 服务注册中心 167 10.4.2 API网关 168 10.4.3 跨服务通信 169 10.4.4 API设计 170 10.4.5 数据一致性处理 172 第11章 微服务框架 181 11.1 微服务架构与微服务框架 181 11.2 核心功能 182 11.2.1 服务注册发现 182 11.2.2 服务负载路由 183 11.2.3 统一配置 184 11.2.4 服务编排与弹性伸缩 184 11.2.5 流量管控 185 11.2.6 可观察运维 186 11.3 框架分类 188 11.3.1 业务处理框架 188 11.3.2 SDK框架 189 11.3.3 服务网格 190 第3部分 软件工程 195 第12章 应用设计 196 12.1 明确愿景 196 12.1.1 目标对象 197 12.1.2 度量价值 197 12.1.3 详细描述 198 12.1.4 上下文图 198 12.2 明确组织架构 200 12.3 顶层业务建模 201 12.3.1 概述 201 12.3.2 业务领域 202 12.3.3 业务场景 205 12.4 应用需求分析 209 12.4.1 概述 209 12.4.2 识别角色 210 12.4.3 业务实体 210 12.4.4 业务流程 212 12.5 应用设计建模 214 12.5.1 概述 214 12.5.2 圈定微服务 215 12.5.3 应用架构设计 216 12.6 领域驱动建模 218 12.6.1 分布式应用建模的痛点 219 12.6.2 DDD概述 219 12.6.3 DDD的优势 220 12.6.4 基本概念 221 12.6.5 实施步骤 229 12.6.6 DDD与应用设计 238 第13章 软件开发 240 13.1 瀑布模型 240 13.2 敏捷开发模型 242 13.2.1 敏捷宣言 243 13.2.2 Scrum 244 13.2.3 极限编程方法 245 第14章 开发运维一体化:DevOps 248 14.1 精益思想 248 14.1.1 起源 248 14.1.2 精益生产 249 14.1.3 精益原则 250 14.1.4 精益软件开发 251 14.1.5 价值探索 253 14.1.6 IT价值流 253 14.1.7 精益和敏捷 255 14.2 持续集成 255 14.2.1 原则 255 14.2.2 步骤 256 14.3 持续交付与持续部署 258 14.3.1 持续交付 258 14.3.2 持续部署 259 14.3.3 特性发布 263 14.4 DevOps与CI/CD 269 14.4.1 定义 270 14.4.2 原则与推广 271 14.4.3 三步工作法 272 14.5 测试 275 14.5.1 概述 275 14.5.2 功能性测试 277 14.5.3 非功能性测试 281 14.6 DevOps与敏捷开发、Kubernetes、微服务、应用架构模式的关系 283 第15章 SRE运维 286 15.1 SRE运维简介 286 15.1.1 SLA 287 15.1.2 运维的发展阶段 288 15.1.3 架构层次 288 15.2 监控 289 15.2.1 监控概述 289 15.2.2 多层监控 291 15.2.3 告警 292 15.3 日志 293 15.3.1 日志系统架构 293 15.3.2 日志的采集、汇总与展示 294 15.4 故障排查 295 15.4.1 具体步骤 295 15.4.2 监控检查 296 15.5 作业运行 296 第16章 数字化运营 298 16.1 数字化运营概述 298 16.1.1 运营数据 298 16.1.2 角色分类 299 16.1.3 用户画像 299 16.2 数据处理 300 16.2.1 数据采集 300 16.2.2 数据建模 301 16.2.3 数据分析 301 16.2.4 指标分析 302 16.3 反馈流程 303 16.4 验证模式 304 16.4.1 A/B测试 304 16.4.2 灰度发布 305 16.5 平台架构 306 16.5.1 运维数据平台 306 16.5.2 智能化运维 306 最佳实践篇 第4部分 架构、应用落地与中台构建 310 第17章 云原生架构 311 17.1 云原生的定义 311 17.1.1 12因子应用 311 17.1.2 云原生架构的特征 313 17.1.3 CNCF对云原生的定义 314 17.1.4 本书对云原生的定义 315 17.2 关键技术 318 17.2.1 不可变基础设施(容器) 318 17.2.2 声明式编排(Kubernetes) 319 17.2.3 微服务架构(解耦性) 320 17.2.4 动态赋能(服务网格) 320 17.2.5 适应度函数(引导性) 320 17.2.6 领域驱动建模(统一模型) 321 17.2.7 CI/CD/CO 321 17.3 云原生应用的实现过程 322 第18章 应用落地最佳实践 323 18.1 云原生化条件 323 18.1.1 团队能力建设 323 18.1.2 推荐引入云原生化的场景 324 18.1.3 不推荐引入云原生化的场景 326 18.2 演进式的流程 327 18.3 应用改造模式 328 18.3.1 双胞胎模式 328 18.3.2 绞杀者模式 328 18.3.3 修缮者模式 329 18.4 应用拆分原则 330 18.4.1 按业务能力拆分 330 18.4.2 按DDD子领域拆分 330 18.4.3 其他原则 332 18.5 API设计与治理 333 18.5.1 前后端分离 334 18.5.2 规范化API 334 18.5.3 并行或异步调用 336 18.5.4 业务聚合 336 18.6 应用状态分离 337 18.6.1 统一配置管理 338 18.6.2 将冷数据存储在数据库中 338 18.6.3 缓存热数据 339 18.6.4 静态资源对象存储 340 18.7 应用容器化 340 18.8 非侵入式监控接入 345 18.9 流水线建设 347 18.10 架构 347 第19章 中台构建 350 19.1 中台简介 350 19.1.1 中台的由来 351 19.1.2 中台与云原生应用 351 19.1.3 中台架构 352 19.1.4 中台与微服务应用 353 19.2 中台核心功能 355 19.3 中台分类 355 19.3.1 技术中台 355 19.3.2 数据中台 356 19.3.3 业务中台 356 19.4 中台的优点 357 19.5 中台对组织架构的挑战 357 19.5.1 高层的支持 357 19.5.2 参与人员的理念相同 358 19.5.3 中台价值的量化 358 19.5.4 PaaS/SaaS与中台 358 19.6 中台落地过程 359