开源技术 * IBM 微讲堂:Kubeflow 系列(观看回放 | 下载讲义) 了解详情

在云中部署应用程序的最佳实践

作为一名开发人员,您可能听到许多关于新技术的消息,它们承诺会增加您开发软件的的速度,而且可以在部署应用程序之后增加它们的灵活性。您的挑战是在这些新兴技术中艰难前行,确定哪些技术实际履行了针对您目前从事的项目的承诺。

毫无疑问,正如您知道的那样,云计算为开发人员提供了巨大的希望。但是,您可能并不知道该技术在哪些领域可以为您和您的项目提供价值。您可能也不知道在云中实现某个项目时应该采用的最佳实践。本文将探讨各种类型的可用的云计算系统,并提供指导方针,帮助您在云基础架构之上实现应用程序部署。

在 IaaS、PaaS 和 SaaS 之间进行选择

当人们开始讨论云计算时,他们通常谈到三种可能的应用程序代码的部署选择:基础架构即服务 (IaaS)、平台即服务 (PaaS) 或软件即服务 (SaaS)。哪一种适合您的项目取决于您使用的代码库的特定需求。让我们来查看这些云选择中的每个选择。

基础架构即服务 (IaaS)

IaaS 是一个平台,该平台上有一个为您提供的基础架构。只需单击一个按钮,就可以在您选择的操作系统中启动由某个供应商托管的虚拟机。提供机器的供应商应该负责提供系统的连通性和初始配置,其余的一切由您负责。供应商提供了一台机器和一个操作系统,而您需要安装所有软件包、应用程序运行时/服务器,以及您的应用程序需要的数据库。通常,IaaS 要求您有一个由系统管理员组成的团队,负责管理系统和频繁地应用防火墙规则、补丁和安全勘误表。

赞成:您拥有系统的所有方面的完全控制权。

反对:您需要掌握系统管理知识,或者拥有一个由系统管理员组成的团队来维护系统,而您要对系统的正常运行和安全性负责。

平台即服务 (PaaS)

PaaS 是运行在 IaaS 之上的一个比较新的技术堆栈,是一些有创意的开发人员共同创建的。在 PaaS 平台中,提供了除应用程序代码、用户和数据以外的一切。通常,在使用 PaaS 时,供应商负责维护应用程序服务器、数据库和所有必要的操作系统组件,让您可以将时间集中在应用程序代码上。因为有供应商为您管理平台,所以通常很难打开不是专门为应用服务器、运行时或正在使用的数据库而调用的端口。PaaS 还提供了一些专用于应用程序的特性,其中包括根据用户对应用程序的需求来扩展应用程序层的能力。在大多数平台中,这种情况很少需要与开发人员互动。

赞成:PaaS 提供了一个积极管理的完善环境,让您能够专注于您的应用程序代码。

反对:开发人员通常被限制于系统上可用的软件包的某些主要/次要版本,以便供应商可以有效地管理平台。

软件即服务 (SaaS)

在 SaaS 平台上,为您提供了除用户和应用程序数据之外的一切。供应商提供了应用程序代码,开发人员的访问权限被限制于修改正在使用的软件。对于部署自定义应用程序,这通常不是一个好选择,因为供应商提供了整个软件栈。托管 Web 电子邮件客户端和托管销售自动化软件就是如何使用 SaaS 的两个很好的示例。

赞成:供应商提供了除应用程序用户和相关数据之外的整个堆栈。

反对:您对托管的应用程序只有有限的控制权,通常很难将外部工作流集成到系统中。

您会选择哪一个?

作为应用程序开发人员,您应该选择 PaaS,因为它为您管理了基础架构,这样您就可以专注于应用程序代码。

应用程序扩展

如前面所述,PaaS 提供了大多数语言和运行时的开箱即用扩展。然而,作为一名开发人员,您需要了解所提供的各种类型的扩展,以及何时适合使用水平扩展或垂直扩展。

垂直扩展

垂直扩展是指几十年来一直作为默认选择的一种扩展。这种类型的扩展是指用来处理负载的观念,您只需要使用更大的系统即可。这就是当今服务器提供数太字节的内存和大量 CPU 与核心为一个 Java® 应用程序提供服务的原因。通常,在使用垂直扩展时,会使用单个大型系统来处理来自用户的大多数或所有应用程序请求。

水平扩展

在使用水平扩展时,应用程序加载和请求被分布在一组更小的服务器上,这些服务器通常位于一个负载均衡器之后。当用户发出一个请求后,负载平衡器会将该请求发送给服务器,然后管理整个服务器集群中的会话状态。通常有两种类型的水平扩展,可以使用它们来确保提供您的应用程序、手动扩展和自动扩展的可能的最佳用户体验。

手动扩展

