65.9K
CodeProject 正在变化。 阅读更多。
Home

云原生入门

starIconstarIconstarIconstarIconstarIcon

5.00/5 (11投票s)

2021 年 4 月 8 日

CPOL

8分钟阅读

viewsIcon

9759

本文将面向目前主要使用 Express 创建应用并将其部署到云虚拟机上的 Node.js Web 开发者,进行一次入门介绍。

Node.js 的一个主要优势是其相对较低的入门门槛。初学者和经验丰富的程序员都可以使用 Node.js 快速编写小型 Web 服务。

初创公司尤其迅速地注意到了 Node.js 的吸引力,并将其迅速应用于日常任务。然而,它也在大型企业(如银行)中获得了早期青睐,通常是在负责现代化公司软件方法的数字创新团队中。

Node.js 如今已成为一股不可忽视的力量,其项目在规模和范围上都取得了显著增长。那种一度流行的、随意编写服务并将其部署到虚拟机(VM)的“狂野西部”式的做法已经过时。随着公司寻求更成熟的部署模式,云原生方法很可能正是他们所追求的——原因与 Node.js 最初如此受欢迎的原因有很多相似之处。

云与云原生

并非所有在云上运行的东西都是云原生的。从宏观层面来看,云原生意味着您的云服务提供商负责所有硬件和机器维护,而您无需操心。在实践中,这意味着您的应用程序具有高度的可伸缩性和动态性。

云方法

您在云上运行软件,但您不是云原生的。租用云服务器与拥有自己的服务器差别不大。

例如,在启动虚拟机并部署应用程序时,您仍然需要选择具有足够磁盘空间、内存和处理器速度的虚拟机来支持您的工作负载。此外,您还需要负责保持您的操作系统(OS)以及您安装的任何其他软件的更新。

安装您的应用程序可能需要您安装和配置 Web 服务。扩展是一个挑战,因为它迫使您准备好第二台虚拟机来分担一些工作负载,这需要一个路由均衡器和其他工具。这主要是人工工作,通常由专业的系统管理员执行。

云原生方法

现在考虑云原生。您选择您的云服务,启动它,它就可用了。例如,一个 Web 应用程序,如 Node.js,可以是 Azure 上的一个 App Service。您只需选择您的计划,这类似于选择虚拟机的硬件,但稍简单一些,并且允许您以后进行更改。然后,您部署您的应用程序,这可能就像上传一个包一样简单。之后,它就会运行。当您的应用程序很忙时,您可以通过实际按一下按钮来纵向扩展。更好的是,您可以设置阈值,让 Azure 自动为您纵向和横向扩展应用程序。

您可能还需要一个数据库。有几种云原生数据库选项,如 Azure SQL 和 Cosmos DB。Cosmos DB 很有趣,因为它完全拥抱云并且具有高度的可伸缩性。最棒的部分是:它有一个 MongoDB 接口,所以它很可能已经可以与您的 MEAN 堆栈应用程序一起使用。您只需点击几下即可启动并运行一个 MongoDB 实例。

使用云原生,设置一些基础设施并托管您的应用程序就像在 Node.js 中构建一个服务一样容易。两者相辅相成,Node.js 在许多 Azure 服务上运行。

自动化之力

云原生的一个很酷的特性是它易于完全自动化。您的云资源可以通过 Azure 资源管理器模板(或 ARM 模板)创建和配置,这是一个描述您所需服务或服务的 JSON 文件。另一种选择是 PowerShell 或批处理脚本,或者在 Linux 上运行 PowerShell Core 或 shell 脚本。

通过自动化您的基础设施发布,您可以轻松地启动新环境并将发布交付给软件团队。这降低了部署错误的风险,同时加快了部署速度。自动化允许采用 DevOps 团队:开发和运营相结合,以实现发布稳定软件的共同目标。

进入 DevOps

DevOps 和云原生结合得很好。DevOps 团队致力于缩短开发周期并实践持续发布和部署。也就是说,一旦您将代码提交到您的代码存储库(通常是 Git),它就会自动构建和测试(也称为持续集成,或 CI),然后部署到各种环境(持续部署,或 CD)。总而言之,这种自动化的构建、测试和部署就是 CI/CD。

在过去,运维团队会拿到一个软件包并将其安装在服务器上,甚至可能从未见过开发人员。在 DevOps 团队中,运维人员与开发人员合作,确保环境满足软件运行所需的所有条件。

Azure DevOps 服务 可帮助 DevOps 团队实施敏捷或 Scrum 方法以及 CI/CD。

