Ответ
Модель C4 (C4 Model) — это иерархический подход к визуализации архитектуры программного обеспечения, созданный Саймоном Брауном. Он позволяет описывать систему на разных уровнях детализации, делая архитектуру понятной для разной аудитории (от менеджеров до разработчиков).
Модель состоит из 4 уровней диаграмм:
-
Уровень 1: Контекст (System Context)
- Что показывает: Систему как «чёрный ящик», её пользователей (акторов) и внешние системы, с которыми она взаимодействует.
- Аудитория: Все (бизнес, менеджмент, разработчики).
-
Уровень 2: Контейнеры (Containers)
- Что показывает: Основные строительные блоки системы: веб-приложения, мобильные приложения, базы данных, файловые системы, микросервисы.
- Важно: «Контейнер» здесь — это не Docker-контейнер, а развертываемая единица (deployable unit).
- Аудитория: Разработчики, архитекторы, DevOps-инженеры.
-
Уровень 3: Компоненты (Components)
- Что показывает: Основные модули или компоненты, из которых состоит отдельный контейнер. Например, в Go-приложении это могут быть
UserController
,AuthService
,PaymentGatewayClient
. - Аудитория: Разработчики, архитекторы.
- Что показывает: Основные модули или компоненты, из которых состоит отдельный контейнер. Например, в Go-приложении это могут быть
-
Уровень 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 — это создание общего языка для обсуждения архитектуры и возможность рассматривать систему с нужным уровнем абстракции.