22
33# Go Чистая Архитектура
44
5- Шаблон Чистой Архитектурой для приложений на Golang
5+ Шаблон Чистой Архитектуры для приложений на Golang
66
77[ ![ Release] ( https://img.shields.io/github/v/release/evrone/go-clean-template.svg )] ( https://github.com/evrone/go-clean-template/releases/ )
88[ ![ License] ( https://img.shields.io/badge/License-MIT-success )] ( https://github.com/evrone/go-clean-template/blob/master/LICENSE )
2525Цель этого шаблона - показать принципы Чистой Архитектуры Роберта Мартина (дядюшки Боба):
2626
2727- как структурировать проект и не дать ему превратиться в спагетти-код
28- - где хранить бизнес-логику, что бы она оставалась независимой, чистой и расширяемой
28+ - где хранить бизнес-логику, чтобы она оставалась независимой, чистой и расширяемой
2929- как не потерять контроль при росте проекта
3030
3131[ Go-clean-template] ( https://evrone.com/go-clean-template?utm_source=github&utm_campaign=go-clean-template ) создан и
@@ -91,7 +91,7 @@ make compose-up-all
9191
9292### ` cmd/app/main.go `
9393
94- Инициализация конфигурации и логгера. Здесь вызывается основаная часть приложения из ` internal/app/app.go ` .
94+ Инициализация конфигурации и логгера. Здесь вызывается основная часть приложения из ` internal/app/app.go ` .
9595
9696### ` config `
9797
@@ -125,19 +125,19 @@ Protobuf файлы также используются для генераци
125125
126126### ` internal/app `
127127
128- Здесь находится только одна _ Run _ функция. Она размещена в файле ` app.go ` и является логическим продолжением функции
128+ Здесь находится только одна функция _ Run _ . Она размещена в файле ` app.go ` и является логическим продолжением функции
129129_ main_ .
130130
131131Здесь создаются все основные объекты.
132- [ Внедрение Зависимостей ] ( #внедрение-зависимостей ) происходит через конструктор "New ...".
133- Эта позволяет слоировать приложение, делая бизнес-логику независимой от других слоев.
132+ [ Внедрение зависимостей ] ( #внедрение-зависимостей ) происходит через конструктор "New ...".
133+ Это позволяет слоировать приложение, делая бизнес-логику независимой от других слоев.
134134
135- Далее, запускается сервер и ожидается сигнал в _ select_ для корректного завершения работы.
135+ Далее запускается сервер и ожидается сигнал в _ select_ для корректного завершения работы.
136136Если ` app.go ` стал слишком большим, вы можете разделить его на несколько файлов.
137137
138138Если зависимостей много, то для удобства можно использовать [ wire] ( https://github.com/google/wire ) .
139139
140- Файл ` migrate.go ` испольузется для автоматической миграции базы данных.
140+ Файл ` migrate.go ` используется для автоматической миграции базы данных.
141141Он включается в компиляцию только при указании тега _ migrate_ .
142142Пример:
143143
@@ -147,17 +147,17 @@ go run -tags migrate ./cmd/app
147147
148148### ` internal/controller `
149149
150- Слой хэндлеров сервера (MVC контроллеры). В шаблоне показана работа 3х серверов:
150+ Слой хэндлеров сервера (MVC контроллеры). В шаблоне показана работа 3 серверов:
151151
152152- AMQP RPC (на основе RabbitMQ в качестве транспорта)
153153- gRPC ([ gRPC] ( https://grpc.io/ ) фреймворк на основе protobuf)
154154- REST API ([ Fiber] ( https://github.com/gofiber/fiber ) фреймворк)
155155
156156Маршрутизаторы http сервера пишутся в едином стиле:
157157
158- - Хэндлеры сгруппируются по области применения (по общему критерию)
159- - Для каждый группы создается свой маршрутизатор
160- - Объект бизнес-логики передается в маршрутизатор, что бы быть доступным внутри хэндлеров
158+ - Хэндлеры группируются по области применения (по общему критерию)
159+ - Для каждой группы создается свой маршрутизатор
160+ - Объект бизнес-логики передается в маршрутизатор, чтобы быть доступным внутри хэндлеров
161161
162162#### ` internal/controller/amqp_rpc `
163163
@@ -199,7 +199,7 @@ reflection.Register(app)
199199#### ` internal/controller/http `
200200
201201Простое версионирование REST API.
202- Для создания версии v2, нужно создать папку ` http/v2 ` с таким же содержимым.
202+ Для создания версии v2 нужно создать папку ` http/v2 ` с таким же содержимым.
203203Добавить в файл ` internal/controller/http/router.go ` строки:
204204
205205``` go
@@ -221,18 +221,18 @@ swagger [swag](https://github.com/swaggo/swag).
221221### ` internal/entity `
222222
223223Сущности бизнес-логики (модели). Могут быть использованы в любом слое.
224- Также они могуть иметь методы, например, для валидации.
224+ Также они могут иметь методы, например, для валидации.
225225
226226### ` internal/usecase `
227227
228228Бизнес-логика.
229229
230- - Методы сгруппированы по области применения (по общему критерию)
230+ - Методы группируются по области применения (по общему критерию)
231231- У каждой группы своя отдельная структура
232232- Один файл - одна структура
233233
234234Репозитории, webapi, rpc и другие структуры передаются в слой бизнес-логики в связующем файле ` internal/app/app.go `
235- (смотрите [ Внедрение Зависимостей ] ( #внедрение-зависимостей ) ).
235+ (смотрите [ Внедрение зависимостей ] ( #внедрение-зависимостей ) ).
236236
237237#### ` internal/repo/persistent `
238238
@@ -242,7 +242,7 @@ swagger [swag](https://github.com/swaggo/swag).
242242
243243Это абстрактное web API, с которым взаимодействует бизнес-логика.
244244Например, это может быть внешний микросервис, к которому бизнес-логика обращается через REST API.
245- Название пакета выбирается таким, что бы соответствовать его назначению.
245+ Название пакета выбирается таким, чтобы соответствовать его назначению.
246246
247247### ` pkg/rabbitmq `
248248
@@ -252,13 +252,13 @@ RabbitMQ RPC паттерн:
252252- Используется fanout-обмен, к которому привязана одна эксклюзивная очередь - это наиболее производительная конфигурация
253253- Переподключение при потере соединения
254254
255- ## Внедрение Зависимостей
255+ ## Внедрение зависимостей
256256
257257Для устранения зависимости бизнес-логики от внешних пакетов используется внедрение зависимостей.
258258
259259Например, через конструктор "New" внедряется репозиторий в слой бизнес-логики.
260260Это делает бизнес-логику независимой и переносимой.
261- Мы можем переписать реализацию интерфейса репозитория не внося изменения в пакет бизнес-логики ` usecase ` .
261+ Мы можем переписать реализацию интерфейса репозитория, не внося изменения в пакет бизнес-логики ` usecase ` .
262262
263263``` go
264264package usecase
@@ -298,7 +298,7 @@ func (uc *UseCase) Do() {
298298
299299Программисты создают оптимальную архитектуру приложения после написания основной части кода.
300300
301- > Хорошая архитектура позволяет отклыдывать изменение как можно дольше.
301+ > Хорошая архитектура позволяет откладывать изменения как можно дольше.
302302
303303### Основной принцип
304304
@@ -309,28 +309,28 @@ func (uc *UseCase) Do() {
309309Например, приложение можно разделить на два слоя - внутренний и внешний:
310310
3113111 . ** Бизнес-логика** (например, стандартная библиотека Go).
312- 2 . ** Инструменты** (базы данных, сервера , брокеры сообщений и другие библиотеки и фреймворки).
312+ 2 . ** Инструменты** (базы данных, серверы , брокеры сообщений и другие библиотеки и фреймворки).
313313
314314![ Чистая архитектура] ( docs/img/layers-1.png )
315315
316316** Внутренний слой** с бизнес-логикой должен быть чистым. Он обязан:
317317
318- - Не импортировать пакеты с внешних слоев.
318+ - Не импортировать пакеты из внешних слоев.
319319- Использовать только стандартную библиотеку.
320320- Взаимодействовать с внешними слоями через интерфейсы (!).
321321
322322Бизнес-логика не должна ничего знать о Postgres или о реализации web API.
323- Бизнес-логика имеет интерфейс для взаимодейсвтия с _ абстрактной_ базой данных или _ абстрактным_ web API.
323+ Бизнес-логика имеет интерфейс для взаимодействия с _ абстрактной_ базой данных или _ абстрактным_ web API.
324324
325325** Внешний слой** имеет ограничения:
326326
327- - Компоненты этого слоя не могут знать друг о друге и взаимодействать напрямую. Обращение друг к другу происходит через
327+ - Компоненты этого слоя не могут знать друг о друге и взаимодействовать напрямую. Обращение друг к другу происходит через
328328 внутренний слой - слой бизнес-логики.
329329- Вызовы во внутренний слой выполняются через интерфейсы (!).
330330- Данные передаются в формате, удобном для бизнес-логики (структуры хранятся в ` internal/entity ` ).
331331
332- Например, нужно обратиться к базе данных из HTTP хэндера (в слое контроллер).
333- База данных и HTTP находятся во внешнем слое. Они не знаю друг о друге ничего и не могут взаимодействовать напрямую.
332+ Например, нужно обратиться к базе данных из HTTP хэндлера (в слое контроллер).
333+ База данных и HTTP находятся во внешнем слое. Они не знают друг о друге ничего и не могут взаимодействовать напрямую.
334334Взаимодействие будет происходить через слой бизнес-логики ` usecase ` :
335335
336336```
@@ -366,12 +366,12 @@ func (uc *UseCase) Do() {
366366
367367### Терминология в Чистой Архитектуре
368368
369- - ** Entities** (сущности) - это структуры, с которыми работает бизнес логика.
369+ - ** Entities** (сущности) - это структуры, с которыми работает бизнес- логика.
370370 Они располагаются в папке ` internal/entity ` .
371371 В терминологии MVC сущности - это модели.
372- - ** Use Cases** это бизнес-логика. Располагается в папке ` internal/usecase ` .
372+ - ** Use Cases** - это бизнес-логика. Располагается в папке ` internal/usecase ` .
373373
374- Слой, с которым бизнес-логика взаимодействует напрямую, обычно, называется _ инфраструктурным_ слоем.
374+ Слой, с которым бизнес-логика взаимодействует напрямую, обычно называется _ инфраструктурным_ слоем.
375375Это может быть репозиторий ` internal/usecase/repo ` , внешнее webapi ` internal/usecase/webapi ` , любой пакет или
376376микросервис.
377377В шаблоне пакеты _ infrastructure_ размещены внутри ` internal/usecase ` .
@@ -392,7 +392,7 @@ func (uc *UseCase) Do() {
392392для создания больших монолитных приложений предложено 4 слоя.
393393
394394В исходной версии внешний слой делится на два, которые также имеют инверсию зависимостей в другие слои и взаимодействуют
395- через интерфесы .
395+ через интерфейсы .
396396
397397Внутренний слой также делится на два (с использованием интерфейсов) в случае сложной логики.
398398
@@ -403,11 +403,11 @@ func (uc *UseCase) Do() {
403403
404404### Другие подходы
405405
406- Кроме Чистой Архитектуры есть и другие подоходы :
406+ Кроме Чистой Архитектуры есть и другие подходы :
407407
408408- Луковая Архитектура
409- - Гексогональная (_ Порты и адаптеры_ также на неё похожа )
410- Они обе основаны на на принципе инверсии зависимостей.
409+ - Гексагональная (_ Порты и адаптеры_ также похожа на неё)
410+ Они обе основаны на принципе инверсии зависимостей.
411411 _ Порты и адаптеры_ очень похожи на _ Чистую Архитектуру_ . Различия в основном заключаются в терминологии.
412412
413413## Похожие проекты
0 commit comments