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

您将根据该流程构建微服务,并将应用程序的流量安全迁移出整体架构。

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

按照下面的分步说明部署微服务。单击各个步骤号可展开该部分。

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

    您要将三项新的微服务部署您在模块 2 中运行的集群上。与模块 2 类似,您将为每项服务编写任务定义

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

    您可以在控制台用户界面中写入这些任务定义,或以 JSON 的形式编写任务定义,加快处理速度。要以 JSON 文件的形式编写任务定义,请在新的“Task Definition”(任务定义) 屏幕底部选择“Configure via JSON”(通过 JSON 配置)。

    任务定义的参数包括:

    • 名称 = [service-name]
    • 映像 = [service ECR repo URL]:latest
    • cpu = 256
    • 内存 = 256
    • 容器端口 = 3000
    • Host Post = 0



    或者使用 JSON:

    {
        "containerDefinitions": [
            {
                "name": "[service-name]",
                "image": "[account-id].dkr.ecr.us-west-2.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 步:配置应用程序负载均衡器:目标组

    模块 2 类似,您将为您的每项服务配置目标组。目标组可让流量准确到达每项服务。

    查看您的 VPC 名称:AWS CloudFormation 堆栈有自己的 VPC,但这很可能不是您的默认 VPC。请务必使用正确的 VPC 配置您的目标组。

    • 导航到 EC2 控制台的“负载均衡器”部分
    • 您应该会看到已存在一个名为“demo”的负载均衡器。
    • 选中复选框以查看负载均衡器的详细信息。
    • 记下详细信息页面上的 VPC 属性值。

     

    配置目标组

    • 导航到 EC2 控制台的“目标组”部分
    • 选择“创建目标组”。
    • 配置目标组 (如果未在此处指定默认设置,请勿对其进行修改):名称 = [service-name] 协议 = HTTP 端口 = 80 VPC = 从上一步中选择与您的负载均衡器匹配的 VPC
      • 高级运行状况检查设置:正常阈值 = 2 不正常阈值 = 2 超时 = 5 间隔 = 6
    • 选择创建

     

    ♻ 重复这一流程,为每项服务创建目标组:

    • posts
    • threads
    • users

     

    最后,创建第四个目标组

    • drop-traffic

    该目标组的目标是“dummy”。在微服务后完全运行后,您将使用它来防止流量到达您的整体架构。您的表中应该总共有 5 个目标组。

    目标组
  • 第 3 步:配置侦听器规则

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

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

    打开您的侦听器

    • 导航到 EC2 控制台的“负载均衡器”部分
    • 您应该会看到已存在一个名为“demo”的负载均衡器。
    • 选中复选框以查看负载均衡器的详细信息。
    • 选择“侦听器”选项卡。

     

    更新侦听器规则

    • 选择侦听器对应的“View/edit rules >”(查看/编辑规则 >) 选项。
    • 选择“+”并插入规则。
    • 规则条件如下:
      • IF Path = /api/[service-name]* THEN Forward to [service-name]
      • 例如:Path = /api/posts* forward to posts
    • 创建四个新规则,一个用于维护指向整体架构的流量,另外三个用于各项服务。包括默认规则在内,您将总共有 5 个规则。请务必按以下顺序添加规则:
      • api:/api* forwards to api
      • users:/api/users* forwards to users
      • threads:/api/threads* forwards to threads
      • posts:/api/posts* forwards to posts
    • 选择页面左上角的返回箭头,返回负载均衡器控制台。
    配置侦听器规则
  • 第 4 步:部署您的微服务

    现在,您要将您的三项服务部署到集群上。针对三项服务中的每一项重复以下步骤:

    • 导航到 Amazon ECS 控制台左侧的“集群”菜单。
    • 选择您的集群:BreakTheMonolith-Demo-ECSCluster
    • 在“服务”选项卡下,选择“创建”。
    • 配置服务 (请勿修改任何默认值) 任务定义 = 选择 X: [service-name]:X (多数情况下,X 应该 = 1) 的最高值 服务名称 = [service-name] 任务数量 = 1
    • 选择“Configure ELB”(配置 ELB)
      • ELB 类型 = 应用程序负载均衡器
      • 请选择 BreakTheMonolith-Demo-ECSServiceRole 作为 IAM 角色
      • 选择您的负载均衡器“demo”
      • 选择“Add to ELB”(添加至 ELB)
    • 将您的服务添加到目标组:
      • 侦听器端口 = 80:HTTP
      • 目标组名称 = 选择您的组:[service-name]
    • 选择“保存”。
    • 选择“Create Service”(创建服务)。
    • 选择“View Service”(查看服务)。


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

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

    现在,您的微服务正在运行,但所有流量仍然流向整体架构服务。

    更新侦听器规则,将流量重新路由到微服务:

    • 导航到 EC2 控制台的“负载均衡器”部分
    • 选择与“demo”负载均衡器上的侦听器对应的“View/edit rules >”(查看/编辑规则 >) 选项。
    • 删除第一个规则 (/api* forwards to api)。
    • 将默认规则更新为“forward to drop-traffic”。

    您的规则应如下所示:

    将流量转移到微服务

    关闭整体架构:现在,流量将流向微服务,并且您可以关闭整体架构服务。

    • 返回 Amazon ECS 集群“BreakTheMonolith-Demo-ECSCluster”。
    • 选择 api 服务,然后选择“更新”。
    • 将任务数更改为 0
    • 选择“Update Service”(更新服务)。

     

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

    • 选择 api 服务,然后单击“删除”并确认删除。


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

  • 第 6 步:验证您的部署

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

    • 导航到 EC2 控制台的“负载均衡器”部分。
    • 选择您的负载均衡器“demo-microservices”。
    • 将 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。