Русский
Русский
English
Статистика
Реклама

Microservices; agile development

Что делать если никто не хочет документировать? Организация документирования микросервисов по минимуму часть 2

25.08.2020 20:14:31 | Автор: admin


Эта статья является продолжением. Первую часть смотри тут


Подход к реализации


Файл Readme.md


Общая информация о файле Readme.md представлена здесь https://www.makeareadme.com/.
Фактическая версия файла должна находиться в ветке по умолчанию.
Файл должен иметь следующую структуру:


  • Название компонента
  • Статус компонента (микросервиса) и его владелец
  • Описание компонентов. Его назначение и связанная область данных
  • Описание функциональности как набор реализованных сценариев использования.
  • Инструкция по использованию, сборке и развертыванию
  • Описание конфигурации
  • Ссылки на документацию
  • Важные советы и ссылки

Readme.md Статус компонента (микросервиса)


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


  • CREATED микросервис создан, но в производстве нет версий. Пока не планируется запускать его в производство. Никаких ограничений не предусмотрено.
  • DEV разработка. Статус версии микросервисов, которая еще не запущена в производство, но будет выпущена. Каждый статус DEV должен указывать на соответствующую ветку. Статус DEV предполагает привязку к соответствующим ветвям выпуска. Таким образом, перед созданием новой ветки выпуска предполагается, что файл Readme.md в основной ветке должен быть обновлен новой веткой информации о выпуске.
  • PROD- в производстве. Рабочая версия микросервисов. Каждый статус PROD должен указывать на соответствующую ветку. Таким образом, после нажатия в производственной конкретной ветке выпуска предполагается, что файл Readme.md в основной ветке должен быть обновлен с новым статусом выпуска. Кроме того, предыдущий выпуск может быть обновлен как статус EOL.
  • EOL конец жизни. Бетонный релиз снят с производства во всех средах.
  • ARCHIVE- микросервис (как конкретное репо) удален из всех сред, и больше не предполагается подключение к нему задач разработки.

Readme.md Владелец компонента


В этой части показано, кто является владельцем микросервиса и, следовательно, отвечает за его архитектуру и возможности. Обязанности собственника могут быть разными и зависеть от ситуации и текущей политики процесса развития


Readme.md Описание компонентов


Описание компонента предполагает краткое объяснение, описывающее ваши микросервисы в терминах О чем компонент? и Какова цель его использования?. Предполагается, что это описание того, какие общие сценарии использования решают микросервисы и какую область данных они обрабатывают.
В общем, это не должно превышать 30-50 строк текста, потому что это микросервис, а не типичное монолитное приложение.
Описание должно быть достаточно четким, чтобы предоставить всем разработчикам и архитекторам информацию, которая может им понадобиться для принятия решения какие варианты использования целесообразно добавить в этот микросервис. Если по какой-либо причине в микросервис будет добавлен какой-то новый функционал, его описание необходимо расширить. В целом, это может быть хорошей точкой на этапе мерж запроса в качестве дополнительной точки архитектурного контроля.


Readme.md Описание вариантов использования


Этот раздел должен содержать список всех вариантов использования, реализованных этим микросервисом. Предполагалось использовать уникальный номер варианта использования (который относится к используемому реестру вариантов использования) и имя варианта использования (не более одной строки текста).
На этапе слияния необходимо проверить, обновил ли разработчик часть вариантов использования в файле Readme.md в случае реализации нового варианта использования.


Readme.md Инструкция по использованию, сборке и развертыванию


Этот раздел служит источником информации о том, как настроить, собрать и развернуть компонент. Самая важная часть это описание всех файлов конфигурации и основных параметров конфигурации.
Предлагается иметь здесь единый список всех жизненно важных файлов конфигурации. Кроме того, все параметры конфигурации должны быть задокументированы в соответствующих файлах конфигурации с помощью комментария или java-doc.
В случае использования общего подхода к файлам конфигурации было бы лучше иметь ссылку на конкретную страницу Confluence с описанием общих параметров.
Приложения и инструменты, которые работают только на определенных платформах, должны иметь поддерживаемые версии операционной системы, указанные в этом разделе Readme.
Если ваш код полагается на другое приложение или библиотеку, обязательно укажите эти зависимости здесь.
Кроме того, это хорошее место для раздела часто задаваемых вопросов, который можно использовать для хранения полезных советов, которые обычно разработчики задают в чате разработки.


