Финальный проект: создание многопоточного веб-сервера
Путь был долгим, но мы добрались до конца книги. В этой главе мы вместе создадим еще один проект, чтобы продемонстрировать некоторые понятия, которые рассматривали в последних главах, а также повторить некоторые более ранние уроки.
В качестве финального проекта мы сделаем веб-сервер, который говорит “Hello!” и выглядит в веб-браузере так, как показано на рисунке 21-1.
Вот наш план создания веб-сервера:
- Немного узнать о TCP и HTTP.
- Слушать TCP-соединения на сокете.
- Разбирать небольшое количество HTTP-запросов.
- Создать правильный HTTP-ответ.
- Улучшить пропускную способность нашего сервера с помощью пула потоков.
Рисунок 21-1: наш последний совместный проект
Прежде чем начать, нужно упомянуть две детали. Во-первых, метод, который мы будем использовать, не является лучшим способом создать веб-сервер на Rust. Участники сообщества опубликовали ряд готовых к промышленному использованию крейтов на crates.io с более полными реализациями веб-сервера и пула потоков, чем та, которую мы создадим. Однако наша цель в этой главе — помочь вам учиться, а не идти самым легким путем. Поскольку Rust — язык системного программирования, мы можем выбирать уровень абстракции, с которым хотим работать, и можем спускаться на более низкий уровень, чем это возможно или практично в других языках.
Во-вторых, здесь мы не будем использовать async и await. Создание пула потоков само по себе достаточно сложная задача, даже без добавления разработки async runtime! Однако мы отметим, как async и await могут быть применимы к некоторым из тех же проблем, которые мы увидим в этой главе. В конечном счете, как мы отмечали ранее в главе 17, многие async runtime используют пулы потоков для управления своей работой.
Поэтому мы вручную напишем базовый HTTP-сервер и пул потоков, чтобы вы могли изучить общие идеи и техники, лежащие в основе крейтов, которые, возможно, будете использовать в будущем.