在本模块中,您将以一组互联服务的形式将您的 node.js 应用程序部署在 Application Load Balancer (ALB) 后面。然后,您将使用 ALB 将流量从整体式架构无缝转移到微服务。 开始构建

您将按照该流程部署微服务,并将应用程序的流量安全转移出整体式架构。

架构概览
  1. 切换流量
    这是初始配置。整体式 node.js 应用程序在 Amazon ECS 上的容器中运行。
  2. 启动微服务
    借助您在上一个模块中构建并推送到 Amazon ECR 的三个容器映像,您可以在现有的 Amazon ECS 集群上启动三项微服务。
  3. 配置目标组
    模块 2 类似,您将为每项服务添加一个目标组,并更新 ALB 规则以连接新的微服务。
  4. 关闭整体式架构
    通过更改 ALB 中的一条规则,您便可以开始将流量路由到正在运行的微服务。验证流量重新路由后,关闭整体式架构。

按照下面的分步说明部署微服务。选择各个步骤编号可展开相应部分。

break-the-monolith
  • 第 1 步:为您的服务编写任务定义

    您将为模块 2 中启动的集群部署三项新服务。与模块 2 类似,您将为每项服务编写任务定义

    ⚐ 注意:可将多个容器添加到单个任务定义。这意味着您可以将三个微服务作为不同于单个服务的容器运行。但是,采用这种方式构建的仍是整体式架构,因为每个容器仍需要与服务一起进行线性扩展。您的目标是创建三项独立的服务。每项服务都需要自己的任务定义借助相应的服务映像运行容器。

    您可以从 Amazon ECS 控制台创建这些任务定义,或以 JSON 的形式编写任务定义,以加快处理速度。要以 JSON 文件的形式编写任务定义,请遵循以下步骤:

    1. Amazon ECS 下的 Amazon Container Services 控制台中,选择任务定义
    2. 任务定义页面,选择新建任务定义按钮。
    3. 选择启动类型兼容性页面中,选择 EC2 选项,然后选择下一步
    4. 在“配置任务和容器定义”页面中,滚动到部分,然后选择通过 JSON 配置按钮。
    5. 将以下代码段复制并粘贴到 JSON 字段,替换现有代码。
      记住替换 [service-name]、[account-ID]、[region] 和 [tag] 占位符。

    ⚐ 注意:以下参数用于任务定义:

    • 名称 = [service-name: posts, threads, and users] 
    • 映像 = [Amazon ECR repository image URL]:latest 
    • cpu = 256
    • 内存 = 256
    • 容器端口 = 3000
    • Host Post = 0
    {
        "containerDefinitions": [
            {
                "name": "[service-name]",
                "image": "[account-id].dkr.ecr.[region].amazonaws.com/[service-name]:[tag]",
                "memoryReservation": "256",
                "cpu": "256",
                "essential": true,
                "portMappings": [
                    {
                        "hostPort": "0",
                        "containerPort": "3000",
                        "protocol": "tcp"
                    }
                ]
            }
        ],
        "volumes": [],
        "networkMode": "bridge",
        "placementConstraints": [],
        "family": "[service-name]"
    }

    ♻ 重复上述步骤,为每项服务创建任务定义:

    • posts
    • threads
    • users
  • 第 2 步:配置 Application Load Balancer:目标组

    与在模块 2 中一样,为每项服务(posts、threads 和 users)配置目标组。目标组允许流量正确到达指定的服务。您将使用 AWS CLI 配置目标组。但要确保您拥有用于本教程的正确 VPC 名称,然后再继续:

    • 导航到 EC2 控制台的“负载均衡器”部分
    • 选中 demo 旁边的复选框,选择描述选项卡,然后找到 VPC 属性(格式为:vpc-xxxxxxxxxxxxxxxxx)。
      ⚐ 注意:配置目标组时,您需要 VPC 属性。

    配置目标组

    在终端中,输入以下命令为每项服务(posts、threads 和 users)创建目标组。此外,您将创建一个目标组 (drop-traffic),以防止流量在微服务完全运行后到达您的整体式架构。记住替换以下占位符:[region]、[service-name] 和 [vpc-attribute]。

    服务名称:poststhreadsusersdrop-traffic

    aws elbv2 create-target-group --region [region] --name [service-name] --protocol HTTP --port 80 --vpc-id [vpc-attribute] --healthy-threshold-count 2 --unhealthy-threshold-count 2 --health-check-timeout-seconds 5 --health-check-interval-seconds 6
    目标组
  • 第 3 步:配置侦听器规则

    侦听器会查看传入 ALB 的连接请求,以便适当路由流量。

    现在,您的全部四项服务(整体式架构和三项微服务)都在同一负载均衡器后运行。要从整体式架构过渡到微服务,您将开始将流量路由到微服务,并停止将流量路由到整体式架构。

    访问侦听器规则

    更新侦听器规则

    此选项卡中应该仅列出一个侦听器。请遵循以下步骤来编辑侦听器规则:

    • 规则列之下,选择查看/编辑规则
    • 规则页面上,选择加号 (+) 按钮。
      插入规则选项将出现在页面上。 
    • 使用以下规则模板插入必要的规则,其中包括一个用于维护到达整体式架构的流量,一个用于每个微服务:
      • IF Path = /api/[service-name]* THEN Forward to [service-name]
        例如:IF Path = /api/posts* THEN Forward to posts
      • 按以下顺序插入规则:
        • api:/api* forwards to api
        • users:/api/users* forwards to users
        • threads:/api/threads* forwards to threads
        • posts:/api/posts* forwards to posts
    • 选择保存
    • 选择页面左上角的返回箭头,返回负载均衡器控制台。
    配置 Application Load Balancer 侦听器规则
  • 第 4 步:部署您的微服务

    将三项微服务(posts、threads 和 users)部署到您的集群。对三项微服务中的每一项重复以下步骤:

    • 导航到 Amazon ECS 控制台,然后从左侧菜单栏中选择集群
    • 选中集群 BreakTheMonolith-Demo,选择服务选项卡,然后选择创建
    • 配置服务页面上,编辑以下参数(并保留下面未列出参数的默认值):
      • 对于启动类型,选择 EC2
      • 对于任务定义,选择输入值按钮以自动选择最高修订值。
        例如:api:1 
      • 对于服务名称,输入服务名称(posts、threads 或 users)。
      • 对于任务数量,输入 1
    • 选择下一步
    • 配置网络页面上的负载均衡部分,执行以下操作:
      • 对于负载均衡器类型,选择 Application Load Balancer
      • 对于服务 IAM 角色,选择 BreakTheMonolith-Demo-ECSServiceRole
      • 对于负载均衡器名称,验证是否已选中 demo
      • 要负载均衡的容器部分,选择添加到负载均衡器按钮并进行以下编辑:
        • 对于生产侦听器端口,设为 80:HTTP
        • 对于目标组名称,选择相应的组:poststhreadsusers
    • 选择下一步
    • 设置 Auto Scaling 页面上,选择下一步
    • 审核页面上,选择创建服务
    • 选择查看服务

    仅需几秒钟,所有服务便可启动。继续操作之前,请仔细检查所有服务和任务,确保一切正常运行并处于活动状态。

    Amazon ECS 部署微服务
  • 第 5 步:将流量转移到微服务

    您的微服务正在运行,但所有流量仍然流向整体式架构服务。要将流量重新路由到微服务,请执行以下步骤以更新侦听器规则:

    • 导航到 EC2 控制台的“负载均衡器”部分
    • 选中 demo 旁边的复选框以查看该负载均衡器的详细信息。
    • 选择侦听器选项卡。
      选项卡中应该仅列出一个侦听器。
    • 规则列之下,选择查看/编辑规则
    • 规则页面上,从顶部菜单中选择减号 (-) 按钮。
    • 选中规则旁边的复选框,以删除第一个规则 (/api* forwards to api)。
    • 选择删除
    • 将默认规则更新为“forward to drop-traffic”:
      • 从顶部菜单中选择编辑(铅笔)按钮。
      • 选择默认规则 (HTTP 80: default action) 旁边的编辑(铅笔)按钮。
      • THEN 列中选择编辑(铅笔)图标以编辑 Forward to
      • 目标组字段中,选择 drop-traffic
      • 选择更新按钮。

    参见下面的屏幕截图,获取更新的规则示例。

    Amazon EC2 将流量转移到微服务

    禁用整体式架构:现在流量流向您的微服务,您可以禁用整体式架构服务。

    • 返回 Amazon ECS 集群 BreakTheMonolith-Demo-ECSCluster
    • 服务选项卡中,选中 api 旁边的复选框,然后选择更新
    • 配置服务页面上,找到任务数量,输入 0
    • 选择跳到审核
    • 选择更新服务

    Amazon ECS 现在将清空服务在集群上部署的容器的连接,然后停止容器。如果您在大约 30 秒后刷新“部署”或“任务”列表,您将看到任务数量降至 0。服务仍处于活动状态,因此,如果您出于任何原因需要回滚,则只需更新该服务便可部署更多任务。

    您可以选择删除 api 服务。在服务选项卡中,选中 api 旁边的复选框,选择删除,然后确认删除。

    现在,您在未造成停机的情况下,完全将您的 node.js 从整体式架构转移到微服务!

  • 第 6 步:验证您的部署

    查找服务 URL:此 URL 亦即您在本教程模块 2 中使用的 URL。

    • 导航到 EC2 控制台的“负载均衡器”部分
    • 选中 demo 旁边的复选框以查看该负载均衡器的详细信息。
    • 描述选项卡中,找到 DNS 名称,然后选择 URL 末尾的复制图标。 
    • 将 DNS 名称粘贴到新的浏览器选项卡或窗口中。

    您应该会看到一条消息:“Ready to receive requests”(可以接收请求了)。

    查看每项微服务的值:您的 ALB 将根据请求 URL 路由流量。要查看各项服务,只需将服务名称添加到 DNS 名称的末尾:

    • http://[DNS name]/api/users
    • http://[DNS name]/api/threads
    • http://[DNS name]/api/posts
    查看每项微服务的值

    ⚐ 注意:部署整体式架构对这些 URL 没有任何影响。这非常重要,因为任何 API 或使用者都希望与此应用程序之间的连接不会受您所做的更改影响。从整体式架构转移到微服务无需对基础设施的其他部分进行任何更改。

    您还可以使用 Postman 等工具测试您的 API。