Описание проектной работы 3
В этом уроке вы познакомитесь с проектной работой третьего спринта. Это поможет вам оценить её сложность и распланировать своё время.
🔍 Обратите внимание: вам не нужно выполнять эти задания прямо сейчас. Можете пропустить этот урок и перейти к изучению теории. В конце спринта будет отдельный урок для сдачи проекта: там мы повторим задания и дадим форму, через которую нужно отправить решение.
Небольшая компания, организующая удалённое управление отоплением в доме, получила заказ на создание экосистемы умных поселков на территории нескольких регионов страны. Необходимые датчики и реле установлены лишь в половине домов, желающих подключиться к целевой экосистеме.
Состояние компании в настоящий момент не позволяет в полной мере реализовать новые бизнес-цели: расширять функционал и масштабироваться. Для этого требуется пересмотр и оптимизация всей экосистемы.
Текущее решение компании
- Нынешнее положение компании позволяет только управлять отоплением в доме и проверять температуру.
- Каждая установка сопровождается выездом специалиста по подключению системы отопления в доме к текущей версии системы.
- Архитектура компании представляет из себя монолит на Java с СУБД Postgres. Всё синхронно. Никаких асинхронных вызовов, микросервисов и реактивного взаимодействия в системе нет. Всё управление идёт от сервера к датчику. Данные о температуре также получаются через запрос от сервера к датчику.
- Самостоятельно подключить свой датчик к системе пользователь не может.
Целевая экосистема, которую необходимо создать
- Экосистема доступна пользователю в режиме самообслуживания по модели SaaS.
- Система позволяет управлять отоплением, включать и выключать свет, запирать и отпирать автоматические ворота, удаленно наблюдать за домом и будущее неуточненное поведение.
- Пользователь самостоятельно выбирает необходимые ему модули умного дома (устройства), сам их подключает, настраивает сценарии работы и просматривает телеметрию.
- Компания не занимается производством устройств, но поддерживает подключение к экосистеме устройств партнеров по стандартным протоколам.
- Веб-разработка передана на аутсорс и не входит в требования данной работы.
Требования к экосистеме
- Модули управления приборами и сами приборы (устройства) должны быть максимально готовы к использованию и продаваться в отдельных комплектах для удобной покупки и подключения.
- Устройства должны быть доступны через интернет (для удаленного наблюдения и доступа), и предполагается, что пользователь будет иметь интернет-канал, к которому их можно подключить.
- Покупатели могут программировать систему для управления различными модулями в соответствии со своими потребностями.
Лэндскейп компании
Структура компании
- Команда разработчиков (5 человек)
- Команда DevOps (2 человека)
- Команда QA (3 человека)
- Команда по обслуживанию клиентов (10 человек)
- Команда по продажам и маркетингу (5 человек)
Команды и продукты, с которыми компания работает в рамках кейса
- Команда разработчиков будет работать над рефакторингом и разделением монолита на микросервисы.
- Команда DevOps будет заниматься настройкой CI/CD пайплайнов, контейнеризацией и оркестрацией.
- Команда QA будет проводить тестирование новой системы.
- Команда по обслуживанию клиентов будет обучена работе с новой системой и предоставлять поддержку пользователям.
- Команда по продажам и маркетингу будет заниматься продвижением новых модульных комплектов.
Развернутые технологии, сервисы и приложения, которые влияют на решение (описание и диаграмма)
- Монолитное приложение на Java с PostgreSQL в качестве СУБД.
- 100 подключенных модулей управления отоплением
- 100 веб-клиентов приложения (веб-разработка передана на аутсорс и не входит в требования данной работы)
Цели бизнеса
Промежуточное состояние (через пару месяцев)
- Описана AsIs и ToBe архитектура решения. Создан план по переходу к целевой системе.
- MVP с разделёнными микросервисами для управления отоплением, освещением, наблюдением, воротами.
Финальное состояние (через год)
- Настроенные CI/CD пайплайны для автоматизации сборки и деплоя платформы экосистемы.
- Полностью развернутая экосистема умного дома с модульной структурой.
- Платформа экосистемы готова к подключению до 100 экопоселков по 200 домов по пять устройств в каждом.
- Пользователи могут самостоятельно подключать новые модули, управлять ими через интернет и настраивать автоматические сценарии работы устройств.
В этой проектной работе всего вас ждёт три задания. Обязательная часть включает первое задание и часть второго. Вам предстоит спроектировать архитектуру и реализовать MVP новой экосистемы, которая будет:
- Модульной и масштабируемой, чтобы легко добавлять новые функции.
- Ориентированной на самообслуживание, чтобы пользователи могли всё делать сами.
- Основанной на микросервисах, чтобы обеспечить гибкость и отказоустойчивость.
Выполнение дополнительной части позволит вам глубже понять принципы Saga, CQRS и некоторых аспектов 12-факторных приложений и получить практические навыки в области контейнеризации, CI/CD и управления микросервисами.
Как работать над заданием
- Создайте репозиторий по шаблону https://github.com/Yandex-Practicum/architecture-sprint-3.
- Создайте в репозитории ветку
project_part_1. В ней вы будете выполнять задания. - Выполните задания и опишите свои решения в файле
Project_template_part_1. Мы заранее добавили его в репозиторий и сохранили туда шаблон для ответов. Вам нужно только заполнить его. - Когда сделаете все задания проекта и опишете свои решения в
Project_template_part_1, создайте пул-реквест из веткиproject_part_1в основную ветку вашего репозитория. Убедитесь, что пул-реквест содержит все изменения, которые вы вносили. Проверьте, что отправляете их в ваш собственный репозиторий, а не в репозиторий Практикума. Это важно: если сделаете ПР в репозиторий Практикума, ревьюер сразу отправит ваше решение на доработку.
Задание 1: Анализ и проектирование
🔍 Первое задание состоит из четырёх частей, в которых вы проанализируете текущее монолитное приложение, выделите микросервисы и спроектируете взаимодействие между ними, визуализируете архитектуру с помощью модели С4, а затем разработаете ER-диаграмму.
Выполнение этого задания займёт 5–7 часов.
Необходимая инфраструктура
- Система контроля версий (например, Git).
- IDE (например, IntelliJ IDEA, VS Code).
- Markdown редактор (например, в том же самом IDE).
- PlantUML-редактор (например, PlantUML plugin for IntelliJ IDEA, online PlantUML editor).
- Шаблон C4 для PlantUML.
Рекомендуемые инструменты
Средства для разработки API (например, Swagger Editor)
Подзадание 1.1: Анализ и планирование
Суть бизнес-задачи
Прежде чем проектировать новую систему, необходимо досконально разобраться с тем, что у нас есть. Вам нужно изучить текущее монолитное приложение, понять его сильные и слабые стороны, а также проанализировать, как принципы Domain-Driven Design (DDD) могут быть применены для построения новой архитектуры.
Что нужно сделать?
- Изучите функциональность монолитного приложения:Управление отоплением:
- Пользователи могут удалённо включать/выключать отопление в своих домах.
- Пользователи могут устанавливать желаемую температуру.
- Система автоматически поддерживает заданную температуру, регулируя подачу тепла.
- Система получает данные о температуре с датчиков, установленных в домах.
- Пользователи могут просматривать текущую температуру в своих домах через веб-интерфейс.
- Проанализируйте архитектуру монолитного приложения:
- Язык программирования: Java
- База данных: PostgreSQL
- Архитектура: Монолитная, все компоненты системы (обработка запросов, бизнес-логика, работа с данными) находятся в рамках одного приложения.
- Взаимодействие: Синхронное, запросы обрабатываются последовательно.
- Масштабируемость: Ограничена, так как монолит сложно масштабировать по частям.
- Развертывание: Требует остановки всего приложения.
- Определите домены и границы контекстов: домен «Управление Устройствами» и так далее.
- Подробно опишите, какие проблемы создаёт монолитного решение для компании в контексте текущих бизнес-задач. Если вы считаете, что текущее решение не вызывает проблем, аргументируйте свою позицию.
- Визуализируйте контекст системы. Создайте C4 диаграмму (System Context diagram) с помощью PlantUML, чтобы наглядно показать, как монолитное приложение взаимодействует с внешним миром (пользователи, датчики).
Мониторинг температуры:
В результате вы
- Изучите функциональность текущего монолитного приложения и поймёте, как оно работает.
- Проанализируете архитектуру монолитного приложения, выявите его сильные и слабые стороны.
- Определите домены и границы контекстов в соответствии с принципами Domain-Driven Design (DDD).
- Создадите C4 диаграмму (System Context diagram), визуализирующую взаимодействие монолитного приложения с внешним миром.
- Подготовите план перехода к микросервисной архитектуре, который будет использоваться в следующих подзаданиях.
Перед отправкой проверьте, что
- Описана функциональность текущего монолитного приложения.
- Проанализирована архитектура монолитного приложения (язык программирования, база данных, архитектура, взаимодействие, масштабируемость, развертывание).
- Определены домены и границы контекстов в системе.
- Создана C4 диаграмма (System Context diagram), визуализирующая взаимодействие монолитного приложения с внешним миром.
- Диаграмма создана с использованием PlantUML и соответствует стандартам C4.
Подзадание 1.2: Архитектура микросервисов
Суть бизнес-задачи
Вы провели анализ текущего монолитного приложения, определили его функциональные блоки и выделили основные домены. Теперь ваша задача — спроектировать высокоуровневую архитектуру новой экосистемы, основанную на микросервисах. Для этого вам нужно определить ключевые микросервисы, спроектировать их взаимодействие с учетом использования API Gateway и Kafka (опционально, взаимодействие между сервисами может быть реализовано напрямую), а также визуализировать полученную архитектуру с помощью диаграмм C4.
Что нужно сделать?
- Декомпозируйте приложение на микросервисы. Основывайте решение на доменах и границах контекстов, которые вы выделили в предыдущем задании, разбейте систему на новые микросервисы. При этом также учитывайте и бизнес-цели компании — они могут потребовать разработки микросервисов с нуля. У вас должны получиться домены как для As-Is решения, так и для To-Be. В ходе декомпозиции ориентируйтесь на наилучшие практики архитектуры микросервисов и паттерны проектирования.
- Определите взаимодействия между:
- микросервисами,
- API Gateway,
- шиной данных ((например, Kafka) (опционально)),
- базой данных.
- Визуализируйте архитектуру, которая у вас получилась:
- C4 — Уровень контейнеров (Containers) Создайте диаграмму, показывающую основные контейнеры (приложения, базы данных, очереди сообщений) и их взаимодействие.
- C4 — Уровень компонентов (Components) Детализируйте взаимодействие внутри выбранных микросервисов, выделив ключевые компоненты и их ответственности. Например, для микросервиса «Управление устройствами» можно выделить компоненты: API, обработчик команд, менеджер состояния устройств.
- C4 — Уровень кода (Code) Для самых критичных частей системы можно создать диаграммы на уровне кода (например, UML диаграммы классов или последовательностей), чтобы детально показать, как они реализованы. Необязательно описывать весь код — выберите только самые критичные части.
В результате вы
- Научитесь разрабатывать архитектуру микросервисов, определять ключевые микросервисы и спроектировали их взаимодействие с использованием API Gateway и, при желании, Kafka.
- Научитесь визуализировать полученную архитектуру с помощью диаграмм C4, что позволит вам получить четкое представление о структуре и взаимодействиях в системе.
Перед отправкой проверьте, что
- Система разбита на микросервисы в соответствии с выделенными доменами и границами контекстов.
- Определено взаимодействие между микросервисами, API Gateway, базой данных и, если используется, шиной данных (например, Kafka).
- Созданы C4 диаграммы на уровне контейнеров (Containers) и компонентов (Components), визуализирующие архитектуру системы.
- При необходимости созданы C4 диаграммы на уровне кода (Code) для самых критичных частей системы.
- Все диаграммы созданы с использованием PlantUML и соответствуют стандартам C4.
Подзадание 1.3: ER-диаграмма
Суть бизнес-задачи
К началу этого подзадания вы определили ключевые микросервисы и спроектировали их взаимодействие с использованием API Gateway и Kafka. А ещё визуализировали полученную архитектуру с помощью диаграмм C4, что позволило вам получить чёткое представление о структуре и взаимодействиях в системе.
В этом задании вам предстоит глубже погрузиться в структуру данных будущей экосистемы. Необходимо определить ключевые сущности (такие как «Устройство», «Модуль», «Пользователь», «Телеметрия») и смоделировать их взаимосвязи, чтобы создать логическую модель базы данных.
Что нужно сделать?
- Идентификация сущностей: На основе анализа предметной области и спроектированных микросервисов, определите основные сущности вашей системы.Примеры сущностей:
- Пользователь (User)
- Дом (House)
- Устройство (Device)
- Тип устройства (DeviceType)
- Модуль (Module)
- Телеметрия (TelemetryData)
- Определение атрибутов: Для каждой сущности определите необходимые атрибуты. Например:Сущность «Устройство»:
id— уникальный идентификатор устройства.type_id— идентификатор типа устройства — внешний ключ к таблицеDeviceType.house_id— идентификатор дома, к которому принадлежит устройство — внешний ключ к таблицеHouse.serial_number— серийный номер устройства.status— текущее состояние устройства (включено/выключено).
- Описание связей: Определите связи между сущностями (один-к-одному, один-ко-многим, многие-ко-многим).Например:
- Пользователь — Дом: один пользователь может иметь доступ к нескольким домам, но каждый дом связан только с одним пользователем.
- Дом — Устройство: один дом может содержать несколько устройств, и каждое устройство принадлежит только одному дому.
- Устройство — Телеметрия: одно устройство может генерировать множество записей телеметрии.
- Построение ER-диаграммы: Используйте PlantUML для создания ER-диаграммы на основе определенных сущностей, атрибутов и связей.
В результате вы
- Разработаете ER-диаграмму, которая описывает основные сущности системы и их взаимосвязи.
- Определите ключевые сущности, например как «Пользователь», «Дом», «Устройство», «Тип устройства», «Модуль» и «Телеметрия».
- опишете атрибуты для каждой сущности и определили связи между ними.
- Создадите ER-диаграмму с использованием PlantUML, что позволит вам визуализировать структуру данных системы и понять, как сущности взаимодействуют друг с другом.
Перед отправкой проверьте, что
- Определены основные сущности системы, например как «Пользователь», «Дом», «Устройство», «Тип устройства», «Модуль» и «Телеметрия».
- Для каждой сущности определены необходимые атрибуты.
- Описаны связи между сущностями (один-к-одному, один-ко-многим, многие-ко-многим).
- Создана ER-диаграмма с использованием PlantUML.
- ER-диаграмма корректно отображает все сущности, их атрибуты и связи между ними.
Подзадание 1.4: Создание и документирование API
Суть бизнес-задачи
После успешной разработки ER-диаграммы вы получили чёткое представление о структуре данных будущей экосистемы. Теперь настало время перейти к следующему этапу — созданию и документированию API.
Микросервисы должны уметь «общаться» друг с другом. Ваша задача — спроектировать API (интерфейс программного приложения) для взаимодействия между двумя ключевыми микросервисами, которые вы определили ранее, например «Управление устройствами» и «Телеметрия». Вам нужно определить необходимые эндпойнты, методы запросов, форматы данных и описать контракты взаимодействия, чтобы микросервисы могли эффективно обмениваться информацией.
Что нужно сделать?
- Выбор типов API: В зависимости от специфики взаимодействия между вашими микросервисами, вы можете использовать:
- REST API: Хорошо подходит для синхронного взаимодействия, когда клиенту (в данном случае — другому микросервису) нужен немедленный ответ на запрос.
- AsyncAPI: Используется для асинхронного взаимодействия, когда клиенту не нужно ждать ответа немедленно (например, отправка уведомления о новом измерении температуры). Kafka может быть использована для реализации асинхронного взаимодействия.
- Проектирование API для микросервиса «Управление устройствами». Например, определите эндпойнты и методы запросов для выполнения основных операций:Получение информации об устройстве:
- Эндпойнт:
/devices/{device_id} - Метод:
GET - Описание: Возвращает подробную информацию о конкретном устройстве по его ID.
- Эндпойнт:
- Эндпойнт:
/devices/{device_id}/status - Метод:
PUT - Описание: Позволяет изменить состояние устройства (например, включить/выключить).
- Эндпойнт:
/devices/{device_id}/commands - Метод:
POST - Описание: Отправляет команду устройству (например, «установить температуру 22 градуса»).
- Проектирование API для микросервиса «Телеметрия»Получение последних данных телеметрии:
- Эндпойнт:
/devices/{device_id}/telemetry/latest - Метод:
GET - Описание: Возвращает последнее полученное значение телеметрии для устройства.
- Эндпойнт:
- Эндпойнт:
/devices/{device_id}/telemetry - Метод:
GET - Описание: Возвращает исторические данные телеметрии для устройства за определённый период времени.
- Описание контрактов взаимодействия:Для каждого эндпойнта укажите:
- Формат запроса: опишите структуру JSON для тела запроса (если применимо).
- Формат ответа: опишите структуру JSON для ответа.
- Коды ответа: укажите HTTP-коды статуса, которые будут возвращаться в различных ситуациях (например, 200 — успех, 404 — устройство не найдено, 500 — ошибка сервера).
- Примеры запросов и ответов: укажите наглядные примеры в блоке examples.
- Документирование API:Используйте Swagger/OpenAPI (для REST API) или AsyncAPI для создания интерактивной документации. Это упростит интеграцию микросервисов и позволит другим разработчикам легко понимать, как использовать ваши API.
Обновление состояния устройства:
Отправка команды устройству:
Получение исторических данных телеметрии:
В результате вы
- Оцените роль API Gateway при проектировании взаимодействия микросервисов.
- Определите, когда необходимо использовать асинхронное взаимодействие, (например через Kafka), и проектировать API с учетом этого.
Перед отправкой проверьте, что
- Выбраны типы API (REST, AsyncAPI или их комбинация) для взаимодействия между микросервисами «Управление устройствами» и «Телеметрия».
- Спроектированы эндпойнты и методы запросов для основных операций микросервисов.
- Описаны контракты взаимодействия для каждого эндпойнта, включая форматы запросов и ответов, коды ответа и примеры.
- Создана интерактивная документация API с использованием Swagger/OpenAPI (для REST API) или AsyncAPI.
- Документация API покрывает все эндпойнты и содержит исчерпывающую информацию для их использования.
Задание 2: Разработка MVP
Подзадание 2.1: Новые микросервисы и интеграция с монолитом
🔹 Это подзадание описывает обязательную часть разработки.
Дополнительная часть, включающая в себя использование Saga, CQRS и некоторых аспектов 12-факторных приложений, будет описана отдельно. Выполнение дополнительной части позволит вам глубже понять принципы построения микросервисной архитектуры и получить опыт работы с передовыми паттернами проектирования.
Суть бизнес-задачи
На этом этапе вам предстоит создать два новых микросервиса: «Управление телеметрией» и «Управление устройствами». Эти микросервисы будут выполнять базовые функции, соответствующие своим названиям, и интегрироваться с существующим монолитным приложением. Взаимодействие между микросервисами и монолитом может осуществляться через шину данных Kafka (опционально), что позволит постепенно переносить функциональность из монолита в микросервисы, или напрямую, если вы решите не использовать Kafka на данном этапе.
- Микросервис «Управление телеметрией»: Ответственен за приём, обработку и хранение данных телеметрии от устройств.
- Микросервис «Управление устройствами»: Отвечает за регистрацию новых устройств, управление их состоянием (вкл/выкл) и отправку команд.
Необходимая инфраструктура
- Система контроля версий Git для хранения кода.
- IDE для разработки (например, IntelliJ IDEA, VS Code).
- Postman для тестирования API.
- СУБД: Выберите и разверните СУБД, подходящую для ваших микросервисов, основываясь на ER-диаграмме, разработанной в Задании 1.
🔍 Фронтенд для взаимодействия с микросервисами не является обязательным на данном этапе.
Что нужно сделать?
- Выбор языка программирования: Выберите язык программирования для реализации микросервисов, основываясь на ваших знаниях и предпочтениях.
- Создание проекта: Создайте новый проект для каждого микросервиса в вашей IDE и настройте систему контроля версий Git.
- Разработка API: Используя спецификацию OpenAPI, определите эндпойнты, методы запросов, форматы данных и коды ответов для API каждого микросервиса.
- Реализация логики микросервисов: Напишите код для обработки запросов к API, взаимодействия с брокером сообщений Kafka (опционально) и выполнения бизнес-логики.
- Интеграция с СУБД: Реализуйте взаимодействие микросервисов с выбранной СУБД для сохранения и получения данных, соответствующих сущностям и связям из ER-диаграммы.
- Интеграция с монолитом: Настройте взаимодействие микросервисов с существующим монолитным приложением (опционально: через брокер сообщений Kafka, или напрямую), чтобы была возможность постепенно переходить с монолита на микросервисы.
- Взаимодействие с монолитом (через REST API):
- Микросервис «Управление устройствами» предоставляет REST endpoint
/devices/{deviceId}/status, который принимает HTTP PUT-запросы с JSON-телом, содержащим новое состояние устройства ({"status": "on/off"}). Монолит может вызывать этот endpoint для изменения состояния устройства. - Микросервис «Управление телеметрией» предоставляет REST endpoint
/telemetry, который принимает HTTP POST-запросы с JSON-телом, содержащим данные телеметрии. Монолит, получая данные от датчиков, может отправлять их на этот endpoint для сохранения.
- Микросервис «Управление устройствами» предоставляет REST endpoint
- Взаимодействие с монолитом (через REST API):
- Взаимодействие с монолитом (через Kafka):
- Микросервис «Управление устройствами» подписывается на Kafka-топик
device_commandsи ожидает сообщений с командами для устройств. Монолит публикует сообщения в формате JSON, например,{"deviceId": 123, "command": "turn_on"}. - Микросервис «Управление устройствами» публикует сообщения о статусе устройств в Kafka-топик
device_statuses. Монолит может подписаться на этот топик и получать актуальную информацию о состоянии устройств. - Микросервис «Управление телеметрией» подписывается на Kafka-топик
sensor_dataи ожидает сообщений с данными от датчиков. Монолит, получая данные от датчиков, публикует их в этом топике в формате JSON, например,{"deviceId": 123, "temperature": 25.5}.
- Микросервис «Управление устройствами» подписывается на Kafka-топик
- Развертывание в Minikube:
- Установите и запустите Minikube.
- Создайте Kubernetes Deployment и Service для каждого микросервиса. Подробнее о Kubernetes
- Если используется Kafka, разверните Kafka в Minikube, используя, например, Helm chart. Подробнее о Helm
- Настройте взаимодействие между микросервисами и монолитом, используя Kubernetes Service для адресации.
Дополнительная часть (опционально):
- Проектирование с помощью Saga: Реализуйте паттерн Saga для управления распределенными транзакциями между микросервисами, если это необходимо. Использование Saga позволит обеспечить согласованность данных в распределенной системе. Подробнее о Saga.
- Применение CQRS: Разделите операции чтения и записи данных в микросервисах с помощью паттерна CQRS, если это целесообразно. CQRS позволит оптимизировать производительность системы и упростить масштабирование. Подробнее о CQRS.
- Расширенное применение 12-факторных приложений: Примените дополнительные принципы 12-факторных приложений, такие как конфигурация через переменные окружения, логирование в stdout и независимое масштабирование. Это сделает ваши микросервисы более переносимыми, масштабируемыми и простыми в развертывании.
- Использование Kafka кластера: Разверните полноценный Kafka кластер для обеспечения отказоустойчивости и масштабируемости. Kafka кластер обеспечит высокую доступность и пропускную способность системы.
Перед отправкой проверьте, что
Обязательные пункты:
- Созданы два микросервиса: «Управление телеметрией» и «Управление устройствами».
- Микросервисы реализованы на одном из языков программирования.
- Микросервисы работают с выбранной СУБД.
- Реализованы все сущности и связи, определенные в ER-диаграмме.
- Для каждого микросервиса разработано API, соответствующее спецификации OpenAPI.
- Микросервисы развернуты в Minikube.
- Настроено взаимодействие микросервисов с монолитом (опционально: через Kafka, или напрямую).
- Код микросервисов добавлен в Git репозиторий.
Дополнительные пункты:
- Реализован паттерн Saga для управления распределёнными транзакциями (если применимо).
- Применён паттерн CQRS для разделения операций чтения и записи (если применимо).
- Применены дополнительные принципы 12-факторных приложений.
- Развернут полноценный Kafka-кластер.
Подзадание 2.2: Подготовка 3rd party сервисов для связи микросервисов
🔍 В данном задании не требуется реализовывать фронтенд. Основная цель — настроить взаимодействие между микросервисами и внешним миром через Kafka и API Gateway.
Суть бизнес-задачи
В рамках этого подзадания вам предстоит настроить инфраструктурные сервисы Kafka (опционально) и API Gateway для взаимодействия микросервисов и внешнего мира. Вам нужно выбрать и развернуть API Gateway. В качестве API Gateway вы можете использовать, например, Kusk Gateway.
Что такое Kusk Gateway?
Kusk Gateway — это open-source шлюз API, предоставляющий возможности для управления API на основе спецификации OpenAPI.
Преимущества использования Kusk Gateway:
- Упрощенное управление API: Kusk Gateway позволяет определить маршрутизацию, политики безопасности, ограничения скорости и другие настройки API непосредственно из спецификации OpenAPI.
- Интеграция с Kubernetes: Kusk Gateway разработан специально для работы в Kubernetes и легко интегрируется с Ingress.
- Расширяемость: Kusk Gateway предоставляет возможность расширения функциональности с помощью плагинов.
- Настройка Kafka(опционально): Если вы выбрали использовать Kafka в предыдущем подзадании, Необходимо развернуть и настроить кластер брокера сообщений Kafka для организации асинхронного обмена данными между микросервисами. Kafka обеспечит надёжную и масштабируемую коммуникацию между микросервисами.
- Настройка API Gateway: Требуется развернуть и настроить шлюз API, который будет выступать единой точкой входа для всех внешних запросов к микросервисам. API Gateway упростит взаимодействие клиентов с микросервисами, обеспечит безопасность и балансировку нагрузки.
Необходимая инфраструктура
- Микросервисы «Управление телеметрией» и «Управление устройствами» из предыдущего задания 2.1.
- Helm charts для Kafka и API Gateway (например, Kong, Traefik, Ambassador, Kusk Gateway).
Что нужно сделать?
- Развертывание Kafka (опционально): Если вы используете Kafka, разверните её в Minikube с помощью Helm chart.
- Настройка Kafka (опционально): Настройте Kafka на прием сообщений от микросервисов и передачу их нужным потребителям.
- Развертывание API Gateway: Разверните API Gateway, (например, Kusk Gateway) в Minikube, используя Helm chart.
- Настройка API Gateway: Настройте маршрутизацию запросов от внешних клиентов к соответствующим микросервисам, используя Kubernetes Ingress и Services.
- Интеграция микросервисов: Подключите микросервисы «Управление телеметрией» и «Управление устройствами» к выбранной системе обмена сообщениями (например, Kafka, если она используется) для асинхронного обмена данными. Если вы не используете Kafka, настройте прямую интеграцию между микросервисами.
- Тестирование: Протестируйте взаимодействие между микросервисами и API Gateway. Убедитесь, что запросы от клиентов правильно маршрутизируются и обрабатываются.
Важно: В данном задании не требуется реализовывать фронтенд (необязательно). Основная цель — настроить взаимодействие между микросервисами и внешним миром через Kafka (опционально) и API Gateway.
Перед отправкой проверьте, что
Обязательные пункты:
- Развернут и настроен API Gateway в Minikube.
- Микросервисы «Управление телеметрией» и «Управление устройствами» подключены к Kafka (опционально).
- API Gateway настроен на маршрутизацию запросов к микросервисам.
- Протестировано взаимодействие между микросервисами и API Gateway (запросы корректно маршрутизируются и обрабатываются).
Дополнительные пункты:
- Развернут и настроена Kafka в Minikube.
- Реализована балансировка нагрузки на API Gateway.
- Настроены механизмы безопасности на API Gateway (например, аутентификация, авторизация).
- Проведены нагрузочные тесты для проверки работоспособности Kafka и API Gateway под нагрузкой.
Задание 3: Автоматизация поставки (опционально)
🔍 Выполнение этого задания опционально, но поможет вам получить практические навыки в области контейнеризации, CI/CD и управления микросервисами. Все эти навыки являются неотъемлемой частью современной разработки программного обеспечения.
Если вы не сталкиваетесь с подобными задачами в своей работе, можете пропустить это задание.
Подзадание 3.1: Контейнеризация микросервисов
Суть бизнес-задачи
В этом подзадании вам предстоит «упаковать» ваши микросервисы и фронтенд в Docker-контейнеры и подготовить систему к запуску в Minikube. Контейнеризация позволит запускать вашу систему в различных средах (на локальной машине, в тестовой среде, в продакшн) без необходимости каждый раз настраивать окружение.
Вам необходимо создать Docker-контейнеры для каждого из ваших микросервисов («Управление телеметрией», «Управление устройствами») и для фронтенда, а также конфигурацию для запуска системы целиком в Minikube. Каждый контейнер должен содержать все необходимые зависимости и конфигурацию для запуска соответствующего компонента системы. Выполнение данного задания необходимо для того, чтобы унифицировать способ запуска сервисов, упростить его и избавиться от проблем совместимости при запуске в различных окружениях.
Необходимая инфраструктура
- Система контроля версий для хранения артефактов: Git (GitHub, GitLab, Bitbucket)
- Хранилище артефактов: GitHub Container Registry необходимо для хранения Docker образов ваших микросервисов. Это позволит вам централизованно управлять версиями образов и легко развертывать их в различных окружениях.
- Minikube: Для развертывания и запуска ваших микросервисов.
- Helm: Для управления развертыванием приложений в Kubernetes.
- Kafka, API GW шаблон в виде docker-compose: Docker Compose файл для запуска Kafka и API Gateway, который вы создали в Задании 2.
- Микросервисы и фронт (необязательно) для интеграции с Kafka и API GW из подзадачи 2.1: Исходный код ваших микросервисов и фронтенда (необязательно).
Что нужно сделать?
- Создайте Dockerfile для каждого микросервиса:
- Укажите базовый образ, который содержит необходимые зависимости (например, Java, Python).
- Скопируйте код вашего микросервиса в образ.
- Установите зависимости, специфичные для вашего микросервиса.
- Укажите команду для запуска вашего микросервиса при запуске контейнера.
- Создайте Dockerfile для фронтенда:
- Аналогично создайте Dockerfile для вашего фронтенда, учитывая его специфику.
- Создайте Helm чарты:
- Опишите все ваши сервисы (микросервисы, Kafka, API Gateway, фронтенд (необязятельно)).
- Укажите Docker образы, которые будут использоваться.
- Укажите, как сервисы должны быть связаны друг с другом (порты, сети).
- Используйте Kubernetes Deployment для запуска контейнеров.
- Используйте Kubernetes Service для обеспечения доступа к сервисам.
- Соберите Docker-образы:
- Используйте команду
docker buildдля сборки образов для каждого микросервиса и фронтенда.
- Используйте команду
- Загрузите образы в хранилище артефактов:
- Используйте команду
docker pushдля загрузки образов в GitHub Container Registry или другое хранилище.
- Используйте команду
- Запустите сервисы с помощью Helm:
- Используйте команду
helm installдля запуска всех сервисов, описанных в вашем Helm chart.
- Используйте команду
- Протестируйте работу сервисов:
- Убедитесь, что все сервисы запускаются без ошибок и взаимодействуют друг с другом должным образом.
Перед отправкой проверьте, что
- Dockerfile:
- Создан Dockerfile для каждого микросервиса и фронтенда.
- В Dockerfile указан базовый образ с необходимыми зависимостями.
- Код микросервиса/фронтенда скопирован в образ.
- Установлены специфичные зависимости.
- Указана команда для запуска микросервиса/фронтенда.
- Helm:
- Создан Helm chart.
- В Helm chart файле описаны все сервисы (микросервисы, API Gateway, фронтенд).
- Указаны связи между сервисами (порты, сети).
- Использованы Kubernetes Deployment и Service.
- Сборка и загрузка образов:
- Docker-образы собраны для каждого микросервиса и фронтенда.
- Docker-образы загружены в хранилище артефактов.
- Запуск и тестирование:
- Все сервисы успешно запускаются с помощью Helm в Minikube.
- Сервисы взаимодействуют друг с другом без ошибок.
- Протестирована работоспособность системы в целом.
Подзадание 3.2: Настройка CI/CD пайплайнов
Суть бизнес-задачи
Теперь, когда ваши микросервисы «упакованы» в Docker-контейнеры, вы можете автоматизировать процесс их сборки, тестирования и развертывания с помощью CI/CD пайплайнов. Автоматизация этих процессов позволит вам быстрее и чаще выпускать новые версии вашего приложения, а также уменьшить количество ошибок при развертывании. GitHub Actions предоставляет удобный и гибкий инструмент для создания CI/CD пайплайнов непосредственно в вашем репозитории GitHub.
Ваша задача — настроить CI/CD пайплайны для каждого микросервиса и фронтенда. CI/CD пайплайны позволят автоматизировать следующие этапы:
- Сборка: автоматическая сборка новых версий ваших микросервисов и фронтенда при каждом изменении кода.
- Тестирование: автоматический запуск тестов для проверки работоспособности новых версий в Minikube.
- Развёртывание: автоматическое развёртывание новых версий в Kubernetes кластер.
Настройка CI/CD пайплайнов позволит вам ускорить процесс разработки и доставки вашего приложения, повысить его качество и снизить риск ошибок при развертывании.
Необходимая инфраструктура
- Сервер автоматизации (Github): Github Actions.
- Minikube: Для развёртывания и запуска ваших микросервисов.
- Helm: Для управления развертыванием приложений в Kubernetes.
- Система контроля версий для хранения артефактов: Git (GitHub).
- Хранилище артефактов: GitHub Container Registry.
- Kafka, API GW шаблон в виде docker-compose: Docker Compose файл для Kafka и API Gateway.
Что нужно делать?
- Создайте Helm чарты для каждого микросервиса и фронтенда:
- Helm чарт — это пакет для развертывания приложений в Kubernetes.
- Опишите в Helm чарте, как ваш микросервис или фронтенд должен быть развернут (какие образы использовать, какие ресурсы выделять).
- Создайте CI/CD пайплайн для каждого микросервиса и фронтенда:
- Используйте Github Actions для описания шагов вашего пайплайна.
- Опишите шаги для сборки, тестирования, загрузки образов в хранилище артефактов и обновления Helm релиза в Minicube.
- Настройте триггеры для запуска пайплайнов:
- Настройте пайплайны на запуск при каждом пуше кода в репозиторий.
- Проверьте работу пайплайнов:
- Сделайте изменения в коде одного из микросервисов или фронтенда.
- Убедитесь, что пайплайн запускается автоматически и успешно выполняет все этапы (сборка, тестирование, развертывание).
Перед отправкой проверьте, что
- Helm:
- Созданы Helm чарты для каждого микросервиса и фронтенда.
- В Helm чартах указаны необходимые ресурсы и зависимости для развертывания.
- CI/CD пайплайны:
- Созданы CI/CD пайплайны для каждого микросервиса и фронтенда.
- Пайплайны настроены на автоматический запуск при пуше кода в репозиторий.
- Пайплайны выполняют сборку, тестирование и развертывание микросервисов/фронтенда.
- Пайплайны интегрированы с Minicube и Helm для развертывания.
- Автоматизация:
- Проверено автоматическое обновление микросервисов/фронтенда при изменении кода.
- Настроено автоматическое масштабирование микросервисов.
Как сдать работу
Решите задания. Опишите свои решения в файле
Readme.md. Вставьте ссылку на пул-реквест во вкладке «Ревью».После того как отправите ссылку, не вносите изменения в проект. Сдайте проект и дождитесь комментариев ревьюера.
На что будет смотреть ревьюер
Ревьюер не примет работу, если она не будет соответствовать требованиям:
- Репозиторий с решением публичный. Перед отправкой убедитесь, что репозиторий в вашем GitHub публичный. Иначе ревьюер не сможет проверить работу.
- В работе нет вопросов к ревьюеру по условиям задания. Если у вас возникнут вопросы по проектной работе, обратитесь к наставнику в Пачке — он вам поможет. Ревьюер проверяет уже готовое решение.
- Если вы повторно отправляете проект на ревью, вы исправили замечания ревьюера с прошлой проверки.