在本模块中,您要将 node.js 应用程序拆分成多项互联服务,并将每项服务的映像推送到 Amazon Elastic Container Registry (Amazon ECR) 存储库。 开始构建

最终的应用程序架构使用 Amazon Elastic Container Service (Amazon ECS) 和 Application Load Balancer (ALB)。 

架构概览

a.客户端
客户端通过端口 80 发出流量请求。

b.负载均衡器
ALB 将外部流量路由到相应的服务。ALB 可检测客户端请求,并根据路由规则将请求定向至符合规则的目标组的实例和端口。

c.目标组
每项服务都有一个目标组,用于跟踪该服务运行的每个容器的实例和端口。

d.微服务
Amazon ECS 会将每项服务部署到 EC2 集群中的一个容器。每个容器只能处理一项功能。

隔离崩溃
即使最好的工程组织在生产环境中也会遇到严重的崩溃情况。除了从容按照所有标准最佳实践处理崩溃外,还有一种方法可以降低此类崩溃的影响,那就是构建微服务。好的微服务架构意味着,如果服务中的一个微小部分崩溃,则只有该部分服务会中断。其余部分的服务可以继续正常运行。

通过隔离确保安全
在整体式应用程序中,如果应用程序的某项功能存在安全漏洞(例如允许远程执行代码的漏洞),则您必须假定攻击者可能也获得了访问系统其他所有功能的权限。这可能会很危险,例如,如果您的头像上传功能存在安全问题,最终的结果会是包含用户密码的数据库遭到入侵。如果使用 Amazon ECS 将功能拆分成微服务,您便可以通过向每项服务授予其自己的 AWS Identity and Access Management (IAM) 角色,确保安全访问 AWS 资源。如果遵循了微服务最佳实践,那么当攻击者入侵某项服务时,他们只能获得该服务的资源的访问权限,但不能水平访问其他服务的其他资源,也无法入侵这些服务。

单独扩展
将功能拆分成微服务后,可以单独增加和缩减每个微服务类使用的基础设施和实例数量。这样一来,可以更加轻松地测量特定功能的成本,及确定可能需要先优化的功能。如果某个特定功能在其资源需求方面存在问题,其他功能将不会受影响,且可以维护可靠的性能。

开发速度
微服务可以降低开发风险,这可帮助团队加快构建速度。在整体式架构中,添加新功能可能会影响整体式架构包含的其他所有功能。开发人员必须慎重考虑他们添加的任何代码的影响,并确保它们不会扰乱任何功能。另一方面,对于转入新服务的新功能,适当的微服务架构具有相应的新代码。开发人员可以确信,他们编写的任何代码确实都不会影响现有的代码,除非他们在两项微服务之间明确编写连接。

时长:20 分钟

使用的服务


请按照下面的分步说明拆分整体式架构。选择各个步骤编号可展开相应部分。

break-the-monolith
  • 第 1 步:预置 ECR 存储库

    在前面的两个模块中,您使用单项服务和单个容器镜像存储库以整体式架构的形式部署了应用程序。要以三项微服务的形式部署应用程序,您需要在 Amazon ECR 中预置三个存储库(一个存储库用于一项服务)。

    我们的三项服务分别是:

    1. users
    2. threads
    3. posts

    为每项服务重复以下步骤,以创建三个存储库:

    • 导航到 Amazon ECR 控制台
    • 选择创建存储库
    • 创建存储库页面的存储库名称字段中,为服务(posts、threads 或 users)创建一个存储库。
      ⚐ 注意:对于标签稳定性选项,请保留默认设置。

    您在 Amazon ECR 中应该有四个存储库。记录您创建的每个微服务的存储库信息。接下来的步骤将需要此信息。您需要的信息采用以下格式:
    [account-id].dkr.ecr.[region].amazonaws.com/[service-name]

    存储库
  • 第 2 步:使用 AWS 对 Docker 进行身份验证(可选)

    您将需要访问 Docker 来为每项服务构建和推送镜像。如果您在不同的时间点学习本课程,您可能已经退出 Docker。如果是这样,请采取以下措施再次登录 Docker。

    • 运行 $(aws ecr get-login --no-include-email --region [your-region])
      替换 [your-region],例如:$(aws ecr get-login --no-include-email --region us-west-2)

    如果身份验证成功,您将收到确认消息:登录成功

  • 第 3 步:构建并推送每项服务的镜像

    您在项目文件夹 amazon-ecs-nodejs-microservices/3-microservices/services 中有包含每项服务文件的文件夹。请注意,每项微服务基本上都是之前的整体式服务的克隆。

    现在,通过对比每项服务和整体式 api 服务中的文件 db.json,您可以了解每项服务是如何实现专项化的。之前,posts、threads 和 users 都存储在一个数据库文件中。现在,每一项都存储在各自服务的数据库文件中。

    打开您的终端,并将您的路径设置为 ~/amazon-ecs-nodejs-microservices/3-microservices/services

    构建和标记每个镜像

    • 在终端中运行 docker build -t [service-name] ./[service-name]
      替换 [service-name],例如:docker build -t posts ./posts

    • 构建完成后,标记镜像,以便将其推送到存储库:
      docker tag [service-name]:latest [account-ID].dkr.ecr.[region].amazonaws.com/[service-name]:v1
      替换 [service-name][account-ID][region],例如:docker tag posts:latest [account-id].dkr.ecr.us-west-2.amazonaws.com/posts:v1

    • 将您的镜像推送至 ECR:docker push [account-id].dkr.ecr.[region].amazonaws.com/[service-name]:v1
      替换 [service-name][account-ID][region]

    如果您导航到 ECR 存储库,应该会看到镜像标记为 v1。 

    ♻ 对每个微服务镜像重复上述步骤。 

    ⚐ 注意:请务必构建并标记全部三个镜像。