Финальный проект создания Веб-сервера

Это был долгий путь, но мы достигли конца книги. В этой главе мы вместе создадим ещё один проект, чтобы продемонстрировать некоторые концепции, рассмотренные в финальных главах, а также повторим некоторые предыдущие уроки.

Для нашего финального проекта мы создадим веб-сервер, который говорит «Привет!» и выглядит в веб-браузере как на Рисунке 21-1.

Вот наш план по созданию веб-сервера:

  1. Изучим основы TCP и HTTP.
  2. Организуем прослушивание TCP-подключений на сокете.
  3. Реализуем разбор небольшого количества HTTP-запросов.
  4. Создадим корректный HTTP-ответ.
  5. Увеличим пропускную способность нашего сервера с помощью пула потоков.

hello

Рисунок 21-1: Наш финальный совместный проект

Прежде чем мы начнём, следует упомянуть два момента. Во-первых, метод, который мы будем использовать, не является оптимальным способом создания веб-сервера на Rust. Участники сообщества опубликовали ряд готовых к использованию крейтов на crates.io, которые предоставляют более завершённые реализации веб-сервера и пула потоков, чем та, которую мы построим. Однако наша цель в этой главе — помочь вам учиться, а не пойти по лёгкому пути. Поскольку Rust является языком системного программирования, мы можем выбирать уровень абстракции, на котором хотим работать, и можем опуститься на более низкий уровень, чем это возможно или практично в других языках.

Во-вторых, мы не будем здесь использовать async и await. Создание пула потоков само по себе является достаточно сложной задачей без дополнительной необходимости создавать асинхронную среду выполнения! Однако мы отметим, как async и await могут быть применимы к некоторым проблемам, которые мы увидим в этой главе. В конечном счёте, как мы отмечали в Главе 17, многие асинхронные среды выполнения используют пулы потоков для управления работой.

Таким образом, мы напишем базовый HTTP-сервер и пул потоков вручную, чтобы вы могли изучить общие идеи и методы, лежащие в основе крейтов, которые вы, возможно, будете использовать в будущем.