在AWS、Azure和Google Cloud上了解无服务器计算

在AWS、Azure和Google Cloud上了解无服务器计算

了解云部署情况并选择最适合您的应用程序、团队和业务的最佳选择。

原文链接:https://www.ml4devs.com/articles/serverless-architecture-for-microservices-on-aws-vs-google-cloud-vs-azure-as-iaas-caas-paas-faas/

📅 2022年8月2日 · ☕ 11分钟阅读

#云#无服务器#微服务

亚马逊在2006年推出了其第一个AWS服务:存储的S3和计算的EC2。现在,像AWS、Azure和Google Cloud等各种云供应商提供了大量的服务和选择。评估这么多选项并选择合适的选项可能会让人感到不知所措。

选择合适的基础设施方案不仅涉及到您的应用程序的技术要求,还涉及到您团队的专业知识和您业务的增长阶段。

在本文中,您将了解今天可用的云部署选择的种类,以及如何选择适合您需求的正确选择。我们还将深入探讨无服务器的替代方案,以及随着团队和业务的增长,如何更轻松地迁移到不同的替代方案。

云计算

让我们快速回顾一下云计算是什么以及为什么它变得如此普及。

云计算是对最基本的计算资源进行虚拟化,并使其随需求提供的过程:

  • 计算: CPU、GPU 和内存
  • 存储: 持久磁盘
  • 网络: 用于数据IO的带宽

其他云服务,如数据库和事件队列,是构建在这些原始资源之上的。

用户不必亲自维护IT基础架构。相反,计算资源被集中在分布式数据中心中,并在用户之间共享。云的价值主张包括:

  • 不需要进行IT基础设施的资本支出规划
  • 能够根据需求随时扩展IT基础设施
  • 由于基础设施在数据中心进行整合,实现规模经济。

有两种类型的云IT基础架构:

  • 本地部署(On-Premises): 当您在您自己的数据中心中运行自己的IT基础架构,为您公司的各个团队提供IT基础架构时。
  • 公共云(Public Cloud): 当您将其外包给云供应商(如AWS、Azure、Google Cloud、IBM等),其IT基础架构由多个客户共享时。

根据您在云部署中所期望的控制级别和抽象级别,有不同的服务模型(IaaS、PaaS、SaaS等)。我们将检查每个模型,但首先让我们了解无服务器计算。

无服务器计算

无服务器并不意味着没有服务器。只是开发人员不与服务器交互或管理服务器。无服务器计算具有三个特征:

  • 没有服务器管理: 没有前期规划,不需要管理服务器
  • 自动扩展: 基础架构会根据使用情况自动扩展,并且具有高可用性
  • 按使用付费: 没有闲置基础架构成本,只支付您使用的内容所有三个主要的云供应商都提供了几种无服务器云服务,如数据库、数据仓库、事件流和API网关。在本文中,我们将重点关注用于部署应用程序和服务的基本计算资源(计算、内存)的无服务器计算选项。

无服务器部署提供了两个好处:

  • 快速开发: 减少了DevOps的工作,使资源能够集中在开发上,提高了开发人员的生产率。您可以更快地开发和发布应用程序和服务。
  • 降低成本: 您可以选择一种具有成本效益的无服务器替代方案(感谢按使用付费),同时享受对突然负载波动的保险(感谢自动扩展)。只有在非常高的规模下,才更经济实惠从无服务器迁移到自己管理计算扩展。

云部署:IaaS vs CaaS PaaS vs FaaS vs SaaS

让我们从本地部署一直走到SaaS,以了解云部署的范围。

本地部署 (On-Premises)

在传统的本地部署云中,您在多个地理位置建立和运营数据中心。您从裸金属硬件开始控制和管理一切。

显然,这种方法只适用于像Facebook和Google这样非常大的企业。并非每个人都能承担建立自己的多地数据中心并进行连续的容量规划。甚至Twitter也考虑将一切从本地迁移到云端,并且将数据处理和分析迁移到了Google Cloud

基础设施即服务 (IaaS)

这是最简单的选项。您在云上获得一个虚拟机。您可以通过浏览器的点击来启动(和关闭)虚拟机,然后通过ssh连接到远程虚拟机上执行与在本地计算机上执行相同的操作。

您的云供应商使用虚拟化程序来虚拟化硬件,以划分和分配资源。它甚至可能为您提供独立的机器选项,而无需与任何其他租户共享它们。

  • AWS: 亚马逊弹性计算云 (Amazon Elastic Compute Cloud, EC2),EC2专用主机,EC2 P3 GPU
  • Azure: Azure虚拟机 (Azure Virtual Machine),Azure专用主机,Azure GPU优化虚拟机
  • GCP: 谷歌计算引擎 (Google Compute Engine),专用节点,Cloud GPUs

容器即服务 (CaaS)

容器是应用程序代码以及运行应用程序服务所需的所有必要依赖项(例如,特定版本的编程语言运行时和库)的轻量级包装。

