Обзорная статья, посвященная разработке бэкенд-систем для web-приложений на языке программирования C++. Приведена общая архитектура, план действий, перечислены популярные библиотеки и альтернативные решения. Полезно для людей, которым необходимо создать веб-приложение на этом стеке технологий, но они не знают, с чего начать.
При этом самый классический из классических язык программирования, C++, почему-то обходят стороной. Он считается недостаточно высокоуровневым для создания web-бэкенда. Написание кода логики серверной принимающей части в умах разработчиков связано с накидыванием огромного количества кода и реализацией всей низкоуровневой части этой логики. Наконец, люди боятся создавать многопоточное приложение на C++. И совершенно напрасно.
Под C++ нет общепризнанных стандартов для создания бэкенда. Библиотек очень много и в их обилии легко запутаться. Это отпугивает. Действительно, требуется высокая квалификация, чтобы написать базу для своего web-сервиса, да и сам порог вхождения в технологию куда выше, чем в том же Go. Код получается несколько громоздким, не существует решения, позволяющего инициализировать бэкенд в 5-6 строчек кода, как в Node.js.
Однако у C++ есть и ряд преимуществ по сравнению с ориентированными на web конкурентами. Прежде всего, это высокая производительность. Сравниться по скорости с компилируемыми языками интерпретируемым практически невозможно, а большинство высокоуровневых языков для создания бэкендов как раз интерпретируемые. Конечно, для них существуют хорошие инструменты повышения производительности. Но ни один из них не позволит обогнать C++-решение по скорости работы. Такие ускорители требуют настройки, дополнительного изучения и поддержки со стороны системного программиста.
C++, который работает даже на микроволновке, является образцом технологии переносимого кода. Бэкенд на C++ можно собрать под любую платформу, даже самую редкую и специфичную, а часть кодов спокойно позаимствовать из открытых библиотек и предыдущих проектов. Мощная объектно-ориентированная парадигма позволяет создавать невероятную по сложности бизнес-логику. В наличии большая общая база кодов, включающая машинное обучение, численные методы, работу с big data, компьютерное зрение. Она позволяет создавать любое приложение, каким бы специфичным оно ни было.
К слову, для базы web-бэкенда нужно реализовать не так много «низкоуровневых» компонентов — принимающую http-часть (поверх которой сейчас модно создавать RESTful API), маршалинг объектов, парсинг JSON (реже XML, еще реже разбираются различные кастомные бинарные форматы), многопоточную обработку клиента и связь с любой популярной СУБД. При выдаче результатов клиенту в браузер зачастую нужен еще шаблонизатор.
Для создания REST API в C++ недавно появился классный фреймворк от Microsoft – C++ REST SDK. Также хорошая реализация локального web-сервера с нужным инструментарием, парсингом JSON и XML, оберткой над популярными базами данных имеется в POCO. Можно написать собственный http-сервер на основе boost::io, это несложно.
На boost также быстро пишется распараллеливание (а также на OpenMP и OpenCL), парсинг JSON и XML. Для баз данных же C++ - стандарт, поэтому большинство СУБД официально имеют клиентское API в виде библиотек под плюсы, например, для самой популярной из реляционных баз данных, Postgresql, это библиотеки libpqxx и libpq++. В качестве шаблонизатора можно присмотреться к Wt.
Великолепная для разработки пользовательского интерфейса надстройка над C++, Qt, хотя и обладает классным API для построения web-бэкенда, все же не рекомендуется к использованию. Qt обладает крайне низкой производительностью и большим количеством подводных камней.
В целом, если есть возможность не писать web-бэкенд на C++, то лучше ею воспользоваться. Аналогичный код на Golang или RoR выйдет более поддерживаемым и емким. Однако при повышенным требованиям к скорости работы или узкой специфике целевой платформы нужно держать в голове, что создание web-бэкенда на C++ - процесс сравнительно безболезненный и не лишенный изящества.
25 февраля 2021 в 03:36
В теории конечно все хорошо, а где практика, какие либо работающие примеры с самым небольшим функционалом??? Хотя бы пример того вернуть список пользователей по POST запросу от веб-приложения…
25 февраля 2021 в 04:18
Спасибо за замечание. Обязательно добавим подробный материал.