Устройство backend разработки
Понимаю, что в интернете много статей на русском и английском языках, посвящённых разработке серверной архитектуры, однако их абстрактные объяснения не помогают мне составить целостную картину. Недавно я начал изучать Go, а до этого пробовал писать серверы на Node.js. Тогда я упускал из виду множество аспектов — просто потому, что не знал о них.
Сейчас я хочу создать полноценный продукт со структурой, соответствующей современным стандартам разработки: гибкой, поддерживаемой и масштабируемой. Однако столкнулся с трудностью при попытке правильно организовать архитектуру проекта.
Проблема:
Насколько я понимаю, обработка HTTP-запросов на сервере разбивается на несколько слоёв:
Роуты
Хендлеры
Сервисы
Я понимаю что такое роут и хендлер если нет сервисов. Но когда речь заходит о добавлении слоя сервисов, моё понимание начинает рассыпаться. Ранее я реализовывал всю логику в хендлерах. Однако, изучив несколько статей, я узнал о необходимости выделения логики в отдельный слой — сервисы.
Проблема в том, что я не понимаю:
Что именно должно входить в слой сервисов? Туда входит вся логика которая происходит в запросах или только определенная часть?
Что в таком случае должно остаться в хендлерах?
Просто я понимаю другие вещи, например: "утилиты" — это вспомогательные функции вроде хэширования или декодирования, "модели" описывают структуру данных БД. А вот "сервисы" остаются для меня непонятными.
P.S. Понимаю, что полагаться на нейросети для объяснений (особенно, когда ты вообще не понимаешь о чем речь) — не лучший подход, но даже после запроса примеров и разъяснений я не смог разобраться.
Буду благодарен за разъяснение с примерами или наглядным описанием.
Ответы (1 шт):
Я не знаток терминологии, я больше на практике. Поэтому вот моё понимание того, как устроен нормальный бэкенд на Го:
- Nginx reverse proxy. Я никогда не выставляю приложение непосредственно в сеть. Причин тому множество -
- SNI или размещение нескольких серверов на одном внешнем порту,
- логирование запросов,
- и самая главная - управление сертификатами.
В самом приложении роутеры разбирают пути и вызывают обработчики запросов.
Обработчики обрабатывают заголовки, определяют допустимость вызова (например, наличие кукесов аутентификации и их правильность), извлекают параметры и/или приложенные файлы. Всё извлечённое добро обработчики передают в реализацию для генерации ответа.
Реализация. Наверное, это именно то, что у вас в вопросе называется сервисом. Реализации могут быть устроены самым разным образом. Но в большинстве бэкендов они выполняют схожие функции
- заглядывают в базы данных
- формируют ответ
- обновляют базу данных
- записывают ответ в
ResponseWriter.