就像虚拟机虚拟化计算机硬件一样,容器虚拟化操作系统。容器定义了精确的应用程序运行时,确保无论您是在笔记本电脑上运行应用程序还是在公共云上运行应用程序,都具有相同的执行环境。

容器工程师可以在裸金属物理机上运行容器,但在生产环境中,通常在虚拟机中运行。

使用诸如Kubernetes之类的工具来编排容器。您必须配置一个Kubernetes集群并定义缩放规则。随着您的服务负载的增加,Kubernetes将根据配置创建更多的容器实例和虚拟机节点。

  • AWS: 弹性容器服务 (Elastic Container Service, ECS) 或弹性Kubernetes服务 (Elastic Kubernetes Service, EKS) 与EC2
  • Azure: Azure Kubernetes服务 (Azure Kubernetes Service, AKS)
  • GCP: Kubernetes引擎

虚拟机 vs. 容器虚拟机 vs. 容器

无服务器的容器即服务 (Serverless CaaS)

无论是虚拟机还是具有编排程序的容器,都需要提供和管理服务器。无服务器的CaaS将集群的配置责任委托给云供应商。您在由云供应商管理和扩展的集群上运行容器。

在切换CaaS和无服务器CaaS之间,您无需对容器进行任何更改。两者都运行相同的容器。唯一的区别是谁管理服务器集群,您还是云供应商。

无服务器的CaaS具有容器的所有好处,但无需管理Kubernetes集群的麻烦。

  • AWS: 应用程序运行器 (App Runner); 弹性容器服务 (ECS) 或弹性Kubernetes服务 (EKS) 与Fargate
  • Azure: Azure容器应用 (Azure Container Apps)
  • GCP: Cloud Run

平台即服务 (PaaS)

PaaS提供在CaaS之前的运行时选项。各种云供应商提供一组带有自动扩展的预定义运行时。您可以选择适合您的Web应用程序或服务的运行时。

从某种意义上说,预定义运行时就像容器,尽管是由云供应商而不是您定义的。我预见无服务器的CaaS将会 overshadow PaaS。当您可以选择自己的容器时,为什么要将自己限制在供应商预定义的运行时中呢?

  • AWS: 弹性Beanstalk (Elastic Beanstalk)
  • Azure: 应用服务 (App Service)
  • GCP: 应用引擎 (App Engine)

功能即服务 (FaaS)

您将应用程序设计为一组无状态、事件驱动和短暂的“纳米”服务。在典型的三层设计中,您有一个API网关,将服务API映射到一个函数。这些函数可以与datastores进行交互以执行业务逻辑,然后返回结果。

云供应商在其函数提供中支持多种编程语言。但请检查冷启动时间:即在接收触发器后启动函数所需的时间。

在接收触发事件(可以很好地是REST API调用)后,将启动函数。完成后将关闭。因此,您只需支付该持续时间的费用。由于每次事件触发时都会启动(或重用)一个函数,因此扩展是透明的。

  • AWS: Lambda
  • Azure: Azure函数 (Azure Function)
  • GCP: 云函数 (Cloud Function)

软件即服务 (SaaS)

SaaS封装了执行任务的逻辑。例如,Amazon Cognito执行用户注册、登录和访问控制,因此您甚至不必编写该逻辑。类似地,Google的语音转文本服务执行自动语音识别,并将音频流转录为文本。

常见任务的SaaS宇宙减少了开发时间。您选择正确的服务,配置并将它们连接在一起,然后仅对与您的应用程序特定的业务逻辑进行编码。您需要为每次API调用付费。

云部署范围:本地 vs IaaS vs CaaS vs PaaS vs FaaS vs SaaS,以及其中的无服务器部分云部署范围:本地 vs IaaS vs CaaS vs PaaS vs FaaS vs SaaS,以及其中的无服务器部分

无服务器架构

无服务器架构是一种设计应用程序和服务的方法,它消除了预配和管理底层服务器基础设施的需求。

您通过编织云供应商提供的服务并仅编写您的业务逻辑来设计应用程序。

这意味着您将使用云供应商提供的数据库、身份验证服务、API网关、事件队列和其他无服务器服务,而不是自己部署这些服务。这种方法的一个缺点是供应商锁定,因为您将您的服务与云供应商提供的服务密切关联起来。

您可以在一定程度上降低这种风险,因为主要云供应商的生态系统之间存在相似性。如果需要,您可以考虑构建薄的Façade工厂方法设计模式,以隔离与云供应商特定的代码,并保持您的业务逻辑不受污染。

无服务器 != FaaS

许多人认为只有FaaS才被认为是无服务器。在我看来,这是对无服务器的极端定义。只要您不预配、配置和管理服务器集群来运行和扩展您的服务,我就认为它是无服务器的。在我的观点中,即使将单体服务打包在容器中,并将其部署在无服务器CaaS上,也仍然是无服务器的。

云原生开发策略

我不相信技术为中心的开发策略。考虑团队能力和业务情况非常重要。确实要考虑使您的技术决策未来具备可扩展性,但不要以牺牲现在为代价。

如果您正在构建PoC或初始最小可行产品

