6云原生应用程序设计原则
云原生意味着什么?回答这个问题的最佳方法之一是考虑如何设计云原生应用程序。
在某种程度上,这是一个模棱两可的话题。没有特定类型的应用程序设计模式、编码语言或托管基础设施是您必须使用的,以使您的应用程序成为云原生的。云原生应用有多种形式和大小。
也就是说,大多数云原生应用共享某些设计原则或遵循某些模式。在构建应用程序时,无论您是否选择遵循每个云原生设计概念,您至少应该了解云原生开发的方法以及如何利用它们。

为了提供指导,本文将介绍六个关键的云原生应用程序设计原则,并解释如何对每个原则进行操作。同样,您的情况可能会有所不同,因为有许多方法可以“实现”云原生。但总的来说,如果你以云原生的方式思考并拥抱云原生DevOps,您将使用这些原则作为应用程序设计的指导。
1.松耦合体系结构
云原生开发的一个关键特征是使用松耦合架构。松耦合体系结构是一种应用程序设计策略,其中应用程序的各个部分是相互独立地开发、部署和操作的。
松耦合架构对云原生计算和DevOps很重要,原因如下:
- 简单性:通过将复杂的应用程序分解成更小的、独立的部分,开发人员可以简化整个应用程序开发生命周期的管理,从源代码到运行时。
- 可伸缩性:扩展应用程序的单个部分比扩展大型单片应用程序更快、更容易。
- 弹性:在松耦合体系结构中,一个应用程序组件的故障通常不会导致整个应用程序崩溃。这意味着松散耦合的体系结构增加了弹性和可靠性。
- 更新:类似地,松耦合架构使得更新应用程序功能更容易,因为DevOps团队可以只更新应用程序中需要更改的部分,而不必重新部署整个应用程序的新版本。
对于实现松耦合体系结构,没有特定的公式可以遵循。然而,最常见的方法可能是将应用程序分解为一组微服务,每个微服务负责处理不同类型的功能。例如,在购物车应用程序中,一个微服务可能允许客户向购物车中添加商品,而第二个微服务允许他们删除商品,第三个微服务跟踪购物车中商品的总价值。然后,您可以在单独的容器中部署每个微服务。
为了确保您的应用程序体系结构是松散耦合的,避免在每个部分之间创建“紧密”依赖关系是至关重要的。例如,您通常不希望两个微服务依赖于相同的数据库,甚至是相同的集成测试集。如果这样做,您将失去独立于其他微服务操作和更新每个微服务的能力。
2.api的设计
api优先设计是指在开发应用程序时将api视为“一等公民”的原则。您不是先编写应用程序源代码,然后再实现API,而是先设计API,然后基于它们创建源代码。
对于云原生应用程序,api优先的设计方法是确保应用程序可以通过api与其他应用程序无缝集成的明显方法。此外,api优先的设计可以帮助您使用在开始开发应用程序的同时创建的内部api创建松散耦合的体系结构。
由于存在许多类型的api,以及应用程序可以与api交互的许多方式,因此对于如何实现api优先的设计原则,没有硬性规则。最重要的是确保在开发过程的早期考虑api的工作方式。在更新应用程序时,还应该将API功能考虑到随后做出的每个决策中。API测试也应该是更广泛的应用程序测试过程的重要组成部分。
3.可扩展状态管理
传统应用程序通常通过将数据存储在承载它们的服务器的内存和/或文件系统中来管理状态(即它们需要操作的数据)。
然而,对于云原生应用程序,开发人员通常更了解管理应用程序状态的方式。在某些情况下,他们可能会选择设计“无状态”的应用程序,这意味着应用程序本身根本不直接存储任何数据。相反,应用程序可以使用api来管理对它们需要操作的数据的访问。
其他云原生应用程序可能是有状态的,这意味着它们持久化地存储数据。然而,有状态的云原生应用程序通常不依赖于本地文件系统来存放这些数据。相反,它们可能会通过api连接到基于云的对象存储系统(如AWS S3)来存储数据。或者,它们可以使用跨集群共享的存储资源,比如Kuber2022世界杯阿根廷预选赛赛程netes PersistentVolumes。这种方法的优点是存储更具可伸缩性。您的应用程序不受限于本地服务器的存储容量。
这意味着,当你设计一款云原生应用时,你应该回答以下问题:
- 我的应用程序需要状态管理吗?如果您可以使应用程序无状态,则可以简化开发过程,同时还可以减少与数据安全性、备份和存储成本相关的潜在问题。
- 我应该如何管理应用程序状态?如果您只需要测试应用程序,那么将数据存储在本地文件系统中可能是有意义的,但是对于交付到生产环境的有状态云原生应用程序,您通常需要更复杂和可扩展的存储解决方案(如共享集群存储)。
4.独立于环境执行
云原生计算背后的原则之一是应用程序应该具有在任何地方运行的灵活性。换句话说,您应该能够将云原生应用程序部署到任何公共云或任何类型的操作系统上——至少在合理的范围内。
要做到这一点,就需要在设计应用程序时保证独立于环境的执行。一个可以在任何环境中执行的应用程序,不需要绑定到特定的托管平台或配置类型才能运行。
实现与环境无关的执行的一种方法是使用容器。由于容器化应用程序的大多数环境配置都存在于容器本身中,因此无论在何处部署应用程序,应用程序都将以相同的方式工作。例如,在Dockerfile中考虑如下一行:
任何基于Dockerfile运行的容器都可以在Ubuntu 18.04上运行应用程序,因为这是Dockerfile中指定的基本映像。即使在Fedora或Red Hat Enterprise Linux主机上部署容器也是如此。
无服务器功能还允许您创建独立于环境的应用程序。使用无服务器函数,您只需编写代码,然后将其上传到无服务器计算环境,例如AWS Lambda。代码将根据您定义的触发器执行。无需配置主机操作系统。
值得注意的是,在设计与环境无关的应用程序时,通常会遇到一些限制。其一是不能在Windows主机上运行基于linux的容器,反之亦然。另一个问题是,大多数无服务器计算平台只支持特定类型的编程语言,因此它们不允许您在任何类型的环境中执行任何类型的应用程序。
然而,一般来说,设计良好的云原生应用程序将比绑定到特定操作系统的传统应用程序支持更灵活的部署环境范围。
5.Cloud-agnostic设计
类似地,云原生开发人员通常将他们的应用程序设计为与云无关的,这意味着应用程序可以在任何公共云中运行——或者,就这一点而言,任何私有云或混合云——在一个环境和另一个环境之间移动时,只需要很少的重新配置。
实现这一目标的最佳方法是避免使用与特定云平台绑定的开发和部署工具。虽然特定于供应商的开发工具(如AWS Elastic Beanstalk和Azure App Service)在您完全致力于特定公共云的情况下很有用,但通常坚持使用可以在任何云上工作的第三方软件交付工具是最佳实践。
云原生开发人员也应该考虑如何打包应用程序。容器化的应用程序可以在任何云中运行,甚至可以在任何有Docker或Kubernetes的本地环境中运行。另一方面,直接在主机服务器上执行的应用程序二进制文件可能只适用于特定的操作系统或特定的环境配置,这意味着如果您希望在一个云平台和另一个云平台之间移动,则必须进行一些调整。
6.基于标准的遥测
简化云原生计算的另一种方法是设计使用标准化遥测框架的应用程序。
遥测是应用程序中的资源,它可以从应2022世界杯阿根廷预选赛赛程用程序中收集指标、日志和跟踪等数据,以跟踪其健康状况并解决性能问题或错误。
在过去,应用程序通常要么使用开发人员在逐个应用程序的基础上实现的自定义遥测逻辑公开遥测数据,要么向操作系统公开度量,以便应用程序外部的代理可以收集有关它的监视数据。前一种方法需要大量的开发工作。后者通常限制了可以收集的数据量。
如今,云原生开发人员通过使用OpenTelemetry等框架解决了这些挑战。OpenTelemetry是一个社区开发的工具集,开发人员可以将其集成到应用程序中以公开遥测数据。由于OpenTelemetry基于社区接受的标准运行,任何支持OpenTelemetry的监控工具都可以轻松地从使用OpenTelemetry的任何应用程序收集数据。OpenTelemetry还提供了自动配置应用程序以公开丰富的遥测数据的好处,而不需要开发人员自己编写自定义的遥测代码。
因此,通过在云原生应用中使用基于标准的遥测框架(如OpenTelemetry),您可以获得两全其利:一方面是深度可观察性,另一方面是低遥测开发工作量。
同样,设计云原生应用程序没有通用的规则集。但是大多数云原生应用程序都是围绕松散耦合架构、API优先设计、状态管理的智能方法以及尽可能与环境无关的原则来设计的。使用开发人员友好的标准化框架(如OpenTelemetry)公开遥测数据的能力也是云原生应用程序的一个常见特性。