Что такое архитектурная модель C4?

Ответ

Модель C4 (C4 Model) — это иерархический подход к визуализации архитектуры программного обеспечения, созданный Саймоном Брауном. Он позволяет описывать систему на разных уровнях детализации, делая архитектуру понятной для разной аудитории (от менеджеров до разработчиков).

Модель состоит из 4 уровней диаграмм:

  1. Уровень 1: Контекст (System Context)

    • Что показывает: Систему как «чёрный ящик», её пользователей (акторов) и внешние системы, с которыми она взаимодействует.
    • Аудитория: Все (бизнес, менеджмент, разработчики).
  2. Уровень 2: Контейнеры (Containers)

    • Что показывает: Основные строительные блоки системы: веб-приложения, мобильные приложения, базы данных, файловые системы, микросервисы.
    • Важно: «Контейнер» здесь — это не Docker-контейнер, а развертываемая единица (deployable unit).
    • Аудитория: Разработчики, архитекторы, DevOps-инженеры.
  3. Уровень 3: Компоненты (Components)

    • Что показывает: Основные модули или компоненты, из которых состоит отдельный контейнер. Например, в Go-приложении это могут быть UserController, AuthService, PaymentGatewayClient.
    • Аудитория: Разработчики, архитекторы.
  4. Уровень 4: Код (Code)

    • Что показывает: Детали реализации конкретного компонента (диаграммы классов, схемы баз данных). Этот уровень часто не визуализируют, а ссылаются прямо на исходный код.

Пример для Go-бэкенда:

Представим, что мы детализируем архитектуру:

  • Контейнер: API Server (веб-сервис на Go).
  • Компонент: UserService (отвечает за бизнес-логику пользователей).
  • Код: Реализация компонента UserService.
// Уровень 4 (Код) — реализация компонента "UserService"

// UserRepository - это интерфейс, который является частью другого компонента (например, "PersistenceComponent")
type UserRepository interface {
    FindByID(id string) (*User, error)
}

type UserService struct {
    repo UserRepository
}

func (s *UserService) GetUser(id string) (*User, error) {
    // Бизнес-логика и вызов другого компонента
    return s.repo.FindByID(id)
}

Главное преимущество C4 — это создание общего языка для обсуждения архитектуры и возможность рассматривать систему с нужным уровнем абстракции.