第 1 章:云原生应用程序

本章通过亚马逊和 Netflix 的案例,系统梳理了云原生应用程序的演进背景、核心理念与关键模式,介绍了十二要素原则及其实践,为后续深入理解云原生 Java 奠定基础。

云原生应用程序

软件开发模式不断演进,开源运动推动了工具、框架和平台的爆发式增长,强调灵活性与自动化。当前主流开源工具聚焦于提升从开发到运维的持续交付效率。

亚马逊的故事

亚马逊自 20 世纪 90 年代初起,从网络书店成长为全球最大在线零售商。其成功不仅源于商业模式创新,更得益于技术架构的持续演进。

亚马逊首席技术官 Werner Vogels 指出,企业要实现超大规模,必须不断迁移架构模式。最初,亚马逊采用单体应用,随着团队和代码库的扩展,所有权界限变得模糊,导致扩展性受限。共享资源(如数据库)进一步加剧了这一问题,降低了团队对功能上线的控制力。

“你建立它,你运行它。”
——Werner Vogels,亚马逊首席技术官

亚马逊强调团队对所构建代码的全权负责,这一理念成为 DevOps 的核心。2006 年,亚马逊推出 AWS,将内部平台商品化,推动了公有云市场的发展。公有云让开发者无需关心底层基础设施,按需租用资源,极大提升了敏捷性和创新能力。

然而,早期应用并未为云环境设计,迁移面临诸多挑战。为适应公有云,大型企业必须改变应用开发方式。

平台的承诺

平台本质上是一组帮助构建和运行应用程序的功能集合。优秀的平台通过自动化,承担核心业务之外的重复性任务,使开发团队专注于差异化创新。

平台的核心在于自动化工具对业务价值的放大。以 Amazon.com 为例,通过提升组件隔离性,团队获得了更大的发布自主权。

平台设计的三要素

  • 想法:平台的核心理念及其价值。
  • 约束条件:将理念落地所需面对的实际约束。
  • 实践行为:将约束转化为可重复的自动化操作。

以 Amazon.com 为例

  • 想法:提升组件隔离性,实现快速、独立交付。
  • 约束条件
    • 组件需独立部署
    • 业务逻辑与数据封装
    • 外部无法直接访问数据库
    • 通过 Web 接口暴露服务
  • 实践行为
    • 提供自助服务界面配置基础设施
    • 支持应用打包与环境发布
    • 数据库以服务形式提供并可配置
    • 数据库密码通过环境变量绑定
    • 提供服务注册中心

这些承诺减少了重复劳动,加速了业务创新。AWS 初期并未强制用户遵循内部约束,而是以基础服务集合的形式提供,后续逐步推出托管平台服务,推动行业标准化。

本书将以 Cloud Foundry 为例,介绍开源 PaaS 平台如何实现这些承诺,并聚焦于云原生 Java 应用的构建与运维。

模式

云原生模式强调开发与运维协作,提升对生产环境的理解和故障应对能力。架构师逐步摒弃单体应用,转向分布式组件,提升可扩展性和团队自主性。

随着系统分布式化,组件间通信失败成为常态,架构需兼顾可扩展性、可用性与性能。Netflix 等公司通过开源项目推动了云原生工具的发展。

可扩展性

软件开发需关注各层级的规模扩展。规模影响价值产出与风险,开发与运维间的信任缺失会加剧风险。为提升扩展能力,需采用更可靠的开发方法,强化团队协作与经验共享。

可靠性

团队间的期望构成服务合约。明确服务协议有助于降低风险,确保运维成本可控,提升整体可靠性。

敏捷性

敏捷不仅是管理方法,更是一种快速响应变化的价值观。企业通过持续部署和流程优化,加快软件交付速度,提升业务创新能力。

云技术为敏捷提供了基础。开发与运维可通过 Web 服务配置和管理虚拟化基础设施。Netflix 作为典型案例,成功实现了从数据中心到公有云的迁移。

Netflix 的故事

Netflix 作为全球领先的流媒体服务商,经历了从单体应用到云原生架构的转型。2008 年数据库故障促使其采用分布式 NoSQL 数据库(Apache Cassandra),并全面迁移至 AWS。

Netflix 云平台工程副总裁 Yury Izrailevsky 指出,云平台带来了百倍的扩展能力和显著的成本优势。通过编程式访问 AWS API,Netflix 实现了全球范围的弹性扩展和高可用性。

图 1-1 云计算栈
图 1-1 云计算栈

云计算的核心概念之一是基础架构即服务(IaaS),通过管理服务控制虚拟化资源。Netflix 的经验表明,云原生思想的本质在于承认服务能力变化的不可预测性,并通过弹性架构应对。

Izrailevsky 强调,云迁移让 Netflix 运维成本降低了 87%,系统可随业务发展弹性扩展。

微服务