在使用手动缩放时,您需要指定:您希望应用程序进行扩展,以便在您知道某个会增加流量的事件即将到来时处理增加的流量。例如,如果您知道即将举办一个营销活动,以便吸引更多的用户到您的应用程序中来,那么您可能想要主动添加额外的服务器集群。大多数 PaaS 提供商都允许您用一个简单的命令来完成这项任务。

自动扩展

在使用自动扩展时,您需要指定一些条件,您的应用程序会在没有任何人工交互的情况下自动扩展。这种情况可能基于您的应用程序将要接收的并发 HTTP 请求的数量,或者基于您的应用程序的 CPU 使用率。这使得开发人员能够在应用程序需求很大的时候,自动将新的服务器添加到负载平衡器。自动扩展提供了一个真正的不干预方法,同时还能确保及时满足用户的需求。当您由于某些原因需要计划外地使用您的应用程序时,自动扩展非常重要,比如让您的移动应用程序短时间内出现在应用商店里,而您的后端服务却驻留在云中。

您应该选择哪种应用程序扩展?

作为开发人员,您应该选择一个允许您的应用程序同时进行手动扩展和自动水平扩展的平台。

应用程序状态

大多数云提供商提供了一个 PaaS,希望您开始进行全新开发,也就是说,这些项目不受之前工作的约束的影响。将现有或遗留应用程序移植到该平台可能是一个挑战,主要因为文件系统实际上是短暂的,不允许将应用程序状态或资源保存在文件系统上。这个限制就是您可能听说考虑让将来的应用程序成为无状态应用程序的原因。要从驻留在云中的基础架构中获得好处,您需要在您的项目中使用无状态应用程序设计。为达到这一目的,请考虑对新的应用程序采用以下实践:

  • 允许应用程序服务器或容器跨集群维护用户的会话状态,而不是依赖于文件系统。
  • 不要在您的代码所部署到的服务器的物理文件系统上存储文件或用户资产。相反,可以考虑使用一个基于云的存储服务,通过为了存储服务而提供的 REST API 来交付资产。
  • 使用一个数据库来存储与用户相关的资产(如果您无法使用云存储 API)。

您应该选择哪种应用程序状态?

对于全新应用程序,您应该设计无状态的应用程序,这意味着它们不会在文件系统上存储用户资产或资源。对于遗留或现有应用程序,可以选择一个既支持有状态应用程序又支持无状态应用程序的 PaaS 提供商。

针对支持云的应用程序的数据库

几乎目前创建的所有应用程序都依赖于后端上某种类型的数据库,用该数据库来存储和检索将要呈现给用户的信息。在针对云开发应用程序时,还必须考虑您将要使用哪些数据库,以及这些数据库应该位于何处。数据库应该与应用程序位于同一台服务器上,还是应该位于单独的服务器或容器上?

在许多情况下,应用程序依赖于存储在位于企业防火墙后的某个数据库中的信息,而同时,应用程序前端被部署在公共云上。在这种情况下,您有两种选择来有效地获取您需要的信息,您需要将这些信息呈现给位于前端的用户。

选项 1: 选择一个允许您打开一个远程 VPC 来连接回您的数据库的供应商。

选项 2:通过一组经过身份验证的 REST 服务与数据库进行通信,这些服务被部署在有权访问数据的基础架构上。

在从外部云应用程序连接到企业防火墙后的某个数据库时,这两个选项都有您需要考虑的固有安全风险。在这种情况下,您最好的选择是选择一个允许您将应用程序部署到非多租户环境的云 PaaS 供应商。

如果您的应用程序代码不需要连接到某个现有的企业数据库,那么您拥有的选项的数量几乎是无限的。建议您将数据库部署在与您的应用程序代码相同的地理/数据中心/地区,但将它们部署在与您的前端应用程序代码不同的容器或服务器上。使用这个选项来独立于 Web 层扩展数据库。此外,确保您选择了一个能够快速轻松地实现扩展的数据库,不管它是一个 SQL 数据库还是一个 NOSQL 数据库。

考虑多个地区

云计算的好处之一是:您可以在世界各地部署应用程序基础架构,只需很少或无需前期成本。例如,部署一个在北美和欧洲都有服务器的应用程序,传统上讲,这会产生大量的前期投入成本,用于购买和提供硬件与数据中心。利用位于云中的基础架构,您可以毫不费力地在供应商支持的尽可能多的地区部署应用程序。对于只有有限数量的用户的简单应用程序,没有必要这样做。然而,能够在多个地区部署代码对赢得客户满意至关重要(通过定位尽可能接近您的目标受众的应用程序代码)。

借助跨不同地区的手动或自动扩展应用程序的能力,通过提供比传统 IT 基础架构部署更低的成本,您会有一个非常有趣的价值主张。

您应该为多个地理区域选择哪个云提供商?

选择一个云提供商,该提供商支持您跨世界各地的多个地区部署和扩展应用程序基础架构,以确保您的受众在使用您的应用程序时有一个快速响应体验。

创建并使用基于 REST 的 Web 服务

