Что такое инфраструктура в контексте архитектуры приложения?
В контексте архитектуры приложений, инфраструктура относится к слоям и компонентам, которые обеспечивают базовые функции, необходимые для функционирования системы, но не являются непосредственно частью бизнес-логики. Это те части системы, которые обеспечивают взаимодействие с внешним миром или внутренними сервисами, но не реализуют саму бизнес-логику.
Инфраструктура в программной архитектуре
Инфраструктура включает в себя:
- Взаимодействие с внешними системами (например, базы данных, очереди сообщений, сторонние API).
- Сетевые компоненты (например, HTTP-серверы, брокеры сообщений, микросервисные коммуникации).
- Ресурсы для хранения данных (например, базы данных, файловые системы, кэш).
- Логирование, мониторинг и безопасность.
Важное замечание: инфраструктурные компоненты не содержат логики обработки бизнес-данных, а лишь предоставляют средства для их хранения, передачи или обработки.
Пример инфраструктуры
В архитектуре Hexagonal Architecture или Ports and Adapters инфраструктура чаще всего представлена адаптерами, которые взаимодействуют с внешними мирами, например:
- Базы данных: Репозитории, которые обеспечивают хранение данных в базах данных, но не содержат бизнес-логики.
- Очереди сообщений: Kafka, RabbitMQ и другие системы сообщений, которые обеспечивают асинхронную обработку событий.
- API-интерфейсы: Адаптеры, которые реализуют взаимодействие с внешними сервисами через HTTP или другие протоколы.
- Конфигурация: Настройки системы, которые могут быть загружены из файлов конфигурации или переменных окружения.
Инфраструктура и бизнес-логика
В Hexagonal Architecture или Clean Architecture инфраструктура разделена на два слоя:
- Внешние адаптеры (Outside): Это компоненты, которые позволяют взаимодействовать с внешним миром — такие как контроллеры, сетевые компоненты, клиентские библиотеки и т.д.
- Внутренние адаптеры (Inside): Это компоненты, которые взаимодействуют с внутренними сервисами, репозиториями и системами хранения.
Бизнес-логика, которая является основной частью приложения, независима от инфраструктуры. Это позволяет легко тестировать бизнес-логику без зависимости от конкретных внешних систем и наоборот — легко менять инфраструктуру, не затрагивая саму бизнес-логику.
Примеры инфраструктурных компонентов:
- Kafka Consumer:
- Он взаимодействует с Kafka (внешняя система) и передает данные во внутреннюю систему, но не содержит бизнес-логики. Это типичный инфраструктурный компонент.
- Он является адаптером, который извлекает данные из Kafka и передает их в обработку в сервисы, не возвращая данные обратно во внешний мир.
- База данных (репозитории):
- Репозиторий — это инфраструктурный компонент, который занимается доступом к базе данных. Он может использовать SQL или NoSQL базы данных для сохранения или извлечения данных, но не включает бизнес-логику. Репозитории могут быть адаптерами для взаимодействия с базами данных.
- API Gateway:
- В качестве адаптера API Gateway принимает HTTP-запросы и направляет их в нужные сервисы, выполняет аутентификацию, маршрутизацию запросов и ответов. Он управляет взаимодействием между микросервисами и внешним миром.
- Логирование и мониторинг:
- Инфраструктурные компоненты могут включать системы логирования (например,
logrus
,zap
в Go) или мониторинга (например, Prometheus), которые помогают отслеживать состояние системы и ее работу, но сами по себе не участвуют в обработке бизнес-логики.
- Инфраструктурные компоненты могут включать системы логирования (например,
Роль инфраструктуры в архитектуре
Основная цель инфраструктуры — обеспечить взаимодействие между бизнес-логикой и внешним миром или между различными внутренними компонентами системы. Инфраструктура:
- Изолирует бизнес-логику от конкретных технологий.
- Обеспечивает необходимое взаимодействие с внешними сервисами.
- Позволяет изменять внешние компоненты (например, переключение базы данных или смену очереди сообщений) без влияния на бизнес-логику.
Пример взаимодействия бизнес-логики и инфраструктуры
- Бизнес-логика:
- Сервис, который обрабатывает данные, например, создает нового пользователя.
- Этот сервис не зависит от того, как и где будут храниться данные. Он может только передавать объекты данных в репозиторий для сохранения.
- Инфраструктура:
- Репозиторий, который сохраняет пользователя в базе данных. Это инфраструктурный компонент, который взаимодействует с базой данных, но сам не реализует бизнес-логику (например, как именно создать пользователя).
Пример структуры:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// Бизнес-логика (сервис) type UserService struct { userRepo UserRepository } func (s *UserService) CreateUser(user *User) error { if err := s.userRepo.Save(user); err != nil { return err } return nil } // Инфраструктура (репозиторий) type UserRepository struct { db *Database } func (r *UserRepository) Save(user *User) error { // Сохраняем пользователя в базе данных return r.db.Insert(user) } |
Recommended Posts
health-check API для микросервисов
10.03.2024
Отказоустойчивый кластер Postgresql
02.02.2024