微服务的模块化和可伸缩性

许多应用程序,尤其是旧应用程序,曾经被编写成一个巨大的包,也称为单体。如果该包中的某个组件出现故障,整个应用程序都会中断,并且整个应用程序都将不可用。

这并不总是有意义的。例如,如果销售模块出现故障,并没有理由阻止帮助台员工查阅客户信息。在单体应用中,扩展是一个挑战,因为您必须扩展所有内容或不扩展任何内容。

随着云原生和 DevOps 的兴起,部署应用程序变得更加容易,以至于所有东西都可以完全自动化运行。这提供了新的可能性,例如微服务。通过微服务,您不是编写和部署一个巨大的应用程序,而是编写和部署几个较小的、松散耦合的应用程序,它们协同工作。然后,如果一个应用程序发生故障,系统的其他部分仍然可以正常运行。

微服务能够实现扩展,因为更容易扩展系统的各个部分。此外,维护几个小型应用程序通常比维护一个巨大的应用程序更容易,因为后者可能要复杂得多。另外,如果您愿意,您可以使用不同的语言来编写程序的各个部分。

Azure 的各种服务运行微服务,并且所有这些服务都完全支持 Node.js。

使用 Docker 和 Kubernetes 进行容器化

虽然微服务确实解决了一些传统软件开发带来的挑战,但它们也带来了一些新挑战。运行和部署数十甚至数百个服务并不容易,特别是当这些服务具有各种依赖项或使用不同语言编写时。容器化旨在解决这个问题,而迄今为止最受欢迎的容器解决方案是 Docker。

容器最好被描述为轻量级虚拟机,尽管它在技术上不是虚拟机。容器运行在主机上,并且与虚拟机不同,它利用主机的操作系统。然而,容器就像一个沙盒,因为它几乎完全与系统的其余部分隔离开来。一个容器可以包含运行您的应用程序所需的特定语言的特定运行时的一个特定版本。运行在同一主机上的另一个容器可能具有相同的语言,但版本不同。一个容器可以打包运行您的应用程序所需的所有依赖项。这使您能够在一个完全定制的容器中运行您的软件,然后只需将容器分发给任何人运行。

下一个挑战是微服务之间的依赖关系以及确保它们保持运行。这就是我们拥有容器编排器的原因。迄今为止最受欢迎的是 Kubernetes,它与 Docker 配合得非常好。使用编排器,您可以描述哪些服务应该运行在哪里,需要多少实例,何时需要扩展等等——基本上,您的环境应该如何运行。

Azure 提供了针对 Docker 和 Kubernetes 的云原生解决方案。

无服务器

接下来是无服务器(serverless),它将云原生的概念推向了更远的阶段。无服务器这个名字有点误导,因为您的应用程序仍然在服务器上运行。然而,无服务器与常规服务之间的主要区别在于,使用无服务器时,当您的应用程序不运行时,您既不占用服务器,也不为其付费。

最明显的无服务器资源示例是 Azure Function。这是一个代码片段,一个实际的函数,由各种方式触发,例如,由 HTTP 请求触发。每当函数被触发时,它就会将您的代码放在服务器上,启动服务器,运行代码,并在空闲几秒钟后关闭。

触发器包括 Service Bus、Cosmos DB、Blob 存储、计时器以及前面提到的 HTTP 触发器。由于您的代码没有持续运行,甚至没有安装在服务器上,所以启动时间会影响性能。然而,由于运行代码实例如此容易,因此也很容易扩展到额外的实例。使用 Functions,您可以同时运行数百个代码实例!

不幸的是,Functions 有一些限制,例如它们可以运行的时间长度、相对较长的启动时间,以及您的环境在几分钟后就会消失,这使得在应用程序中保留任何状态变得困难。然而,对于某些工作负载,Functions 可以提供出色的结果。

后续步骤

Azure 非常适合现代 Node.js 开发。尽管 Azure 以提供出色的 .NET 开发人员体验而闻名,但它也为 JavaScript 和 TypeScript 开发人员提供了出色的工具。

云原生拥抱了使 Node.js 最初如此受欢迎的快速性和易用性,同时提供了现代软件开发的工具。通过云原生,您可以保持 Node.js 的速度和灵活性,同时放弃随意式的开发和部署风格,构建更好、更可靠的软件。

本云原生系列文章的下一篇 中,我们将使用 Azure DevOps 和 TypeScript 部署我们自己的 Azure Function。

© . All rights reserved.