Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Инструменты для работы с Архитектурой as Code

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on. →

Инструменты для работы с Архитектурой as Code

Слайды в pptx и подробности: https://t.me/rsa_enc/321

IT-архитектура, представленная просто картинкой (схемой) имеет ряд недостатков — она может быть не актуальной, она не говорит о принципах и паттернах используемых при проектировании и она никак не контролирует дальнейшую разработку на соответствие первоначальному замыслу архитектора. В своем докладе я расскажу как решить все эти проблемы и в автоматическом режиме проверять, что они не вернулись вновь. Поговорим о моей предлагаемой методике покрытия архитектуры тестами и автогенерации архитектуры as Code из инфраструктуры as Code. Я поделюсь OpenSource репозиторием с примерами и инструментами для внедрения тестов и автогенерации архитектуры на ваших проектах!
Инструменты подойдут и для Solution-архитектуры микросервисов, и для Enterprise архитектуры ландшафта предприятия, если у вас уже внедрён подход InfrastructureAsCode.

Ещё больше об ИТ-архитектуре в моём телеграм-канале: https://t.me/rsa_enc
Подписывайтесь :)

Avatar for Ruslan Safin

Ruslan Safin

August 22, 2024

More Decks by Ruslan Safin

Other Decks in Technology

Transcript

  1. Технический директор и архитектор в Бындюсофт Автор и преподаватель курса

    по микросервисной архитектуре в ИТМО Член программных комитетов CodeFest и TechLeadConf Руслан Сафин 2
  2. 3 Byndyusoft — 12 лет на рынке Создаём IT-продукты для

    на заказ. Нам доверяют ключевые сервисы, от которых зависит бизнес.
  3. ИТ-архитектура «Фундаментальная организация системы, реализованная в её компонентах, их взаимоотношениях

    друг с другом и средой и принципах, определяющих её конструкцию и развитие» © стандарт ANSI/IEEE Std 1471-2000 5
  4. — — Версионирование — Работа с ветками — Синхронизация с

    исполняемым кодом — Возможности интеграции Картинка + — Наглядность 7
  5. + — Версионирование — Работа с ветками — Синхронизация с

    исполняемым кодом — Возможности интеграции Код — — Наглядность 8
  6. + — Наглядность — Версионирование — Работа с ветками —

    Синхронизация с исполняемым кодом — Возможности интеграции Код → Картинка 9
  7. Архитектура микросервисов в PlantUML System_Ext(goods, “Goods Repo") System_Ext(stock, “Stock") Container(bff,

    “BFF", "NestJS") Container(task_repository, “Task Repo", "NestJS”) Rel(bff, goods, "Get products", “API Gateway") Rel(task_repository, stock, “Send task", $tags="async") Rel(bff, task_repository, "Get task", “REST") 12
  8. 13

  9. Преимущества архитектуры «as code» — Унификация — Полностью аналогичный работе

    с кодом процесс: — Версионирование — Ветки — PullRequest’ы — Merge — … — Возможность автоматизации 14
  10. 22

  11. Типы тестов — Актуальна ли архитектура реальному положению дел на

    проде? — Соблюдает ли архитектура выбранные принципы проектирования и договоренности команды? 24
  12. Архитектура микросервисов в PlantUML System_Ext(goods, “Goods Repo") System_Ext(stock, “Stock") Container(bff,

    “BFF", "NestJS") Container(task_repository, “Task Repo", "NestJS”) Rel(bff, goods, "Get products", “API Gateway") Rel(task_repository, stock, “Send task", $tags="async") Rel(bff, task_repository, "Get task", “REST") 26 github.com/byndyusoft/aact/blob/main/architecture/C4L2.pu ml
  13. — Сложность извлечения данных — Отсутствие инфраструктурных данных Откуда брать

    актуальные зависимости сервисов? Код сервисов + Первоисточник поведения сервисов 27
  14. — Нет «редких» связей — Сложность симуляции на препроде —

    Данные только после появления трафика Откуда брать актуальные зависимости сервисов? Service Mesh + Реальный трафик 28
  15. 30

  16. Откуда брать актуальные зависимости сервисов? k8s configs + Все связи,

    включая «редкие» + Бóльшая информативность + Данные не требуют трафика 31
  17. Сравниваем данные из архитектуры и конфигов [ Сервис1 { [

    связь1, связь2 ] }, Сервис2 { [ связь1, связь2 ] }, ] [ Сервис1 { [ связь1, связь3 ] }, Сервис2 { [ связь1 ] }, Сервис3 ] 33
  18. 34

  19. Пример — сопоставление списка сервисов it("finds diff in configs and

    uml containers", () => { const namesFromDeploy = deployConfigs.map((x) => x.name); const containerNamesFromPuml = containersFromPuml .filter((x) => x.type == "Container") .map((x) => x.name); expect(namesFromDeploy).toEqual(containerNamesFromPuml); }); github.com/byndyusoft/aact/blob/ac05e3217ac4bc8d621ebbd1323ac9c86a828956/test/architecture.test.ts#L43
  20. Output Container name bff ✅ Container name task_repository❌ Container name

    invoice_acl ✅ -------------------------------------------------------- First failed container name task_repository -------------------------------------------------------- FAIL test/architecture.spec.ts • Architecture › finds diff in configs and uml dependencies expect(received).toEqual(expected) // deep equality - Expected - 1 + Received + 1 Array [ “bff", - “stock", + “goods", “invoice", github.com/byndyusoft/aact/actions/runs/6603088421/job/17935846325#step:5:67 36
  21. Что ещё можно проверять по конфигу? Всё, что есть в

    конфиге и важно отразить на архитектуре ☺ Например: • Тип и параметры связей • Параметры контейнеров • Репликация и автоскейлинг • Разделение по хостам и дата-центрам • Метрики мониторинга • Форматирование и конвенции • … 37
  22. 39 Фрукт – фрукт! Но если мы проверяем соответствие 1

    к 1 — почему бы просто не сгенерировать одно из другого?
  23. 40

  24. Берём данные из конфигов [ Сервис1 { [ связь1, связь2

    ] }, Сервис2 { [ связь1, связь3 ] }, ... ]
  25. Сигнал о нарушении принципов: • Stable Dependencies Principle: Depend in

    the direction of stability • Stable Abstractions Principle: A component should be as abstract as it is stable 49
  26. s v Генерировать постоянно 52 Внести изменения в единожды сгенерированное

    Если второе — у нас есть тесты на актуальность!
  27. Перейдем сразу к примерам в формате: 1. Принцип 2. Договоренность

    об его использовании 3. Как протестировать 55
  28. 1. ACL (Anti-corruption Layer) Pattern За интеграцию с внешними системами

    ответственны отдельные микросервисы-адаптеры, инкапсулирующие в себе знания о внешних системах (например, об их доменных сущностях) 56
  29. 1. ACL (Anti-corruption Layer) Pattern Как протестить: 1. помечаем на

    архитектуре соответствующие микросервисы признаком Adapter 2. проверяем, что связи с внешними системами имеют только сервисы с таким признаком Container(goods_adapter, “Goods ACL", "NestJS", $tags="adapter") 58
  30. 2. Пассивные Repository Микросервисы, отвечающие за доступ к мастер-данным, не

    обладают дополнительной логикой и не имеют зависимостей помимо своей БД. 59
  31. 2. Пассивные Repository Как протестить: 1. Помечаем на архитектуре соответствующие

    микросервисы признаком Repository 2. Проверяем, что у таких сервисов нет исходящих связей, кроме единственной БД Rel(task_repository, task_db, "") Rel(camunda, task_repository, "") Rel(task_repository, invoice_acl, "") 61
  32. Чуть больше принципов в моей статье: 62 Покрытие архитектуры as

    Code тестами Статья стала статьёй года на Хабре в номинации Бэкенд
  33. Тестируем не только принципы проектирования, а любые ADR: • Отказоустойчивость

    • Тегирование критичности сервисов • Правила репликации и автоскейлинга по критичности • Разделение сервисов по хостам и дата-центрам • Наличие DLQ • Наблюдаемость • Поставка метрик в мониторинг • MAX потенциальная сумма требуемых ресурсов • … 64
  34. Проблемы архитектурных схем 0. Их отсутствие ✅ 1. Неактуальность ✅

    2. Декларативность✅ 3. Отсутствие контроля 65
  35. Предписания архитекторов могут нарушаться по незнанию или умышленно • Упавшие

    тесты отсеют нарушения по незнанию • Обязательный апрув архитектора для PR в тестах и архитектуре отсеют недобросовестные нарушения 66 Архитектурные изменения не пройдут мимо архитектора
  36. Личный опыт • 2 чел/нед разработчика • 2 чел/нед архитектора

    • 0,5 чел/нед девопса В «продакшне» почти год 67
  37. Личный опыт, решённые проблемы • Актуализировали архитектуру • Привели к

    единым конвенциям • Нашли топики кафки с продьюсерами, но без подписчиков • Нашли неиспользуемые REST-зависимости в конфигах и коде • Актуализировали понимание внешних систем • Измерили и зафиксировали архитектурный техдолг • Переключили на API Gateway все необходимые зависимости • Убрали дублирование в конфигах 68
  38. Как начать применять? 1. github.com/Byndyusoft/aact 2. Библиотека по работе с

    PlantUML (или аналогом) на вашем стэке 3. Маппинг вашего варианта InfractructureAsCode в термины архитектуры 4. Генерация и тесты 5. 💰💰💰 70
  39. Roadmap репозитория • Покрытие архитектуры тестами • Каталог архитектурных паттернов

    (ADR+тесты) • Автогенерация • Инструменты рефакторинга микросервисной архитектуры https://github.com/Byndyusoft/aact/blob/main/roadmap.md 72
  40. Roadmap. Покрытие архитектуры тестами ✅ Покрытие тестами микросервисной архитектуры ✅

    Покрытие тестами архитектуры модульного монолита 🟩 Добавление реализаций и примеров под разные • стэки (сейчас TypeScript и C#) • “Architecture as Code”-инструменты (+ Structurizr) • реализации “Infrastructure as Code” ⌛ Справочник принципов и паттернов проектирования (в формате ADR) с примерами тестов 73
  41. Roadmap. Автогенерация ✅ Автогенерация архитектурной схемы по конфигам инфраструктуры 🟩

    Автогенерация конфигов инфраструктуры по архитектурной схеме 🟩 Добавление провайдеров для различных реализаций IaC 🟩 Автогенерация и архитектурной схемы, и конфигов инфраструктуры по архитектурному решению (ADR) 75
  42. Roadmap. Инструменты рефакторинга микросервисной архитектуры 🟩 Изменение сигнатуры метода API

    (endpoint’а) 🟩 Вынос метода API (endpoint'а) микросервиса в отдельный микросервис 🟩 Inline микросервиса — поглощение микросервиса своим потребителем 76
  43. Анонсы. Август-сентябрь • +1 Пример микросервисной архитектуры • на Structurizr

    • тесты на C# • Открытые онлайн-воркшопы, где разберём ваши примеры микросервисных архитектур и попробуем написать тесты на ваши ADR 77 @Архитектура распределённых систем
  44. Итоги • Архитектура “as Code” • Решение проблем через покрытие

    тестами • Автогенерация архитектуры • Каталог паттернов проектирования • Присоединяйтесь к развитию OpenSource-репозитория! 81