构建弹性、可扩展的云原生应用程序
云原生应用设计使软件工程师能够专注于满足客户需求,这是一种解决方案,可以在使用案例层面上利用。
在1986年,我搬到科罗拉多州博尔德市去为我叔叔的初创公司工作。第一天到达办公室时,他帮我找了一张附有 Compaq Portable 计算机的桌子。系统顶部放着一本关于使用 dBase II 的书。我的任务是为他的公司建立一个跟踪订单的应用程序。我叔叔知道我对计算机很感兴趣,我迫不及待地想要开始工作。这成为我学习微型计算机时代应用程序构建的第一次经历。流程非常简单:
记录所需的需求。
创建满足定义需求的设计。
构建和调试解决方案。
验证解决方案是否按预期工作。
找出如何分发解决方案。
要求客户采用并使用解决方案。
尽管我们目前在Web2和Web3世界中构建应用程序和服务,但我通常将这个时代称为“无 Web”应用程序设计时代。
几年后,我记得在软盘上分发基于 Turbo Pascal 的应用程序,供分布在美国各地的保险代理使用。后来,应用程序存储在放置在企业数据中心的文件服务器上。Web1 迭代还要几年才出现。
2023年容器技术趋势展望
DZone 的 2023 年容器技术趋势报告将探讨容器的当前状态、全球容器化战略的关键趋势和进展,以及现代化软件架构的建设性内容。
尽管大多数应用程序开发生命周期步骤并没有真正改变,但云服务提供商带来了一些重要的因素:
采用集中化方法。
提高可伸缩性。
应用程序和服务的弹性。
所有这些方面都是云原生应用的优势所在。
什么是云原生?
维基百科定义云原生计算为使用云服务“在公有云、私有云和混合云等现代动态环境中构建和运行可扩展的应用程序”。随着公司和初创企业渴望摆脱维护数据中心的业务,转向云端成为首要任务。
云原生应用不仅仅是在云中运行的应用程序。一个关键区别是应用程序如何设计成在云中本地运行。采用容器、无服务器和微服务的方式提供了易于从一个环境部署到另一个环境的解决方案,同时提供了横向扩展和多区域支持。
由于硬件层与代码库分离,云原生应用可以轻松实现纵向扩展。
云原生方法
采用云原生方法使软件工程师能够将应用程序拆分为多个方面,并使用通用方法来处理每个方面:
无服务器——将基于事件驱动的请求转移到函数式 Lambda 中进行处理。
微服务——将大型应用程序拆分为较小的处理单元。
容器——将应用程序打包成独立的多层容器以进行分发。
对于每个方面,云服务提供商提供可增强体验的附加组件。一些常见的示例包括:
API 网关——为服务提供保护,并处理常见组件(如授权请求)。
自动扩展——根据预配置的阈值进行扩展和收缩。
缓存——将请求的信息存储在基于内存的缓存中,以避免较长时间运行的应用程序请求。
故障转移——自动将流量路由到用于处理的次要节点。
文件存储——无限可扩展且性能卓越的对象存储。
负载均衡——将请求分发到位于不同地理位置的实例。
编排——容器解决方案在大规模上自动化、扩展和管理。
持久化——使用基于 SQL 和 NoSQL 的数据存储选项。
机密管理——避免高度敏感信息的泄露。
由于云原生方法可以在最小粒度上进行架构,因此得到的云原生应用可以针对设计的每个方面提供最佳解决方案,如图3所示:
云原生应用由多个云服务功能构建
云原生的好处
云原生应用构建方法使软件工程师能够根据用例级别使用最佳技术来构建解决方案,以满足客户的业务需求。这意味着一个用例可以采用基于事件驱动的无服务器解决方案,而另一个用例可以利用由 SaaS 驱动的持久性层支持的微服务。
云原生应用允许按需调整应用程序的组件。这意味着对一个微服务的需求不需要为其他微服务分配相同水平的资源。此外,组件实例可以在相同或不同地理区域水平扩展。
由于硬件层与应用程序层分离,设计云原生应用的人可以专注于满足业务需求和企业目标。
与设计在本地数据中心运行的应用程序相比,这些优点为云原生应用提供了强大的优势。当考虑到备份计划或灾难恢复等概念时,差异只会变得更大。
云原生的挑战
尽管云原生计算看起来是应用程序设计的天堂,但也存在一些需要考虑的挑战。对于云原生计算的主要批评是潜在的高成本问题。
一些常见例子包括:
无法清除的原型组件。
自动创建快照而没有建立保留计划。
在存在更便宜选择的情况下过度分配硬件资源。
大多数云服务提供商都提供了出色的工具来预测和分析成本,但必须广泛采用标准才能使成本控制成为优先事项。在全球多个地区工作时,了解现有的法规非常重要,特别是涉及敏感数据。未能遵守可能会导致处罚或费用。
云提供商提供了多区域故障和灾难恢复保护的能力。然而,这些高级概念在设计和实施上可能具有挑战性,既要实现自动的故障处理,又要保护免受意外数据问题的影响。
结论
作为软件工程师,我们在应用程序设计方面已经取得了长足的进步。然而,对我来说,唯一没有改变的方面就是当我有机会设计和构建一个新的应用程序时,我仍然感到非常兴奋。
我一直专注于以下使命宣言,我认为适用于任何 IT 专业人员:
将时间集中在提供能够扩展你的知识产权价值的功能/特性上。利用框架、产品和服务处理其他事项。
云原生应用设计完全符合我的个人使命宣言,因为它使软件工程师能够专注于满足客户的业务需求:允许在每个用例级别使用最佳解决方案。然而,就像我们在生活中做出的每个决策一样,我们必须始终注意相关成本。