Синтаксис диаграмм C4 и руководство по архитектуре Mermaid.js

Диаграмма C4 — это стандартизированный метод визуализации архитектуры, предназначенный для моделирования программных систем на нескольких уровнях структурной абстракции. Встроенный нативно в Mermaid.js, c4двигатель следует четырем основным уровням модели C4: Контекст (макроэкосистема), Контейнеры (приложения, службы и базы данных), Компоненты (внутренние структурные модули), и Динамические взаимодействия. Этот инструмент устраняет сложности с кастомной стилизацией CSS, применяя единообразные, готовые к презентации архитектурные блоки на основе ваших текстовых объявлений.

Понимание абстракций и ключевых слов диаграмм C4

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

  • C4Context: Фокусируется на общей картине, отображая пользователей, основные программные экосистемы и внешние зависимости высокого уровня.
  • C4Container: Приближается на один уровень, чтобы разложить автономные приложения, интерфейсы фронтенда, микросервисы, системы хранения баз данных и очереди.
  • C4Component: Проникает глубоко внутрь контейнера, чтобы продемонстрировать внутренние модули на уровне кода, такие как контроллеры, службы и репозитории.
  • C4Dynamic: Фокусируется на отслеживании взаимодействий данных во время выполнения или пошаговой последовательности транзакций между блоками инфраструктуры.

Базовая структура синтаксиса

Каждая диаграмма C4 начинается с конкретного заголовка уровня, за которым следует необязательное утверждение заголовка и макрокомпоненты, разделённые запятыми. Параметры находятся в скобках, строки ограничены двойными кавычками.

C4Context
  title "Чертеж контекста системы для ядра интернета"
  Person(customer, "Клиент банка", "Клиент банка с личными счетами.")
  System(banking_system, "Система интернет-банкинга", "Позволяет клиентам просматривать информацию о счетах.")
  Rel(customer, banking_system, "Использует", "HTTPS")

Полная макро-классификация элементов C4

Библиотека Mermaid C4 предоставляет обширный набор специализированных макросов, позволяющих чётко различать внутренние компоненты, внешние системы и слои баз данных на всех уровнях абстракции.

1. Макросы персоны и пользователя

  • Person(псевдоним, метка, [описание], [спрайт], [теги]): Моделирует внутреннего человека-пользователя или заинтересованного лица.
  • Person_Ext(псевдоним, метка, [описание], [спрайт], [теги]): Моделирует внешнего пользователя (например, стороннего поставщика или аудитора), находящегося за пределами основных организационных границ.

2. Макросы системы и экосистемы программного обеспечения

  • System(псевдоним, метка, [описание], [спрайт], [теги]): Представляет внутреннюю группу программных систем, находящуюся под вашим прямым управлением.
  • System_Ext(псевдоним, метка, [описание], [спрайт], [теги]): Моделирует важную внешнюю систему программного обеспечения, управляемую сторонней организацией (например, поставщики идентификации, основные банковские ведомости).
  • SystemDb(псевдоним, метка, [описание], [спрайт], [теги]): Отображает блок хранилища данных на уровне системы в форме цилиндра.
  • SystemDb_Ext(псевдоним, метка, [описание], [спрайт], [теги]): Отображает внешний уровень базы данных, управляемый сторонней организацией.

3. Макросы слоя контейнеров (уровень C4Container)

  • Container(псевдоним, метка, технология, [описание], [спрайт], [теги]): Моделирует отдельное исполняемое приложение, сервер API или интерфейс фронтенда.
  • ContainerDb(псевдоним, метка, технология, [описание], [спрайт], [теги]): Отображает оболочку базы данных реляционного или нереляционного типа на уровне контейнера.
  • Container_Ext(псевдоним, метка, технология, [описание], [спрайт], [теги]): Представляет внешний облачный контейнер или сервис приложения.
  • ContainerDb_Ext(псевдоним, метка, технология, [описание], [спрайт], [теги]): Представляет внешний управляемый уровень хранения облачной базы данных.

4. Макросы слоя компонентов (уровень C4Component)

  • Component(псевдоним, метка, технология, [описание], [спрайт], [теги]): Отображает внутренний модуль на уровне кода, слой или контроллер класса.
  • ComponentDb(псевдоним, метка, технология, [описание], [спрайт], [теги]): Моделирует внутреннюю систему хранения микрокомпонентов или систему кэширования файлов низкого уровня.

Границы контейнеров и структурная оболочка

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

  • Enterprise_Boundary(псевдоним, метка) { ... }: Оборачивает высокий уровень систем внутри широкой визуальной границы, представляющей общую периметр корпоративной или компании инфраструктуры.
  • System_Boundary(псевдоним, метка) { ... }: Группирует тесно связанные прикладные контейнеры или микросервисы внутри единого блока программной экосистемы.
  • Container_Boundary(псевдоним, метка) { ... }: Изолирует компоненты на уровне кода внутри одного слоя контекста модуля приложения.

Расширенные операторы направленных отношений

Соединение блоков в диаграммах C4 зависит от Relмакроса или его явно направленных вариаций. Вместо передачи необработанных линий диаграммы потока, вы отслеживаете соединения семантически, объявляя векторы технологий непосредственно внутри логических блоков.

