В этом модуле приложение 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. Если соблюдены рекомендации в отношении микросервисов, при взломе одного сервиса злоумышленник получает доступ только к ресурсам этого сервиса. Для доступа к другим сервисам ему приходится взламывать их по отдельности.
Независимое масштабирование
Если функции разбиты на микросервисы, то используемые каждым классом микросервиса компоненты инфраструктуры и инстансы можно независимо масштабировать в сторону увеличения и уменьшения. Это помогает рассчитать стоимость конкретной функции, определить функции, которые следует оптимизировать в первую очередь, а также обеспечить высокую производительность других функций, если одна из них вышла из-под контроля вследствие нехватки ресурсов.
Скорость разработки
Микросервисы сокращают риски при разработке, тем самым ускоряя ее. Добавление новой функции к монолитному сервису может затронуть все другие его функции. Разработчикам следует тщательно рассмотреть последствия добавления кода и удостовериться, что они ничего не испортят. С другой стороны, правильная архитектура микросервисов включает новый код для функции, которая добавляется в новый сервис. Разработчики могут быть уверены, что никакой создаваемый код не затронет уже имеющийся код, если только не создать явное соединение между двумя микросервисами.