您希望尽快将其交付给用户,时间是最宝贵的资源。此外,您的服务负载将非常低且不规律。只要满足您的技术需求,FaaS解决方案将是构建速度最快的最简单方法。

如果FaaS不起作用,那么可以尝试来自您供应商的PaaS运行时。只有在极少数情况下,您将需要选择无服务器的CaaS或更高级别的解决方案。

您已经有了产品市场适应度并知道需要构建什么

您可以继续使用FaaS或PaaS,特别是如果您预计很长一段时间内的流量负载将很稀疏。但在这个阶段,是时候整理FaaS/PaaS在PoC/MVP迭代过程中可能产生的混乱了。

您在这个阶段所做的设计决策将持续相当长的时间。由于您对业务需求有清晰的认识,并且对需要构建的内容有一定的了解,因此您应该仔细检查您的应用程序架构,并确保它能够应对100倍流量增长。

我建议从CaaS开始。您希望专注于满足客户的需求,并且不希望每天都与间歇性的无法重现的错误作斗争。您应该投资于为您的服务定义容器,并在开发、测试和生产部署之间使用它们。

选择的问题归结为CaaS和无服务器的CaaS。回答以下两个问题:

  • 您的团队目前是否具备Kubernetes DevOps能力?
  • 您的成本建模预测是否对CaaS更低?

如果两者的答案都是“是”,那么选择CaaS,否则选择无服务器CaaS。

请记住,这个错误不会造成太大的损失,因为相同的容器可以部署在CaaS或无服务器的CaaS上,切换不需要更改容器或应用程序代码。

云迁移策略

如果您要将现有的应用程序或服务迁移到云上,首先要考虑的问题是:您是要将其“原样”迁移,还是要优化为云服务?

举起和搬移

您可以将应用程序迁移到云中,而无需重新设计它或进行代码更改。这也被称为重新托管

如果该应用程序可以容器化,那么您必须为其定义容器,并享受统一运行时的好处。在CaaS和无服务器CaaS之间的选择是相同的。如果您的DevOps团队具备Kubernetes技能并且CaaS更便宜,请选择CaaS,否则选择无服务器CaaS。

如果该应用程序无法容器化,但其中一个PaaS运行时适合它,那么选择PaaS,否则您必须选择IaaS。

云优化

如果您正在重新设计应用程序并优化其适用于云,那么您将面临与开发新应用程序相同的情况,但有两个注意事项:

  • 如果您需要VM级别的控制权,那么没有什么需要重新设计的。您将使用IaaS,因此坚持举起和搬移。
  • 由于这是一个现有的应用程序,您已经具备了产品市场适应度。因此,请遵循相同的决策路径。

AWS vs Azure vs Google Cloud上的无服务器,以及关于IaaS vs CaaS vs PaaS vs FaaS的计算选择的决策树AWS vs Azure vs Google Cloud上的无服务器,以及关于IaaS vs CaaS vs PaaS vs FaaS的计算选择的决策树

总结

这篇文章快速回顾了以下内容:

  • 什么是云计算?
  • 什么是无服务器?
  • 云部署谱系:IaaS vs CaaS vs PaaS vs FaaS vs SaaS
  • 主要云中的计算替代方案:AWS vs Azure vs Google Cloud
  • 云原生开发和迁移策略

希望您觉得这篇文章有用。请在评论中提供您的反馈和建议。

资源

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Cloud Function是一个开源项目,它可以让你使用Spring框架构建无服务器(Serverless)函数。Serverless函数可以在云平台上执行,例如AWS Lambda,Azure Functions或Google Cloud Functions。 使用Spring Cloud Function构建Serverless函数非常简单,只需要定义一个函数接口并实现它即可。这个函数接口可以是Java 8函数接口,也可以是Spring框架的Function接口。 下面是一个简单的使用Spring Cloud Function构建Serverless函数的示例: ```java import java.util.function.Function; import org.springframework.cloud.function.adapter.aws.SpringBootRequestHandler; public class MyFunction implements Function<String, String> { public String apply(String input) { return "Hello " + input; } public static void main(String[] args) throws Exception { SpringBootRequestHandler<String, String> handler = new SpringBootRequestHandler<>(MyFunction.class); System.out.println(handler.handleRequest("World", null)); } } ``` 在这个示例中,我们定义了一个MyFunction类,它实现了Function接口。apply方法接收一个String类型的参数并返回一个String类型的结果。 在main方法中,我们使用SpringBootRequestHandler类创建一个处理器,并将MyFunction类作为参数传递给它。然后,我们调用handleRequest方法,将参数"World"传递给它。handleRequest方法会调用MyFunction的apply方法,并返回结果。 当我们将这个函数部署到AWS Lambda上时,我们只需要将MyFunction打包成一个Jar文件并上传到AWS Lambda上。然后,我们可以在AWS Lambda控制台上配置触发器,让这个函数在某个事件发生时执行。 使用Spring Cloud Function构建Serverless函数非常简单,它可以让你使用Spring框架构建高效、可扩展、易于维护的Serverless函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值