前言

如果你是一位互联网从业者,我猜出这几年你大概率被这些层出不穷的概念包围:云计算、PaaS、FaaS、CaaS、ServiceMesh、Serverless、可观测性、OLAP,当然不能遗漏了各种 Ops,诸如 DevOps、GitOps、MLOps、FinOps 等等。

近几年来,软件开发技术发生了翻天覆地的变化和革新,这也直接对如何构建上层应用产生了重大的影响。分析这些激动人心的技术变革以及讨论如何为业务赋能之前,我们先思考引发这一波技术浪潮的核心驱动力是什么?

软件在吞噬世界

互联网投资人 Mark Andreessen 曾发表过一篇文章《Software is Eating The World》,文章内容主要阐述了软件如何影响各个行业。援引原文部分内容:

我们处于戏剧性和广泛的技术和经济转变的中间,软件公司准备接管大量的经济。 ... 十年前,当我在创办的 Netscape 公司时,大概只有 500 万人使用宽带互联网,而现在有超过 20 亿人使用宽带互联网。在接下来的 10 年里,我预计全球至少有 50 亿人拥有智能手机,每个人每天都可以随时随地使用这种手机充分利用互联网。 ...

文中列出了被重塑的产业,包括:最大的书店 Amazon、最多人订阅的 Video service Netflix、最大的音乐公司 iTunes 等等。

文章发表于 2011 年,2023 年再来回顾互联网的冲击,感触更加深刻,部分软件变成像水、电、媒一样的基础设施。

移动互联网在加剧变化

作者展望互联网规模时,写道「在接下来的 10 年里,我预计全球至少有 50 亿人拥有智能手机,每个人每天都可以随时随地使用手机充分利用互联网」。

现在,我们已经可以确认 Mark Andreessen 的预测很正确,移动互联网时代的用户规模已经开始向人口基数看齐,开始出现各类亿级 DAU 规模的移动应用。那么移动互联网如此巨大的用户规模会对软件开发有什么影响?援引 Netflix 分享中的一则总结,如图所示。

图 1 Netflix 按照规模和变更速度对软件企业划分的总结

在十年前乃至二十年前的互联网时代,大多数软件企业都位于图 1-8 左边的两个象限,规模或许有大有小,但是变更速度相对今天都不快。当企业发展壮大时,体现的也更多是在规模上,变更速度并不会发生质的变化。而今天的移动互联网时代,则都位于图 1 右边的两个象限:无论规模是大是小,变更速度都要求非常快。并且当企业逐步发展壮大,规模十倍百倍增长时,对变更速度的要求并不会降低,甚至会要求更快。

移动互联网时代,能够成长并发展起来的这些公司,他们的共同点是:

  • 快速变更,不断创新,随时调整
  • 提供持续可用的服务,应对各种可能的错误和中断
  • 弹性可扩展的系统,应对用户规模的快速增长
  • 提供新的用户体验,以移动为中心

这样的背景下,对软件开发有了更高的要求,软件开发的方式也不得不跟随时代而变化。

时代巨变掀起技术浪潮

软件对各行各业的渗透和对世界的改变,以及移动互联网时代巨大的用户基数下快速变更和不断创新的需求对软件开发方式带来巨大的推动力,我们清晰地看到如此波澜壮阔的技术浪潮:

  • 软件正在改变世界。
  • 移动互联网让这个变革影响到每一个人。
  • 传统软件开发方式受到巨大的挑战。
  • 因为云计算以及相关技术的普及,软件上云成为趋势。
  • 云计算的形态持续在演进。

援引 InfoQ 主编徐川老师对云计算的总结

云计算技术总结

云计算的技术逐渐发展成为它本来该有的模样,以及与这样的云所匹配的软件架构,还有以及与这样的架构所匹配的开发流程与方法论。

大时代下的个体

视角转回到个体,不管你是否接受,软件行业解决问题的技术一直在变化,并且这种变化并不是平缓的升级,而是剧烈的革新替代。例如容器替代虚拟机、服务网格替代 SpringCloud、观测替代监控、Network Policy 替代 iptables 等等,许多习以为常的假设全被打破。

剧烈变化的背景下,如果我们只专注于手头的工作,不抬头看天,过度关注于某个技术深度和细节,大革命来临的时候,之前关注的细节可能再也没有意义。

所以,本书很少详细描述某个软件如何安装、如何使用,而是思考问题的本质以及不同的解决方式,尝试找到些许核心原理以及悟透点发展规律。例如网络优化受制于物理世界的枷锁,分布式系统演进是 CAP 定理的权衡选择,局限于时间与空间法则。容器、服务网格、Cilium 也不是什么黑科技,只是把计算机的基本原理、方法重新组合,换种形式解决业务变化带来的新问题。

