6云原生应用程序设计原则
云原生意味着什么?回答这个问题的最佳方法之一是考虑如何设计云原生应用程序。
在某种程度上,这是一个模棱两可的话题。没有特定类型的应用程序设计模式,编码语言或托管基础设施,您必须使用您的应用程序是云原生的。云原生应用程序有多种形式和大小。
也就是说,大多数云原生应用程序共享某些设计原则或遵循某些模式。在构建应用程序时,无论您是否选择遵循每个云原生设计概念,您至少应该了解云原生开发的方法以及如何利用它们。
为了提供指导,本文介绍了六个关键的云原生应用程序设计原则,并解释了如何实现每一个原则。同样,您的里程可能有所不同,因为有许多方法可以“做”云原生。但总的来说,如果您以云原生的方式思考并接受云原生DevOps,您将使用这些原则作为应用程序设计指南。
# 1。松散耦合体系结构
云原生开发的一个关键特征是使用松散耦合的体系结构。松耦合体系结构是一种应用程序设计策略,在这种策略中,应用程序的各个部分是相互独立地开发、部署和操作的。
松耦合架构对于云原生计算和DevOps非常重要,原因如下:
- 简单性:通过将复杂的应用程序分解成更小的、独立的部分,开发人员可以简化整个应用程序开发生命周期的管理,从源代码到运行时。
- 可伸缩性:扩展应用程序的各个部分比扩展大型的整体应用程序更快、更容易。
- 弹性:在松散耦合体系结构中,一个应用程序组件的故障通常不会导致整个应用程序崩溃。这意味着松散耦合的体系结构增加了弹性和可靠性。
- 更新:类似地,松耦合架构使得更新应用程序功能变得更容易,因为DevOps团队可以只更新应用程序中需要更改的部分,而不必重新部署整个应用程序的新版本。
实现松散耦合体系结构没有特定的公式。然而,最常见的方法可能是将应用程序分解为一组微服务,每个微服务负责处理不同类型的功能。例如,在购物车应用程序中,一个微服务可能允许客户向购物车中添加商品,而第二个微服务允许他们删除商品,第三个微服务跟踪购物车中商品的总价值。然后可以将每个微服务部署到单独的容器中。
来源://m.si-fil.com/knowledge-base/the-basics-the-role-of-containers-in-your-microservice-architecture/
为了确保您的应用程序体系结构是松散耦合的,避免在每个部分之间创建“紧密”依赖关系是至关重要的。例如,你通常不希望两个微服务依赖于同一个数据库,甚至是同一组集成测试。如果你这样做了,你就失去了独立操作和更新每个微服务的能力。
# 2。api的设计
api优先设计的原则是,当您开发应用程序时,api被视为“一等公民”。不是先编写应用程序源代码,然后再实现API,而是先设计API,然后基于它们创建源代码。
对于云原生应用程序,api优先的设计方法是确保应用程序可以通过api与其他应用程序无缝集成的明显方法。此外,api优先设计可以帮助您使用在开始开发应用程序的同时创建的内部api创建松散耦合的体系结构。
因为api有很多种类型,应用程序与api交互的方式也有很多种,所以没有硬性的规则来实现api优先的设计原则。最重要的是确保在开发过程的早期考虑api将如何工作。在更新应用程序时,还应该将API功能考虑到随后做出的每个决策中。API测试也应该是更广泛的应用程序测试过程的一部分。
# 3。可伸缩状态管理
传统应用程序通常通过将数据存储在托管它们的服务器的内存和/或文件系统中来管理状态(即它们需要操作的数据)。
来源://m.si-fil.com/blog/manage-docker-volumes/
然而,对于云原生应用程序,开发人员通常对管理应用程序状态的方式更加熟悉。在某些情况下,他们可能会选择设计“无状态”的应用程序,这意味着应用程序本身根本不直接存储任何数据。相反,应用程序可以使用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等开发人员友好的标准化框架公开遥测数据的能力也是云原生应用程序的一个常见特性。
