Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Финальный проект: многопоточный веб-сервер

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

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

План создания веб-сервера такой:

  1. Немного разобраться в TCP и HTTP.
  2. Слушать TCP-соединения на сокете.
  3. Разбирать небольшое количество HTTP-запросов.
  4. Формировать правильный HTTP-ответ.
  5. Увеличить пропускную способность сервера с помощью пула потоков.
Снимок экрана браузера по адресу 127.0.0.1:8080: веб-страница с текстом «Hello! Hi from Rust»

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

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

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

Поэтому мы напишем простой HTTP-сервер и пул потоков вручную — чтобы вы разобрались в общих идеях и приёмах, на которых построены крейты, которыми вы, возможно, будете пользоваться в будущем.