如您所见,在云中部署您的应用程序代码提供了许多好处,对于高需求应用程序,一个重要好处是:能够单独向外扩展 Web 层和数据库层。也就是说,将您的业务逻辑分离成前端代码可以使用的 Web 服务也是一个良好实践。可以使用这种做法单独从数据库和前端代码向外扩展 Web 服务层。将您的应用程序逻辑从表示层分离打开了您过去可能没有考虑过的新的技术之门,比如使用类似 Node 的语言创建一个单页面应用程序。

持续交付和集成

DevOps 似乎是最新的流行词,赢得了企业的大量注意力。要获得成功,您应该在您的下一个软件项目中开始查看和实现持续集成与交付。在将应用程序部署到某个基于云的基础架构时,确保您在现有构建系统上设置好了适当的工作流程,以便在不同的环境中部署代码。幸运的是,大多数比较流行的构建系统都为一些顶级云提供商提供了一些插件,以便根据有权访问每个环境的部署代码的人的正确权限,轻松地配置您的部署规则。如果您目前没有对您的开发团队正确使用构建系统,那么您应该立刻开始使用一个这样的构建系统!

您应该选择哪个云提供商进行持续集成和交付?

选择一个能够满足上述所有需求的云提供商,而且该提供商还在平台上提供了集成的持续集成/持续交付 (CI/CD) 工具的附加特性。您选择的供应商应该允许您部署自己的构建系统,或者能够轻松地与位于云平台之外的现有系统进行集成。

避免厂商锁定

如果您能从本文中学习到什么,我希望是:虽然许多云提供商提供美观的专有 API 来减少您必须处理的代码量或工作量,您应该不惜一切代价避免使用它们。这只不过是厂商让您锁定他们的生态系统的一个简单策略,让您很难将应用程序移动到另一个提供商,或者让您很难在自己的数据中心内部运行应用程序。为了避免这些自定义的 API,您应该坚持在您的应用程序中使用可靠的技术堆栈,包括数据库层、存储层和您可能想要创建的所有微服务端点。虽然前期投资可能比使用专有解决方案的费用稍微高一点,但您的不达标技术大大减少了,这可以长期节省您的金钱和时间。

本地开发或在云中开发

作为开发人员,我们经常在我们的本地系统上对应用程序进行编码,然后,当到达某个里程碑时,我们的代码就会移动到团队的开发环境中。大多数开发人员希望能够每天在某个尽可能地接近生产环境的基础架构中开发应用程序。通常,由于为每个开发人员提供一组机器而产生的系统管理开销可能会带来一些挑战。现在,因为提供了 PaaS,每个开发人员都可以开始在云中开发和部署他们自己的代码。大多数集成开发环境 (IDE) 都提供了一些插件来简化这个过程,让这种开发尽可能地接近本地开发。

您会选择哪一个 IDE?

选择一个为您选择的云提供商提供了一个插件的 IDE。考虑选择一个能够热部署应用程序和支持远程调试您的源代码的供应商。一旦选定了能够提供这二者的提供商,您就可以继续在 IDE 内部设置断点和单步调试代码,就像您在本地执行部署一样。这使您能够更快地捕捉在您移动到集群环境中后出现的 bug。

希望未来几年从云提供商那里获得什么?

本文重点介绍了被部署到云中的应用程序的当前状态。今年和明年可以期待并考虑的一件事是:大型行业向基于容器的部署的迁移,您可能已经听说过 Docker 和火箭容器(rocket container)。在选择云提供商时,确保应用程序迁移到基于容器的部署的路线图在时间表上是明确的,明确地定义了您的迁移路径。此外,还要留意以下供应商:他们坚持使用围绕容器和编排的行业标准解决方案,并创建专有的解决方案。

结束语

云计算有很多好处,您应该在日常软件开发和部署中充分利用这些好处,让软件变得更稳定、更具扩展性、更安全。在将应用程序迁移到云中时,应该考虑以下几点:

  1. 对于应用程序开发,可以选择 PaaS;基础架构是由一个能够让您将更多的时间集中于您的应用程序代码的供应商进行管理。
  2. 对于应用程序开发,可以选择一个支持应用程序的手动和自动水平扩展的平台。
  3. 对于全新的应用程序,可以设计无状态的应用程序。
  4. 对于遗留或现有应用程序,可以选择一个支持有状态和无状态应用程序的 PaaS 提供商。
  5. 选择一个可扩展的数据库,该数据库位于独立于您的应用程序代码的服务器/容器上,这样您就可以独立扩展数据库。
  6. 选择一个支持您在全世界的多个地区部署和扩展您的应用程序基础架构的云提供商。
  7. 使用基于 REST 的 Web 服务进行开发。
  8. 选择一个能够满足上述所有需求的云提供商,而且还向平台添加了集成 CI/CD 工具的附加特性。
  9. 避免厂商锁定。

本文翻译自:Best practices for deploying your apps in the cloud(2018-08-13)