运行微服务的最简单方法:AWS 与 Heroku 的比较
这或许是老生常谈,但业绩最佳的公司往往是那些执行速度最快、客户体验最佳的公司。对于开发者来说,这意味着简化他们的日常工作流程,以便更快地交付功能。在现代微服务领域,开发者能够更快地交付,因为他们将复杂的单体应用拆分成更小、更易于管理的服务。然而,运维微服务架构也并非易事。当你运维不断增长的服务列表时,你需要一种方法来快速启动它们并持续推送更新。
AWS 是运行各种在线服务的最流行平台之一。虽然它是许多公司的标准选择,但它与其他选择相比如何?虽然其他人已经对 AWS 和 Heroku 进行了深入的比较,但让我们来看一个真实的例子,看看在两个平台上运行微服务需要付出多少努力。让我们看看在两个平台上安装同一款应用的具体步骤,以便我们了解哪个平台更简单。
部署高可用性微服务的复杂性
从一个想法到一个 URL 涉及许多步骤,尤其是在您希望服务能够自动扩展并具备容错能力的情况下。设置服务器和数据库只是您必须配置的堆栈的第一层。在具有容错能力的部署中,确保服务器配置相同且数据库跨区域同步可能是一项挑战。由于可能的合规性要求,您需要配置具有特定子网的 VPC 或设置路由组。用户身份验证和密钥管理也是需要持续维护的另一个组件。此外,在典型的 EC2 环境中,还需要设置 DNS 管理、自动扩展、故障转移配置、操作系统配置、日志记录和监控。以下管道中列出的所有组件都需要进行配置并持续维护。您可以看到,在大型环境中,这些组件很快就会变得难以控制。
测试用例
我们将比较在 AWS EC2 和 Heroku 上设置服务的步骤,以便您了解哪个平台最能节省时间。如果您以前没听说过 Heroku,它是一个运行 Web 应用或 Web 服务的平台。您可以将其视为构建在 AWS 之上的一层,旨在简化 Web 应用的部署、运维和迭代。它们彼此兼容,因此您可以拥有一个混合环境,一些服务在 Heroku 上运行,另一些服务在 EC2 上运行。
为了进行公平的比较,我们创建了一个简单的应用程序,并将其部署到两个平台上。它允许您提交订单进行处理,并使用简单的文本表单显示已提交订单的列表。
我们将使用 LAMP 架构,因为它在许多包含 Web 前端和数据库的应用中很常见。我们还将添加一个后端服务来展示微服务的部署过程。服务器将使用来自同一GitHub 仓库的代码。我们将利用两个平台的功能来实现一个容错且可扩展的解决方案。服务和数据库应该能够抵御故障和停机。每个平台的实现方式不同,因此您将看到它们的比较。
在 AWS 上设置服务的步骤
如果您之前在 AWS 上部署过高可用性应用程序,那么您可能对这种设置并不陌生。我们将概述这些步骤以供比较。AWS 中的环境需要多个组件,首先需要在默认 VPC 中创建两个 AWS EC2 实例,这两个实例位于不同的可用区内。流量将使用 Route 53 和 Elastic Load Balancer 分发到每个可用区中的第一个可用实例。多可用区 MySQL 主数据库将支持应用程序的后端,并在单独的可用区中提供一个主动故障转移备用实例。我们在下面提供了简单微服务应用程序的拓扑。
首先,我们将部署一个 PHP 应用程序,用于接收订单;然后,我们将预置一个独立的订单状态检查微服务。我们将从默认 VPC 和子网开始。Amazon Linux EC2 实例开箱即用,只需极少的配置即可支持 PHP 应用程序。
为了简洁起见,我们将概述必要的步骤。每个步骤都包含许多子步骤,如果您需要更多有关如何执行这些步骤的详细信息,我们提供了 AWS 文档的链接。如果您是 AWS 专家,您可能已经多次执行过类似的步骤。
步骤 1:创建前两个AWS Linux 微型实例,每个可用区各一个。这些服务器将托管订单处理服务的主要 UI。
步骤 2:创建一个新的RDS MySQL 数据库。指定这将是一个公共的多可用区部署。
步骤 3:现在我们已经运行了 Linux 和 MySQL 实例,让我们连接我们的 EC2 实例并开始安装依赖软件,如PHP和Apache。
步骤 4:在 Apache 中启用mod_rewrite 模块。这将允许应用程序在稍后创建 REST URL 调用时拥有干净的 URL。
设置 API
步骤5:现在我们可以将网站内容上传到每台服务器的Web目录并开始开发。请从我们的演示应用GitHub仓库上传网站文件。
api.php 文件将提供接口,允许我们从 UI 查询后端数据库。db.php 文件将直接连接到 RDS 数据库。请务必使用之前创建的 RDS 数据库后保存的端点 URL。为了验证,首先我们可以使用以下 MySQL 命令将一些虚拟数据插入数据库:
INSERT INTO `transactions` (`id`, `order_id`, `amount`, `response_code`, `response_desc`) VALUES
(1, 15478952, 100.00, 0, 'PAID'),
(2, 15478955, 10.00, 0, 'PAID'),
(3, 15478958, 50.00, 1, 'FAILED'),
(4, 15478959, 60.00, 0, 'PAID');
此命令将在数据库中创建四个订单条目,订单状态分别为“已付款”或“未付款”。现在数据库中有了数据,我们需要测试前端 UI,以确认对数据库的查询是否成功。
步骤 6:在检查之前,我们需要创建一个负载均衡器,并将每个服务器添加到特定可用区域下的目标组。
步骤 7:导航到 Route 53 并为您的域创建 A 记录。在本例中,将使用 order.apexcloudnetworks.com。然后,选择“弹性负载均衡器”作为值,并选择“故障转移”作为路由策略。
A 记录完成后,您现在可以导航到主前端 URL 来查询 API 中的订单。要查询 API,请按以下格式输入 URL 请求:
http://order.domain.com/api.php?order_id=15478958
然后,您可以看到 API 返回的响应,其中包含订单 ID、金额和状态:
至此,您的应用程序已完成。负载均衡器正在两个独立的可用区内的多台服务器之间路由请求。如果某个服务器或可用区发生故障,它将由位于备用可用区的相同服务器和数据库进行备份。
构建微服务
现在我们将添加一个独立的微服务来检查订单状态。微服务将使我们的开发团队能够简化应用程序开发并消除依赖关系。
步骤 8:要开始构建微服务,首先在同一个默认 VPC 中配置相同的 EC2 Linux 实例,每个可用区域一个。
步骤 9:在新的 EC2 实例上,确保安装相同的依赖包。
第 10 步:将相同的 .htaccess、index.php、api.php 和 db.php 文件上传到新服务器。
步骤 11:将两台新服务器添加到负载均衡器目标组。添加服务器后,我们可以为微服务 API 设置新的 URL。
步骤 12:从 Route 53,将新的检查域指向在步骤 6 中创建的负载均衡器。确保将路由策略设置为故障转移。
步骤 13:导航到检查域,验证 API 是否成功查询读取副本数据库,并返回记录。
API 检查成功后,我们就可以完成微服务用户界面的构建,以便更轻松地查看订单。步骤 4 中从代码库下载的 index.php 文件将创建一个 HTML 表单,用于查询只读数据库中的订单状态。.htaccess 文件将允许您之前启用的 Apache mod_rewrite 在微服务 UI 中进行搜索时显示清晰的 URL。
步骤 14:导航到检查 URL,您将看到更新后的 HTML 表单。输入示例搜索 ID 之一来查询订单状态:
现在,您拥有一个独立的微服务,并且可以从添加到环境中的任何其他服务调用它。此外,您还提高了可用性和冗余性。即使您关闭了主服务器或主数据库,第二个服务器仍将保持在线,并将继续处理来自客户的订单状态请求。
我们知道这个过程涉及多个步骤。除了使用像 CloudFormation 这样的自动化配置管理解决方案(这同样需要额外的配置工作)之外,在 AWS 上没有简单的方法可以绕过这些步骤。随着时间的推移,它变成了例行的琐事。
在 Heroku 上设置服务的步骤
现在让我们比较一下使用 Heroku 创建相同系统需要多少步骤。
步骤 1 :我们将使用上面提到的 PHP 应用程序在 Heroku 上部署。创建一个新的 Heroku 帐户,并按照PHP 入门说明设置 CLI 。在现有应用程序代码目录中,使用以下命令创建 Heroku 应用程序:
heroku create devorders
检查 Heroku 创建的 URL。你会看到它为你创建了默认应用程序。哇!只用了一个命令,我们就运行了一个基本的服务器!很酷吧?
设置数据库
步骤 2:要配置数据库,您需要使用 Heroku 的 ClearDB MySQL 插件。使用以下命令配置共享 MySQL 实例:
heroku addons:create cleardb:ignite
ClearDB 是 Heroku 的附加组件合作伙伴之一,它将自动在不同的可用区创建多实例数据库集群,以保证数据的可用性。现在,使用以下命令获取数据库连接详细信息:
heroku config | grep CLEARDB_DATABASE_URL
使用从上述命令获取的连接详细信息,导入应用程序附带的事务 SQL 文件。登录数据库并确认表已创建。
提交代码
步骤 3:使用应用程序 URL 更新 api.php 文件,并使用以下代码替换 db.php 的内容:
<?php
$url = parse_url(getenv("CLEARDB_DATABASE_URL"));
$server = $url["host"];
$username = $url["user"];
$password = $url["pass"];
$db = substr($url["path"], 1);
$conn = new mysqli($server, $username, $password, $db);
?>
您无需在此配置文件中硬编码任何用户名或密码。Heroku 会将这些数据存储在CLEARDB_DATABASE_URL
环境变量中。
步骤 4:此时,您可以使用以下命令提交代码:
git push heroku master
导航到已创建的 devorders.herokuapp.com URL,以验证应用程序已成功发布。您可以看到我们已成功连接到数据库,并从 API 调用中检索数据。
好的,现在我们的前端已经运行了。你会注意到我们没有配置任何 DNS 或 VPC 设置,也没有手动上传任何代码到服务器。Heroku 会自动帮我们完成这些步骤。
创建微服务
步骤 5:要创建微服务,只需使用以下命令创建一个新的应用程序:
heroku create orderchecking
步骤 6:接下来,将clone
现有的应用程序存储库复制cd
到新的目录。
步骤 7:进入克隆的应用程序目录后,将存储库设置为orderchecking
repo,并使用以下命令部署代码:
heroku git:remote -a orderchecking
git add .
git commit -am "Adding a new Micro Service"
git push heroku master
导航到微服务 URL orderchecking.herokuapp.com/index.php 以从用户界面检查订单状态。
您可以看到,我们成功连接到订单数据库,并调用 API 来查询客户订单状态。Heroku 提供了一个独立的服务,可以独立调用 MySQL 数据库集群。开发人员可以在此应用程序上进行开发和更改,而不会影响生产主分支。
现在来看看真正的魔法!你只需一个命令就可以轻松扩展应用程序:
heroku ps:scale web=2
“2” 表示您希望运行应用程序的服务器实例 (dynos) 数量;无需预置新服务器、配置自动伸缩组或负载均衡器。所有应用程序流量将自动均匀分布在所有正在运行的实例上。
结论
您可以看到,与手动 AWS 部署相比,使用 Heroku 我们减少了大约一半的步骤。此外,配置 Heroku 环境所需的步骤通常只需一行命令,而使用 AWS 则需要执行多项命令或配置。在 Heroku 上,VPC 配置和网络管理以及将代码部署到服务器的过程都已为您完成。虽然我们没有展示,但只需一条命令,您就可以部署到全球多个区域,或安装数百个用于监控、缓存等服务的附加组件。
另一方面,AWS 确实提供了 Heroku 所不具备的一系列服务,例如数据仓库、S3 存储和 AI。此外,您可能已经有团队在使用 AWS,并且需要一种与这些服务安全通信的方式。由于 Heroku 在 AWS 上运行,您可以通过VPC 对等连接安全地连接到 AWS 中的服务。这使您的团队能够灵活地利用两个平台的优势。
在比较在 AWS 和 Heroku 上运行微服务时,我们还可以考虑更多优缺点。实际上,这取决于您和您的团队的优先事项。哪些优缺点对您来说最重要?为什么?
要了解更多信息,请查看Heroku 的 Dreamforce 演示,观看精彩的分步视频,其中概述了如何部署高可用且安全的多区域微服务。观看视频时,请考虑一下在 AWS 上自行实现相同功能需要多少时间。
文章来源:https://dev.to/heroku/the-easiest-way-to-run-microservices-comparing-aws-and-heroku-295n