Readme.md Ссылки на документацию


В этом разделе представлен набор ссылок на другую полезную документацию, которая может быть полезна для понимания того, как обрабатывать и использовать компонент (микросервис).


Предопределенная структура пакета кода


К структурированию кода могут быть разные подходы. Основная причина для этого предоставить такую структуру, которая могла бы предоставить дополнительную информацию о том, что должен делать класс, занимая свое место в структуре пакета.
Во-вторых, общая структура может быть полезна на этапе мерж запроса в качестве дополнительной линии контроля. Например, если нет изменений в пакетах для остальных контроллеров, нет причин для дополнительного контроля зависимых компонентов.
Предлагаемая модель структуры пакета кода основана на подходе гексагональной архитектуры https://en.wikipedia.org/wiki/Hexagonal_architecture_(software).
Пример структуры пакета кода может быть следующим:


  • inbound содержит все классы для входящих интерфейсов микросервиса в качестве предоставленных сервисов. Деление по функциональным доменам
    сервис сервисные интерфейсы, которые должны быть реализованы как часть бизнес-части. Входящий контроллер вызывает этот интерфейс.
    dto пакет для объектов dto, которые используются входящими сервисами и контроллерами
    контроллеры пакет для реализации конкретных контроллеров: rest, Kafka, MQ и тд. Поскольку одна и та же входящая услуга может быть реализована с помощью разных технологий, здесь может быть несколько подпакетов
  • outbound- содержит все классы для потребляемых внешних сервисов. Например, может быть реализация остального клиента, шина событий и реализация журнала. Деление по функциональным доменам
    service реализация вызова исходящей службы, которая должна использоваться классами бизнес-уровня
    dto объект передачи данных для вызова внешней службы
    клиенты: rest, Kafka, MQ и др. реализация конкретного внешнего сервиса клиента
  • domain содержит все классы, сохраняемые микросервисом в его базах данных.
    по структуре домена базы данных содержит репозиторий JPA и определение объекта данных. Кроме того, он может содержать объекты кеша, NoSQL, файлы и все другие источники данных, требующие операций CRUD со стороны микросервиса
  • bussines включает все необходимые классы бизнес-логики, включая манипулирование данными и бизнес-проверки данных. Деление по функциональной области здесь нет строгих требований к бизнес-пакетам

Во избежание ненужных зависимостей кода (и для упрощения документации) не должно быть прямых зависимостей между inbound, outbound и domain пакетами. Только классы из бизнес-пакета могут напрямую использовать эти пакеты.
Кроме того, такое разделение классов сокращает необходимый объем документации по классам, и минимально необходимо документировать только только эти пакеты, так как они отвечают за межкомпонентное взаимодействие, о котором нельзя прочитать в коде -).


Аннотации Swagger для служб REST


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


  • Функциональная область
  • Имя варианта использования, чтобы можно было легко найти исходные требования и тестовые примеры для конечного пользователя.
  • определение ресурсов
  • определения параметров
  • определения заголовков
  • область авторизации и необходимые роли безопасности, если это применимо

Модель документа Jira


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


Все пользовательские истории это Jira-issue, связанные с соответствующими issue проектирования, разработки или ошибок. Те, с другой стороны, подключены к определенному микросервису с помощью Component Object Jira. Таким образом, в результате мы можем достичь прочной связи между микросервисами, их функциональной документацией и библиотекой архитектуры решения.
Детали реализации могут быть разными, но основная идея будет той же как с минимальными усилиями связать кучу документации из разных источников (например, в Confluence) с конкретной реализацией микросервиса.
Confluence может быть отличным местом для библиотеки документации, так что все проблемы, связанные с историей пользователей и решениями, должны быть связаны с соответствующей страницей документации в Confluence.


Swagger-HUB


Swagger-HUB в настоящее время широко используется используется и тут нет особого смысла описывать его имплементацию. Главное чтобы она была автоматизирована, включена в build-pipeline, предоставлялась также для релизных веток а не только для продуктивной.


Заключение


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


Второй момент: лучше не иметь документации вообще, чем иметь неактуальную и устаревшую документацию. В некоторых случаях текущее состояние и актуальность SwaggerHub не соответствуют действительности, поэтому он бесполезен в качестве источника API.


