Какие знаешь слои многослойной архитектуры

Ответ

В Go типичная многослойная архитектура включает:

  1. Transport (HTTP/gRPC) - обработка запросов/ответов
// HTTP handler
func (h *Handler) GetUser(c *gin.Context) {
    id := c.Param("id")
    user, err := h.service.GetUser(id)
    // ... обработка ошибок и отправка ответа
}
  1. Service/Business logic - ядро приложения, содержит бизнес-правила и координирует работу с репозиториями.
type UserService struct {
    repo Repository
}

func (s *UserService) GetUser(id string) (*User, error) {
    // Дополнительная бизнес-логика, валидация и т.д.
    return s.repo.GetByID(id)
}
  1. Repository - абстракция для работы с данными (базы данных, внешние API, файловая система).
type UserRepository struct {
    db *sql.DB
}

func (r *UserRepository) GetByID(id string) (*User, error) {
    // Выполнение запроса к БД и маппинг в модель
    row := r.db.QueryRow("SELECT id, name, email FROM users WHERE id = ?", id)
    user := &User{}
    err := row.Scan(&user.ID, &user.Name, &user.Email)
    if err != nil {
        return nil, err
    }
    return user, nil
}
  1. Models/Entities - структуры данных, представляющие сущности предметной области.
type User struct {
    ID    string
    Name  string
    Email string
}

Дополнительно могут быть:

  • Middleware: для обработки запросов до или после основных обработчиков (аутентификация, логирование).
  • DTO (Data Transfer Objects): структуры для передачи данных между слоями, часто отличаются от моделей.
  • Utils/Helpers: общие вспомогательные функции.

Ключевые принципы: слои изолированы, зависимости идут сверху вниз (Transport -> Service -> Repository -> Models). Каждый слой имеет свою ответственность, что упрощает тестирование и поддержку.