在本模块中,您将使用 Amazon Elastic Container Service (Amazon ECS) 将 EC2 计算实例的托管群集实例化,并以容器的形式部署在群集上运行的映像。开始构建

架构概览

a. 客户端
客户端通过端口 80 向负载均衡器发出请求。

b. 负载均衡器
负载均衡器会将请求分发给所有的可用端口。

c. 目标组
实例会在应用程序的目标组中注册。

d. 容器端口
每个容器运行一个应用程序进程,该进程会在其命名空间内将 node.js 集群父端口绑定到端口 80。

e. 使用容器封装 node.js 整体架构
node.js 集群父端口负责将流量分发给整体式应用程序内的工作线程。虽然此架构已经使用容器进行封装,但仍然是整体架构,因为每个容器的功能都与其余容器相同。

Amazon Elastic Container Service (Amazon ECS) 是一项高度可扩展、高性能的容器管理服务,支持 Docker 容器,并允许您轻松地在 Amazon EC2 实例的托管群集上运行应用程序。 只需进行简单的 API 调用,您便可以启动和停止支持 Docker 的应用程序,查询集群的完整状态,使用各种熟悉的功能,包括安全组、Elastic Load Balancing、EBS 卷和 IAM 角色。

您可以使用 Amazon ECS 根据您的资源需求和可用性要求在您的群集中安排容器的置放。您还可以集成自己的计划程序或第三方计划程序,以满足业务或应用程序的特定要求。

Amazon Elastic Container Service 不收取任何额外费用。您只需为您创建的用于存储和运行应用程序的 AWS 资源 (如 EC2 实例或 EBS 卷) 付费即可。


按照下面的分步说明使用 Amazon ECS 部署 node.js 应用程序。 单击各个步骤号可展开该部分。

break-the-monolith
  • 第 1 步:使用 AWS CloudFormation 启动 ECS 集群

    首先,您将创建一个部署在应用程序负载均衡器后面的 Amazon ECS 集群。

    1. 导航到 AWS CloudFormation 控制台
    2. 选择“创建堆栈”。
    3. 选择“将模板上传到 Amazon S3”,然后从位于 amazon-ecs-nodejs-microservice/2-containerized/infrastructure/ecs.yml 的 GitHub 项目中选择 ecs.yml 文件。选择下一步
    4. 输入 BreakTheMonolith-Demo 作为堆栈名称。使其他参数值保持不变:
      1. 所需容量 = 2
      2. 实例类型 = t2.micro
      3. 大小上限 = 2
    5. 选择下一步
    6. 无需修改此页面上的任何选项。选择“下一步”。
    7. 选中下一页底部的复选框,然后选择“创建”。您将看到以橙色显示的堆栈状态:CREATE_IN_PROGRESS。您可以选择屏幕右上角的“刷新”按钮以查看进度。此过程通常需要不到 5 分钟的时间。
    创建堆栈

    ⚐ 注意:您也可以使用 AWS CLI 部署 AWS CloudFormation 堆栈。只需在您所在的区域添加至此代码,并通过计算机上的 amazon-ecs-nodejs-microservices/3-microservices 文件夹在终端中运行即可。

    $ aws cloudformation deploy \
       --template-file infrastructure/ecs.yml \
       --region <region> \
       --stack-name Nodejs-Microservices \
       --capabilities CAPABILITY_NAMED_IAM
  • 第 2 步:检查您的集群是否正在运行

    检查您的集群
    • 单击进入集群,选择“任务”选项卡,没有任务在运行。
    任务
    • 选择“ECS Instances”(ECS 实例) 选项卡,您将看到 AWS CloudFormation 模板创建的两个 EC2 实例。
    ECS 实例
  • 第 3 步:编写任务定义

    任务定义将指示 Amazon ECS 如何在集群间部署应用程序容器。

    • 导航到 Amazon ECS 控制台左侧的“Task Definitions”(任务定义) 菜单。
    • 选择“Create new Task Definition”(创建新的任务定义)。
    • 任务定义名称 = api
    • 选择“Add Container”(添加容器)。
    • 指定以下参数:
      • 如果某个参数未定义,请将其保留空白或使用默认设置:容器名称 = api 映像 = [account-id].dkr.ecr.[region].amazonaws.com/api:v1 (此为之前步骤中的 ECR 存储库映像的 URL)。
      • 请确保标签 :v1 与您在模块 1 中用于标记的值一致,并推送映像。内存 = 硬性限制256 端口映射 = Host port:0、Container port:3000 CPU 单元 = 256
    • 选择“添加”。
    • 选择“创建”。
    • 现在,您的任务定义将显示在控制台中。
    任务定义
  • 第 4 步:配置应用程序负载均衡器:目标组

    应用程序负载均衡器 (ALB) 可让您的服务接受传入流量。ALB 会自动将流量路由到在集群 (使用容器实例作为目标组) 上运行的容器实例。

    查看您的 VPC 名称:如果您不是第一次使用此 AWS 账户,则可能拥有多个 VPC。请务必使用正确的 VPC 配置您的目标组。

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

    配置 ALB 目标组

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

    侦听器会查看指向您的 ALB 的传入连接请求。

    将侦听器添加到 ALB

    • 导航到 EC2 控制台的“负载均衡器”部分
    • 您应该会看到已存在一个名为“demo”的负载均衡器。
    • 选中复选框以查看负载均衡器的详细信息。
    • 选择“侦听器”选项卡。
    • 选择“创建侦听器”:
      • 协议 = HTTP
      • 端口 = 80
      • 默认目标组 = api
    • 单击“创建”。
    将侦听器添加到 ALB
  • 第 6 步:以服务的形式部署整体架构

    现在,您将以服务的形式将整体架构部署到集群上。

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

    做得不错!您的服务已成功运行。容器可能要过 1 分钟后才能注册为运行正常,并开始接收流量。

  • 第 6 步:测试您的整体架构

    通过检查服务能否通过互联网访问并对其执行 ping 操作,验证您的部署。

    查找您的服务 URL:

    • 导航到 EC2 控制台的负载均衡器部分。
    • 选择您的负载均衡器“demo”。
    • 将 DNS 名称的值复制并粘贴到您的浏览器中。
    • 您应该会看到一条消息:“Ready to receive requests”(可以接收请求了)。


    查看服务的各个部分:
    node.js 应用程序会根据 URL 将流量路由到每个工作线程。要查看工作线程,只需将工作线程名称 api/[worker-name] 添加到 DNS 名称的末尾即可,如下所示:

    • http://[DNS name]/api/users
    • http://[DNS name]/api/threads
    • http://[DNS name]/api/posts

    您还可以在 URL 末尾添加记录编号,以细化到特定记录。如下所示:http://[DNS name]/api/posts/1http://[DNS name]/api/users/2

    用户演示