本书多次提及微服务。微服务架构通过小型、分布式组件降低单点风险,提升团队自主性。虽然微服务并非新概念,但云环境的普及推动了其流行。

微服务模式强调模块化、简单性和松耦合。架构需适应变化,持续优化,避免历史包袱影响未来决策。云和微服务共同推动了架构变革,降低了基础设施管理成本,促进了创新。

拆分单体系统

Netflix 从单体 JVM 应用迁移到分布式架构,获得了灵活性和可靠性。单体架构虽然便于部署,但团队间协调成本高,影响迭代速度和系统可靠性。

拆分单体系统为小型服务后,团队可独立部署,降低故障影响范围。Netflix 还转向 DevOps 模式,每个团队拥有构建和运维的全权责任。

Netflix OSS

Netflix 积极参与开源社区,开源了 50 多个内部项目,形成 Netflix OSS 品牌。云平台工程总监 Ruslan Meshenberg 指出,Netflix 通过开源推动了平台组件和自动化工具的规模经济,与社区协作共建生态。

Netflix 和亚马逊等互联网公司通过云计算和开源,超越了传统科技巨头,推动了行业变革。

云原生 Java

Netflix 的云原生转型为行业提供了宝贵经验。本书将围绕以下两大主题展开:

  • 使用 Spring 和 Netflix OSS 构建弹性分布式系统
  • 持续交付与 Cloud Foundry 上的云原生应用运维

首先,需要理解本书所采用的术语和概念体系。

十二要素原则

十二要素原则由 Heroku 联合创始人 Adam Wiggins 提出,旨在指导现代云平台上的 SaaS 应用开发。其核心思想和约束如下。

核心思想
使用声明的方式自动化,降低新成员成本
与操作系统解耦,提升可移植性
适合现代云平台,无需服务器管理
持续部署,最小化开发与生产环境差异
支持水平扩展,无需大幅变更架构
表 1: 十二要素程序的核心思想
要素说明
代码库一份版本控制下的基准代码库,多份部署
依赖显式声明和隔离依赖关系
配置在环境中存储配置
后端服务把后端服务当作附加资源
构建,发布,运行严格分离构建和运行阶段
进程将应用程序作为一个或多个无状态进程执行
端口绑定通过端口绑定暴露服务
并发通过进程模型进行扩展
易处理快速启动和正常关机,提升健壮性
开发/生产环境一致保持各环境配置一致
日志将日志视为事件流
管理进程管理任务作为一次性进程运行
表 2: 十二要素程序的实践

本书将结合 Spring 项目,详细阐述如何通过十二要素方法论实现云原生开发。

代码库

应用应有独立的代码库,列出所有依赖资源。不同环境无需重新编译或打包,环境特有设置与代码解耦。

依赖

所有依赖需显式声明,避免依赖系统级包。依赖清单应详细列出每个引用。

图 1-2 构建一次源代码可部署到多个环境中
图 1-2 构建一次源代码可部署到多个环境中

配置

应用代码与配置严格分离,配置由环境管理。服务连接信息等应存储为环境变量,便于修改和迁移。

图 1-3 在外部存储环境中的特定配置
图 1-3 在外部存储环境中的特定配置

后端服务

后端服务包括数据库、API、SMTP 等,作为资源绑定到应用。应支持无代码改动切换服务实例。

构建、发布、运行

构建、发布、运行阶段严格分离。构建生成包,发布结合配置,运行在指定环境。变更需通过构建新版本或回滚实现。

进程

应用应为无状态架构,持久化依赖后端服务。所有资源均应外部化,避免本地状态依赖。

端口绑定

应用通过端口绑定对外提供服务,无需额外 Web 服务器。部署时由路由层转发请求。

并发

应用应支持进程或线程并发,便于水平扩展。无状态设计有助于多实例负载均衡。

易处理

应用应支持快速启动和优雅关机,提升弹性和可用性。启动时间短有助于应对流量波动。

开发/生产环境一致

应避免开发与生产环境差异,包括时间、人员和工具。保持一致性有助于减少意外问题。

日志

日志应作为事件流输出,由运行环境负责收集和归档。

管理进程

管理任务(如数据库迁移)应作为一次性进程运行,并纳入代码库,确保环境一致性。

总结

本章系统梳理了云原生应用程序的演进背景、平台承诺、关键模式与十二要素原则。通过亚马逊和 Netflix 的案例,展示了云原生理念如何驱动企业架构转型。后续章节将深入探讨基于 Spring 和 Cloud Foundry 的云原生 Java 实践。 Netflix 的架构在迁移到云原生架构之前,是一个单体的 Java 虚拟机(JVM)应用程序。虽然一个大的应用程序在部署上有许多优点,但主要的缺点是,开发团队之间由于需要协调互相的变更,而降低了产品整体的迭代速度。

文章导航

独立页面

这是书籍中的独立页面。

书籍首页

评论区