本书的宗旨是希望能说清楚这些问题的本质,解释清楚整个服务架构的发展历程,讨论它们背后遵循的不变原则、探索它们的设计选择。读完本书,相信你对系统的整体运行一定有全新的认识与判断力:方案取舍、架构权衡将得心应手,个中症状处理更加游刃有余。

本书适合哪些读者

本书主要针对软件工程师、软件架构师以及技术负责人等,特别是那些需要对系统架构做权衡的人,譬如时常需要选择一些工具去解决某个领域的特定问题。退一步,如果你不需要做这些决定,本书也可以帮助你更好地理解这些技术的优缺点。

阅读本书,最好了解一些请求/响应型(Web)系统原理,熟悉一些常见的网络协议(譬如 TCP、HTTP 等)。如再有一些后端开发经验,这将会对阅读有很大帮助,至于你熟悉何种编程语言倒没有太大关系。

总体上讲,若以下条件适用你,可能会从本书收益:

  • 想了解业界的技术发展趋向和动态。
  • 需要对系统架构做出权衡、洞察出各类设计陷阱。
  • 需要构建高可用和健壮运行的系统。
  • 对请求/响应式系统整体如何运行有着天然的兴趣和探索精神。

如何阅读本书

本书总共 10个 章节,分为 4 大部分:

  • 第一部分 概论篇:这一部分只有第 1 章。第一部分是全书的绪论,不讨论具体的技术,适合所有的读者,尤其是想了解近几年业内技术发展的概况。

    • 第一章内容主要从需求的背景、解决问题的角度讨论这几年技术发展的趋向以及各种技术出现的契机。希望能借历史之名审视今天的现实问题,以及思考未来的技术/架构演进之路。
  • 第二部分 网络篇:这一部分包括第 2 ~ 5 章,这部分内容主要研究数据包在各个环节中如何处理,并管中窥豹讨论用户网络、内核网络、负载均衡等技术。

    • 第 2 章从一道经典的面试题“浏览器打开 url 到页面展现,中间发生了什么?”开始,研究数据包如何到达服务器,并讨论优化其过程,目标构建出“足够快”的网络服务。
    • 第 3 章,我们随着数据包进入 Linux 内核网络,了解内核网络框架如何干预数据包,了解内核网络框架的机制瓶颈以及一些高性能网络解决方案。
    • 第 4 章我们提前学习一些虚拟网络技术,为后续 Kubernetes、容器、服务网格等篇节储备一些基础知识。
    • 第 5 章数据包开始进入协议栈,我们了解数据包在四层、七层协议栈的处理,我们从这个角度来理解负载均衡最核心的职责:“选择谁来处理用户请求”和“将用户请求转发过去”。
  • 第三部分 分布式系统基石

    • 第五章我们主要讨论 CAP 定理,以及受它影响发展出来的各个分布式事务模型。
    • 在第六章,我们学习高可用设计中应用最广泛的容错模型,理解副本模型的关键是理解共识,这一章从共识问题认识 Paxos,以工程实践为目的去了解 Raft 的设计思路。理解了问题以及这些共识算法的解题思路,自然也能体会到 etcd、consul 以及各类分布式容错系统的设计原理,也能更好地把这些理解应用到现实。
  • 第四部分 基础架构的变革

    • 首先第 7 章,我们从 Google 的 borg 系统开始理解容器编排的演进,分析讨论 Kubernetes 容器运行时、网络模型、资源编排的设计。
    • 然后从服务间通信层面说清楚服务网格是什么、如何发展而来,再介绍当今服务网格产品的生态以及思考服务网格的未来。
    • 第 9 章我们从遥测数据认识可观测性,对比可观测性以及传统监控的区别。再探讨事件日志、链路追踪和聚合度量三个领域中等各个方案落地权衡。
    • 第 10 章,通过 GitOps 交付模型,介绍部分典型的工具/技术,着重本书部分理论的落地应用。

勘误

由于作者的认知局限,难免产生各种各样的错误。如果阅读文章发现问题,欢迎在 github 给我提交 PR 或者 issue。

致谢

首先感谢我的爱人,在我决定下笔之际义无反顾地担负起照顾两个孩子的责任,并在两年的时间内忍受我工作之余将时间全部用在写作上,没有她的支持我无法完成该作。

本书参考了大量他人的思想,其参考的著作、演讲、论文与我而言是宝贵的学习资源,感谢这些无私的贡献者,我才有幸将这些知识融合和系统化。

总字数:2874
Last Updated:
Contributors: isno