Финальный проект: создание многопоточного веб-сервера
Это было долгое путешествие, но мы дошли до конца книги. В этой главе мы вместе создадим ещё один проект, чтобы продемонстрировать некоторые концепции, рассмотренные в последних главах, а также повторим материал более ранних уроков.
В качестве финального проекта мы сделаем веб-сервер, который выводит «hello» и выглядит, как показано на Рисунке 21-1 в веб-браузере.

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