Таким образом, недостаточно просто внедрить схему. Контроль документации должен быть частью проверки мерж-реквеста и цепочки контроля качества в целом. Все несоответствия в документе рекомендуется рассматривать как ошибку для повышения качества. Кроме того, рекомендуется рассматривать всю документацию (которая напрямую не связана с репо и файлом Readme.md) как отдельную задачу с соответствующими задачами в Jira.


Всем спасибо за внимание!!!

Подробнее..

Что делать если никто не хочет документировать? Организация документирования микросервисов по минимуму

25.08.2020 20:14:31 | Автор: admin


Представьте что у вас команда специалистов, которая по принципу code-first делает систему с множеством бизнес-историй на базе микросервисов. Все люди опытные, всем есть что делать кроме того как писать документации или спецификации на разработанный API. И все изначально знают, что если захотел использовать какой сервис, то надо заглянуть в код и потом спросить в общем чате если что непонятно. Знакомая ситуация не так ли? -))) И в целом все нормально, если бы со временем не росла команда, не росло количество сервисов и функций, не появлялись баги от бизнеса и тестеров, не требовалось предоставлять API для интеграции смежным командам...


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


Итак. Что мы имеем на входе? А на входе мы имеем процесс разработки, который выглядит как очень быстрый и оптимальный.


  • На входе процесса есть бизнес-истории которые описывают функциональные требования на уровне бизнес активностей и кейсов по типу Я как А хочу получить Б. Так сказать классика которая описывается в Confluence.
  • Далее бизнес-история обрабатывается аналитиком который превращает ее в задание в Jira с вложениями макетов форм и описанием сценария в терминах пользовательского интерфейса.
  • Теперь задача падает на разработчика, который пишет уже код. После чего реализация уходит аналитику на тестирование.
  • Дополнительно есть архитектор, который занимается решением нефункциональных требований, но организационно его решения оформляются как и бизнес-истории и попадают в разработку аналогичным путем через Jira

Что у нас тут особенного? Очень быстрый и прямой процесс. Но нет никаких артефактов обеспечивающих поддержку принятия технических решений без заглядывания в код. И выглядит это так:
Решение о р- еализации новой функции уровня микросервиса принимается конкретным разработчиком при реализации конкретного бизнес-сценария (описанного в Jira)


  • После реализации все его решения остаются только в коде (какой микросервис он выбрал, как назвал параметры REST и какой json у нашего DTO, какие поля добавил в базу и те пе.
  • Теперь при реализации клиента для этого реста, его модернизации или реализации нового REST другой разработчик на старте шерстит код чтобы посмотреть как этот рест был реализован или вообще где он реализован.

При этом модель в принципе рабочая, плюс никто не желает переходить на contract-first разработку, но процесс начинает работать в холостую с ростом числа микросервисов и разработчиков. И хочется как в том анекдоте ничего не разать, а дать таблетку, чтобы все само отвалилось -)


Далее будет много букв и восемь страниц сухого текста TO-DO без каких либо обоснований и сентенций. Решение предлагает минимально возможную модель выстраивания документирования микросервисов в условиях абсолютного нежелания этого делать. В решении представлена исключительно модель документов, их сзязности и менеджмента без описаний собственно как эти документы писать. В решении много открытых вопросов к конкретной имплементации. Если вас интерисует сама имплементация пишите вопросы в коментах.


Цели документирования


  • Обеспечить комплексное решение для документирования микросервисов в случае разработки кода по принципу сначала код
  • Предоставление разработчикам и другим техническим специалистам четкие инструкции, как читать и где искать информацию о микросервисах и реализации
  • Предоставление "Single source of true" для спецификации кода

Стратегия решения


Решение использует следующие подходы к документированию микросервисов:


  • Файл Readme.md это основная часть документации по микросервисам, которая содержит все общее описания и ссылки на другую часть документации.
  • Конечные точки REST документируются с помощью аннотаций Swagger. Затем он будет опубликован как спецификация Swagger Hub
  • Микросервис имеет предопределенные высокоуровневые определения иерархии пакетов, которые обеспечивают дополнительный уровень понимания кода
  • Задачи Jira являются источником информации обо всех разработках, связанных с конкретными микросервисами. Связывание осуществляется с помощью объекта Jira Component
  • все дополнительные источники документации по микросервисам могут быть где угодно, но должны быть упомянуты в файле Readme.md

Модель документации


Общая модель документации изображена на следующей диаграмме. Подробнее о реализации см. В главе о реализации.


