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

最终的应用程序架构使用 Amazon Elastic Container Service 和应用程序负载均衡器。 

架构概览

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

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

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

d. 使用容器封装服务
Amazon Elastic Container Service (Amazon ECS) 会将每项服务部署到 EC2 群集中的一个容器。每个容器只能处理一项功能。

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

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

单独扩展
将功能拆分成微服务后,可以单独增加和缩减每个微服务类使用的基础设施和实例数量。这可让您更加轻松地衡量特定功能的费用,识别最需要优化的功能,同时在特定功能的资源需求超出控制范围时,确保其他功能性能可靠。

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

时长:20 分钟

使用的服务:


按照下面的分步说明拆分整体架构。单击各个步骤号可展开该部分。

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

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

    我们的三项服务分别是:

    1. users
    2. threads
    3. posts


    创建存储库:

    • 导航到 Amazon ECR 控制台
    • 选择“Create Repository”(创建存储库)
    • 存储库名称:
      • users
      • threads
      • posts
    • 记录存储库信息:[account-id].dkr.ecr.[region].amazonaws.com/[service-name]

    对每项微服务重复这些步骤。

    现在,您在 Amazon ECR 中应该有个存储库了。

    repositories
  • 第 2 步:(可选) 使用 AWS 验证 Docker

    如果您最近完成了本次研讨会的模块 1,可以跳过此步骤。

    • 执行 aws ecr get-login --no-include-email --region [region]
      示例:aws ecr get-login --no-include-email --region us-west-2
    • 您将获得以 docker login -u AWS -p 开头的大量输出...请复制完整输出内容,粘贴在终端中并执行。

    • 您应该可以看到消息“Login Succeeded”(成功登录)

      ⚐ 注意:如果登录不成功,可能是由于较新版本的 Docker 已弃用了 -e none 标志。要解决此问题,请将输出粘贴到文本编辑器中,从输出结尾处删除 -e none,然后在终端执行更新后的输出。

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

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

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

    打开您的终端,并将您的路径设置为 GitHub 代码的 3-microservices/services 部分。~/amazon-ecs-nodejs-microservices/3-microservices/services

    构建和标记每个映像

    • 在终端上执行 docker build -t [service-name] ./[Service-name] 示例:docker build -t posts ./posts
    • 构建完毕后,请标记映像,以便将其推送到存储库:docker tag [service-name]:latest [account-id].dkr.ecr.[Region].amazonaws.com/[service-name]:v1 示例:docker tag posts:latest [account-id].dkr.ecr.us-west-2.amazonaws.com/posts:v1
    • 执行 docker push 将映像推送至 ECR:docker push [account-id].dkr.ecr.[region].amazonaws.com/[service-name]:v1

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

    ♻ 对每个微服务映像重复这些步骤。 

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