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