Синтаксический токен отношения Направление визуальной стрелки Контекст выравнивания использования
Rel(от, к, метка, [техн]) Динамический / Автоматизированный Отношение по умолчанию. Позволяет алгоритму размещения определить лучший путь линии.
BiRel(от, к, метка, [техн]) Двунаправленный (<–>) Указывает на двусторонние взаимодействия, дуплексные протоколы или синхронные процессы.
Rel_Back(от, к, метка, [техн]) Обратная стрелка сверху (<–) Рисует отношение вперед в логике кода, но переворачивает видимую визуальную стрелку назад.
Rel_Neighbor(от, к, метка, [техн]) Предпочтение горизонтального расположения Принуждает целевой узел оставаться непосредственно рядом с исходным узлом на одной и той же горизонтальной строке.
Rel_Down(от, к, метка, [техн]) / Rel_D(...) Прямо вниз (v) Принуждает вертикальные потоки данных идти вниз к слоям базы данных или последующим фоновым процессам.
Rel_Up(от, до, метка, [техн]) / Rel_U(...) Прямо вверх (^) Принуждает маршруты отношений идти прямо вверх к компонентам пользовательского интерфейса клиента.
Rel_Left(от, до, метка, [техн]) / Rel_L(...) Прямо влево (<-) Направляет пути горизонтально влево от элемента холста.
Rel_Right(от, до, метка, [техн]) / Rel_R(...) Прямо вправо (->) Направляет пути горизонтально вправо от элемента холста.

Пользовательская динамическая стилизация и тегирование (переопределение форм C4)

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

Ключевые слова для изменения стилизации:

  • UpdateElementStyle(имяЭлемента, bgColor, цветШрифта, [цветГраницы], [теневаяЗаливка]): Прямая замена цветовой палитры фона по умолчанию для явно заданного элемента.
  • UpdateRelStyle(от, до, цветЛинии, цветТекста): Явно указывает на маршрут соединения для изменения цвета линий или описания соединения.
C4Context
  title "Пользовательская цветовая схема глобальной архитектурной карты"
  
  System(legacy_api, "Устаревший ядро биллинга", "Обрабатывает продление подписок.")
  System(modern_portal, "Портал панели управления клиентов", "Современный веб-движок для пользовательского интерфейса.")
  
  %% Прямые настройки цвета
  UpdateElementStyle(legacy_api, "#d9534f", "#ffffff", "#c9302c")
  UpdateElementStyle(modern_portal, "#5cb85c", "#ffffff", "#4cae4c")


Реальный чертеж: Карта контейнера границ предприятия для системы электронной коммерции

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

C4Container
  title "Чертеж контейнера для корпоративной платформы электронной коммерции"

  Person(customer, "Онлайн-покупатель", "Просматривает элементы каталога и добавляет товары в цифровую корзину.")
  System_Ext(payment_gateway, "Сервис API Stripe", "Внешний хранилище кредитных карт и процессинговый движок.")

  System_Boundary(ecommerce_scope, "Периметр ядра электронной коммерции") {
    Container(frontend_app, "Веб-приложение для магазина", "Next.js, React", "Доставляет статические ресурсы и обрабатывает сессии корзины пользователей.")
    Container(checkout_service, "Микросервис оформления заказа", "Node.js, Express", "Обрабатывает рабочие процессы корзины и рассчитывает налог.")
    ContainerDb(order_db, "База данных журнала заказов", "PostgreSQL", "Хранит исторические строки транзакций и защищённые записи журнала.")
  }

  %% Архитектурные пути взаимодействия
  Rel(customer, frontend_app, "Просматривает продукты и размещает заказы с помощью", "HTTPS/Браузер")
  Rel_Down(frontend_app, checkout_service, "Отправляет транзакции с данными о покупке через", "JSON/REST API")
  
  Rel_Right(checkout_service, order_db, "Сохраняет транзакционные состояния внутри", "SQL/JDBC-соединение")
  Rel_Left(checkout_service, payment_gateway, "Авторизует вызовы токенизированных платежей с помощью", "Безопасный TLS/HTTPS API")


Распространённые синтаксические ошибки и системные ограничения

При компиляции чистых диаграмм C4 для программных фреймворков обратите внимание на эти параметры выполнения, чтобы избежать сбоя диаграммы:

  • Форматирование разделителей запятыми: В отличие от почти всех других схем Mermaid, макросы C4 требуют строгих запятых между параметрами: Person(id, "Метка", "Описание"). Пропуск разделительной запятой полностью сломает построитель макета.
  • Зарезервированные кавычки для меток: Поля отображения, теги технологий и блоки описаний внутри макросов *должны* быть заключены в чёткие двойные кавычки. Вставка необработанного текста в поля без кавычек вызывает сбои при разборе.
  • Порядок вложенности границ: При обёртывании элементов внутри System_Boundary или Enterprise_Boundary блока, вы должны явно очистить содержимое рабочей области, используя стандартные фигурные скобки { }. Оставление открытой скобки границы или неправильное её соответствие нарушает отрисовку макетов.
  • Динамическая инициализация псевдонимов: Вы не можете создавать связи (Rel) к идентификатору псевдонима, который не был явно инициализирован блоком макроса элемента выше него. Держите поток объявления последовательным сверху вниз.
Прокрутить вверх