Gitlab


Файл Readme.md


Файл Readme.md важная часть принципов документации. Файл является отправной точкой для знаний о микросервисах и единой точкой доверия. Этот файл должен присутствовать во всех репозиториях кода для предоставления наиболее важной информации о программном компоненте (тут микросервисе) и отвечать на следующие вопросы:


  • Какой статус у компонента?
  • Кто является владельцем компонента?
  • О чем компонент? Какова цель его использования?
  • Какую область данных он обслуживает и за что отвечает?
  • Какие варианты использования он реализует?
  • Как это использовать? Как его построить? Как это настроить?
  • Какая документация существует и где она находится?

Файл Readme .md должен быть частью мерж реквеста и аудита качества кода, особенно в части новых сценариев использования. Информация о том, что делает этот микросервис, должна быть легко доступной без необходимости чтения кода.


Аннотации Swagger для служб REST


Аннотации Swagger для служб REST используются для конечных точек REST и документирования их моделей данных. Затем все аннотированные конечные точки будут экспортированы в Swagger Hub в качестве спецификации REST. Аналитики, тестировщики, архитекторы могут использовать эту спецификацию, а также для автоматичиской настройки шлюза API и предоставления спецификации внешним контракторам.
Аннотации Swagger должны быть исчерпывающими и правильными. Полнота аннотаций должна быть неотъемлемой частью проверки кода. В идеале определение REST должно предоставлять всю информацию, необходимую для его использования, без необходимости читать код или некоторые внешние документы.


Предопределенная структура пакета кода


С точки зрения документации, структура предопределенного пакета кода должна помочь определить назначение конкретных частей кода на основе их размещения в пакете /src. Это может помочь при аудите кода и во время утверждения запросов на слияние.


Другие источники документации в репозитории кода


Было бы неплохо иметь определенный пакет, например /doc, для хранения других документов как часть кода. Например, это могут быть AsciiDoc (https://asciidoc.org/) и PlanUML (https://plantuml.com/)
Дополнительно для меня остается открытым вопрос как наиболее оптимально документировать уровень DAO, JPA и других интерфейсов не связанных с REST. Обязательно напишите если у вас есть рецепт в комент.


Jira


Jira это основной источник информации обо всех изменениях, которые были применены к настоящему микросервису. Все задачи Jira должны быть связаны с конкретным микросервисом, который был изменен конкретной задачей. Таким образом, все микросервисы станут связаны с конкретными реализациями и работами и журналом изменений.
Поскольку в текущем процессе разработки задача Jira является основным источником информации о необходимых изменениях, улучшениях и результатах, задача Jira является важным источником информации о том, какие варианты использования были реализованы, какой документ проектирования (архитектурные решения) связан с конкретным микросервисы и так далее.
Объект "Компонент" Jira работает как ссылка от задач Jira к определенному микросервису. Его название должно соответствовать конкретному названию микросервиса. Так что определить местонахождение всех задач, связанных с конкретным микросервисом, будет достаточно просто.
Задачи Jira должны относиться к затронутым микросервисам соответствующими объектами компонентов:


  • задача разработки должна быть связанна хотя бы с одним затронутым микросервисом. В целом, это будет хороший шаблон для создания для всех затронутых микросервисов отдельных задач в рамках некоторых задач высокого уровня, которые должны относиться к конкретной реализации варианта использования. За эту задачу высокого уровня может отвечать архитектор программного обеспечения.
  • устранение бага должна быть подключена хотя бы к одному затронутому микросервису
  • дизайн решения (задача архитектора) было бы хорошей практикой, если бы все документы по проектированию решения основывались на всех микросервисах, которые были частью этого решения. Таким образом, все микросервисы автоматически подключаются к библиотеке проектирования решений

Confluence


Service Report (см диаграмму) это сводный отчет обо всех микросервисах в одном месте. Основная идея этого документа предоставить автоматически собираемый отчет, основанный на информации из файла Readme.md.
Отчет должен содержать информацию обо всех микросервисах в Gitlab, включая локальную копию файла Readme.md. Таким образом, его могут использовать люди, не имеющие доступа к репозиторию Gitlab


Swagger Hub


Swagger Hub служит сводным отчетом обо всех конечных точках REST и формируется автоматически на основе Swagger аннотаций.


Продолжение следует во второй части в которой описаны основные подходы к реализации
Часть 2 тут

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru