Приложения Go могут комбинировать файлы исходного кода разных типов, поэтому использование надежной традиционной структуры имеет много преимуществ.
Шестиугольная архитектура (или «порты и адаптеры») — это популярный шаблон архитектуры программного обеспечения, который вы можете применять при создании приложений Go. Используя его, вы можете улучшить масштабируемость, ремонтопригодность и тестируемость вашего приложения.
Эта архитектура помогает отделить бизнес-логику от внешних зависимостей и инфраструктуры, делая ваше приложение гибким и простым в обслуживании.
Что такое шестиугольная архитектура?
Шестиугольная архитектура делит приложения на три основных уровня:
- Прикладной уровень содержит основную логику приложения, независимую от каких-либо сторонних зависимостей. Уровень приложения должен содержать вашу бизнес-логику, модели предметной области и службы приложений.
- Уровень портов и адаптеров содержит адаптеры, взаимодействующие с существующими приложениями. Порты — это интерфейсы, которые определяют операции для вашего приложения, а адаптеры — это реализации интерфейсов. Адаптерами могут быть базы данных, HTTP API, брокеры сообщений или любая другая внешняя система.
- Уровень инфраструктуры содержит реализацию адаптеров. Уровень инфраструктуры должен включать базы данных, брокеры сообщений и другие внешние системы.
Преимущества использования гексагональной архитектуры
Шестиугольная архитектура популярна благодаря следующим преимуществам.
Масштабируемость и ремонтопригодность проекта
Разделение ваших приложений позволяет использовать модульную и несвязанную кодовую базу, что упрощает масштабирование и поддержку вашего приложения.
Вы можете удалять адаптеры, не затрагивая основную логику, и изменять основную логику, не затрагивая адаптеры. Это означает, что вы можете легко заменить адаптеры, не переписывая все приложение.
Тестируемость и простота интеграции
Шестиугольная архитектура способствует тестируемости, поскольку вы можете писать модульные тесты для базовой логики без имитации внешних зависимостей. Вы можете использовать тестовые двойники, такие как подделки или заглушки, без необходимости настроить базу данных или брокер сообщений.
Шестиугольная архитектура также упрощает интеграцию вашего приложения с другими системами. Поскольку адаптеры отделены от базовой логики, их можно повторно использовать в других приложениях или микрослужбах. Вы также можете предоставить API порта вашего приложения для использования в других системах.
Гибкость и адаптируемость к изменяющимся требованиям
Шестиугольная архитектура обеспечивает гибкость и адаптируемость к изменяющимся требованиям. Поскольку базовая логика не зависит от адаптеров, вы можете легко изменить или расширить функциональность приложения, не затрагивая адаптеры.
Вы можете развивать свое приложение с течением времени, придерживаясь определенных внешних систем.
Го и шестиугольная архитектура
По сути, шестиугольная архитектура заключается в отделении основной бизнес-логики приложения от инфраструктуры, чтобы вы можете поменять местами зависимости, не влияя на основную логику приложения, что упрощает поддержку и тестирование приложение.
Типичное шестиугольное приложение Go использует четыре основных каталога: команда, внутренний, упаковка, и продавец.
команда Каталог содержит основные приложения для проекта. Код, который вы пишете здесь, обычно вызывает функции из файлов в pkg и внутренних каталогах.
внутренний каталог должен содержать частный код приложения, который вы не хотите, чтобы пользователи импортировали в свое приложение. Компилятор Go применяет шаблон внутренней компоновки, и вы можете иметь столько внутренних каталогов в других каталогах, сколько пожелаете. Вы не ограничены внутренним каталогом верхнего уровня.
упаковка каталог должен содержать код библиотеки, которую вы хотите импортировать и использовать внешними приложениями. Хотя с помощью упаковка directory является обычной практикой, она не общепринята и не соблюдается.
продавец каталог должен содержать зависимости приложений (управляемые вручную или автоматически). Вы можете использовать иди поставщик модов команда для создания /vendor каталог, чтобы использовать функциональные возможности, которые Go предоставляет поставщикам.
Реализация гексагональной архитектуры в Go
Файловая структура вашего проекта важна при реализации гексагональной архитектуры на любом языке, включая Go.
Вот пример файловой структуры для реализации гексагональной архитектуры в Go:
.
├── команда
│ └── http
│ └── main.go
├── внутренний
│ ├── переходники
│ │ ├── апи
│ │ │ └── api_adapter.go
│ │ └── база данных
│ │ └── db_adapter.go
│ ├── приложение
│ │ ├── домен
│ │ │ ├── entity1.go
│ │ │ └── entity2.go
│ │ ├── порты
│ │ │ ├── ввод
│ │ │ │ ├── input_port1.go
│ │ │ │ └── input_port2.go
│ │ │ └── вывод
│ │ │ ├── output_port1.go
│ │ │ └── output_port2.go
│ │ └── варианты использования
│ │ ├── usecase1.go
│ │ └── usecase2.go
├── упак.
│ ├── ввод
│ │ ├── input1.go
│ │ └── input2.go
│ └── вывод
│ ├── output1.go
│ └── output2.go
└── продавец
├── модуль1
│ ├── file1.go
│ └── file2.go
└── модуль2
├── file1.go
└── file2.go
упаковка каталог содержит входные и выходные порты вашего приложения в этом примере. В этих файлах вы определите интерфейсы для входных и выходных портов.
внутренний каталог содержит домен приложения и варианты использования. В этих файлах вы будете писать бизнес-логику вашего приложения.
адаптеры каталог содержит код инфраструктуры, который соединяет ваше приложение с базой данных и API.
Настройка файловой структуры гексагональной архитектуры
Настройка файловой структуры гексагональной архитектуры вашего проекта может быть громоздкой, но вы можете написать сценарий bash для автоматизации процесса создания каталога.
Запустите эту команду в рабочем каталоге вашего проекта, чтобы создать bash-скрипт, шестиугольный.sh, и предоставьте ему права на чтение, запись и выполнение:
touch hexagonal.sh && chmod 777 hexagonal.sh
Введите этот баш-код в шестиугольный.sh чтобы создать файловую структуру в вашем текущем рабочем каталоге:
#!/бин/баш
# создаем каталоги верхнего уровня
mkdir cmd внутренний поставщик пакетов# создать каталог cmd/http
mkdir cmd/http# создаем внутренние каталоги
mkdir внутренний/адаптеры внутренние/приложение внутреннее/приложение/внутренний домен/приложение/внутренние порты/приложение/порты/внутренний ввод/приложение/порты/внутренний вывод/приложение/usecases# создаем внутренние каталоги/адаптеры
mkdir внутренний/адаптеры/внутренний API/адаптеры/база данных# создаем каталоги internal/app/ports
mkdir внутренний/приложение/порты/вход внутренний/приложение/порты/выход# создаем каталоги поставщиков
mkdir поставщик/модуль1 поставщик/модуль2
# напечатать сообщение об успешном завершении
эхо"Структура каталогов успешно создана."
Вы можете запустить этот bash-скрипт с помощью следующей команды:
./гексагональный.ш
Программа bash создает папки и подпапки, чтобы вы могли приступить к созданию файлов и написанию бизнес-логики для своего приложения.
Шестиугольная архитектура удобна для создания сложных приложений
Внедрение шестиугольной архитектуры может занять много времени, но в долгосрочной перспективе преимущества перевешивают затраты. Разделяя задачи и делая код более модульным, вы можете легко поддерживать и тестировать свои приложения.
Существует множество других архитектурных шаблонов, каждый из которых имеет свои плюсы и минусы для создания гибких и производительных приложений. К ним относится популярная архитектура MVC (модель, представление, контроллер) для создания веб-приложений.