Устройство backend разработки

Понимаю, что в интернете много статей на русском и английском языках, посвящённых разработке серверной архитектуры, однако их абстрактные объяснения не помогают мне составить целостную картину. Недавно я начал изучать Go, а до этого пробовал писать серверы на Node.js. Тогда я упускал из виду множество аспектов — просто потому, что не знал о них.

Сейчас я хочу создать полноценный продукт со структурой, соответствующей современным стандартам разработки: гибкой, поддерживаемой и масштабируемой. Однако столкнулся с трудностью при попытке правильно организовать архитектуру проекта.

Проблема:

Насколько я понимаю, обработка HTTP-запросов на сервере разбивается на несколько слоёв:

Роуты

Хендлеры

Сервисы

Я понимаю что такое роут и хендлер если нет сервисов. Но когда речь заходит о добавлении слоя сервисов, моё понимание начинает рассыпаться. Ранее я реализовывал всю логику в хендлерах. Однако, изучив несколько статей, я узнал о необходимости выделения логики в отдельный слой — сервисы.

Проблема в том, что я не понимаю:

Что именно должно входить в слой сервисов? Туда входит вся логика которая происходит в запросах или только определенная часть?

Что в таком случае должно остаться в хендлерах?

Просто я понимаю другие вещи, например: "утилиты" — это вспомогательные функции вроде хэширования или декодирования, "модели" описывают структуру данных БД. А вот "сервисы" остаются для меня непонятными.

P.S. Понимаю, что полагаться на нейросети для объяснений (особенно, когда ты вообще не понимаешь о чем речь) — не лучший подход, но даже после запроса примеров и разъяснений я не смог разобраться.

Буду благодарен за разъяснение с примерами или наглядным описанием.


Ответы (1 шт):

Автор решения: Pak Uula

Я не знаток терминологии, я больше на практике. Поэтому вот моё понимание того, как устроен нормальный бэкенд на Го:

  1. Nginx reverse proxy. Я никогда не выставляю приложение непосредственно в сеть. Причин тому множество -
  • SNI или размещение нескольких серверов на одном внешнем порту,
  • логирование запросов,
  • и самая главная - управление сертификатами.
  1. В самом приложении роутеры разбирают пути и вызывают обработчики запросов.

  2. Обработчики обрабатывают заголовки, определяют допустимость вызова (например, наличие кукесов аутентификации и их правильность), извлекают параметры и/или приложенные файлы. Всё извлечённое добро обработчики передают в реализацию для генерации ответа.

  3. Реализация. Наверное, это именно то, что у вас в вопросе называется сервисом. Реализации могут быть устроены самым разным образом. Но в большинстве бэкендов они выполняют схожие функции

  • заглядывают в базы данных
  • формируют ответ
  • обновляют базу данных
  • записывают ответ в ResponseWriter.
→ Ссылка