В этом модуле приложение node.js будет разбито на несколько взаимосвязанных сервисов, образ каждого из которых будет сохранен в репозитории Amazon ECR. Приступить

В итоговой архитектуре приложения используются Amazon Elastic Container Service и Application Load Balancer. 

обзор архитектуры

a. Клиент
Клиент выполняет запросы трафика на порт 80.

b. Балансировщик нагрузки
Application Load Balancer (ALB) маршрутизирует внешний трафик к нужному сервису. Балансировщик нагрузки ALB проверяет запрос клиента и с помощью правил маршрутизации направляет его на инстанс и порт для целевой группы, соответствующей правилу.

c. Целевые группы
Каждый сервис включает целевую группу, которая отслеживает инстансы и порты для каждого контейнера, запущенного для этого сервиса.

d. Контейнеризованные сервисы
Amazon Elastic Container Service (Amazon ECS) развертывает каждый сервис в контейнере в рамках кластера EC2. Каждый контейнер отвечает только за одну функцию.

Изоляция сбоев
Даже лучшие компании-разработчики сталкиваются с критическими сбоями в ходе своей деятельности. Чтобы свести влияние таких сбоев к минимуму, помимо соблюдения стандартных рекомендаций также следует разрабатывать микросервисы. Преимущество качественной архитектуры микросервисов состоит в том, что сбой затрагивает только один компонент сервиса. Другие компоненты продолжают работать.

Изоляция в целях безопасности
В случае монолитного приложения, если есть брешь в системе защиты хоть одной функции (например, уязвимость, которая позволяет удаленно выполнять код), злоумышленник может получить доступ ко всем другим функциям системы. Если, например, нарушена безопасность функции отправки аватара, злоумышленники могут взломать базу данных с паролями пользователей. Разделение функций между микросервисами с помощью Amazon ECS позволяет обеспечить безопасность доступа к ресурсам AWS, предоставив каждому сервису собственную роль IAM. Если соблюдены рекомендации в отношении микросервисов, при взломе одного сервиса злоумышленник получает доступ только к ресурсам этого сервиса. Для доступа к другим сервисам ему приходится взламывать их по отдельности.

Независимое масштабирование
Если функции разбиты на микросервисы, то используемые каждым классом микросервиса компоненты инфраструктуры и инстансы можно независимо масштабировать в сторону увеличения и уменьшения. Это помогает рассчитать стоимость конкретной функции, определить функции, которые следует оптимизировать в первую очередь, а также обеспечить высокую производительность других функций, если одна из них вышла из-под контроля вследствие нехватки ресурсов.

Скорость разработки
Микросервисы сокращают риски при разработке, тем самым ускоряя ее. Добавление новой функции к монолитному сервису может затронуть все другие его функции. Разработчикам следует тщательно рассмотреть последствия добавления кода и удостовериться, что они ничего не испортят. С другой стороны, правильная архитектура микросервисов включает новый код для функции, которая добавляется в новый сервис. Разработчики могут быть уверены, что никакой создаваемый код не затронет уже имеющийся код, если только не создать явное соединение между двумя микросервисами.

Время выполнения: 20 минут

Используемые сервисы:


Придерживайтесь приведенных ниже пошаговых инструкций, чтобы разбить монолитный сервис. Щелкните номер шага, чтобы развернуть соответствующий раздел.

break-the-monolith
  • Шаг 1. Выделение репозиториев ECR

    На двух предыдущих шагах вы развернули приложение в монолитном виде, используя один сервис и один репозиторий с образами контейнеров. Чтобы развернуть приложение в качестве трех микросервисов, в Amazon ECR необходимо выделить три репозитория (по одному для каждого сервиса).

    Доступны три сервиса:

    1. users
    2. threads
    3. posts


    Создание репозитория

    • Перейдите к консоли Amazon ECR.
    • Выберите «Create Repository» (Создать репозиторий).
    • Имя репозитория:
      • users
      • threads
      • posts
    • Запишите информацию о репозиториях: [идентификатор_аккаунта].dkr.ecr.[регион].amazonaws.com/[имя_сервиса]

    Повторите эти шаги для каждого микросервиса.

    Amazon ECR должен включать четыре репозитория.

    репозитории
  • Шаг 2. Аутентификация Docker с помощью AWS (необязательно)

    Этот шаг можно пропустить, если вы недавно прошли модуль 1 настоящего урока.

    • Выполните команду aws ecr get-login --no-include-email --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 находятся вложенные папки с файлами для каждого сервиса. Обратите внимание, что каждый микросервис по сути представляет собой клон предыдущего монолитного сервиса.

    Теперь можно просмотреть специализацию каждого сервиса, сравнив файл db.json в каждом сервисе и в монолитном сервисе API. Ранее сервисы posts, threads и users хранились в одном файле базы данных. Сейчас каждый из этих элементов хранится в файле базы данных для соответствующего сервиса.

    Откройте терминал и задайте путь, чтобы он указывал на раздел 3-microservices/services кода GitHub. ~/amazon-ecs-nodejs-microservices/3-microservices/services

    Создание образов и обозначение их тегами

    • В терминале выполните команду docker build -t [имя_сервиса] ./[имя_сервиса] Пример: docker build -t posts ./posts
    • Когда образ будет создан, обозначьте его тегом для отправки в репозиторий: docker tag [имя_сервиса]:latest [идентификатор_аккаунта].dkr.ecr.[регион].amazonaws.com/[имя_сервиса]:v1 Пример: docker tag posts:latest [идентификатор_аккаунта].dkr.ecr.us-west-2.amazonaws.com/posts:v1
    • Выполните команду docker push, чтобы отправить образ в ECR: docker push [идентификатор_аккаунта].dkr.ecr.[регион].amazonaws.com/[имя_сервиса]:v1

    Образы в репозитории ECR должны быть обозначены тегом v1. 

    ♻ Повторите эти шаги для каждого образа микросервиса.  

    ⚐ ПРИМЕЧАНИЕ. Обязательно создайте и обозначьте тегами все три образа.