Rust cерверы, сервисы и приложения
Этот материал представляет из себя практически полную версию книги Rust Servers, Services, and Apps, автора Prabhu Eshwarla. Если вы желаете прочитать книгу с благодарностями, то можно купить ее здесь или скачать где-то еще.
Содержание
ЧАСТЬ 1 ВЕБ-СЕРВЕРЫ И СЕРВИСЫ
1. Почему Rust подходит для веб-приложений?
1.1. Знакомство с современными веб-приложениями
1.2. Выбор Rust для веб-приложений
Характеристики веб-приложений
Преимущества Rust для веб-приложений
Чего нет в Rust?
1.3. Визуализация примера приложения
Что мы будем создавать?
Технические рекомендации для примера приложения
2. Написание базового веб-сервера с нуля
2.1. Сетевая модель
2.2. Написание TCP-сервера в Rust
Проектирование потока обмена данными по протоколу TCP/IP
Написание TCP-сервера и клиента
2.3. Написание HTTP-сервера в Rust
Анализ сообщений с HTTP-запросами
Построение HTTP-ответов
Написание функции main() и серверного модуля
Написание модулей маршрутизатора и обработчика
Тестирование веб-сервера
3. Создание веб-службы RESTful
3.1. Начало работы с Actix
Написание первого REST API
Понимание концепций Actix
3.2. Построение веб-API с помощью REST
Определение объема и структуры проекта, определение состояния приложения и управление им
Определение модели данных
Публикация курса
Подготовка всех курсов для преподавателя
Получение подробной информации об одном курсе
4 Выполнение операций с базой данных
4.1. Настройка структуры проекта
4.2. Создание нашего первого асинхронного подключения к базе данных (итерация 1)
Выбор базы данных и библиотеки подключений
Настройка базы данных и подключение к асинхронному пулу
4.3. Настройка веб-службы и написание модульных тестов (итерация 2)
Настройка зависимостей и маршрутов
Настройка состояния приложения и модели данных
Настройка пула подключений с использованием внедрения зависимостей
Написание модульных тестов
4.4. Создание и запрос записей из базы данных (итерация 3)
Написание функций доступа к базе данных, написание функций обработчика
Написание функции main() для веб-службы, поддерживаемой базой данных
5. Обработка ошибок
5.1. Настройка структуры проекта
5.2. Базовая обработка ошибок в Rust и Actix Web
5.3. Определение пользовательского обработчика ошибок
5.4. Обработка ошибок для получения всех курсов
5.5. Обработка ошибок для получения сведений о курсе
5.6. Обработка ошибок при публикации нового курса
6 Разработка API и бесстрашный рефакторинг
6.1. Обновление структуры проекта
6.2. Усовершенствование модели данных для создания курса и управления им
Внесение изменений в модель данных
Внесение изменений в API курса
6.3. Возможность регистрации репетиторов и управления ими
Модель данных и маршруты для репетиторов
Функции обработки маршрутов для репетиторов
Функции доступа к базе данных для маршрутов для репетиторов
Сценарии базы данных для репетиторов
Запуск и тестирование API-интерфейсов для репетиторов
ЧАСТЬ 2 СЕРВЕРНЫЕ ВЕБ-ПРИЛОЖЕНИЯ
7. Внедрение серверных веб-приложений в Rust
7.1. Внедрение серверного рендеринга
7.2. Обслуживание статической веб-страницы с помощью Actix 172
7.3. Рендеринг динамической веб-страницы с помощью Actix и Tera
7.4. Добавление пользовательского ввода с помощью форм
7.5. Отображение списка с шаблонами
7.6. Написание и запуск клиентских тестов
7.7. Подключение к серверной веб-службе
8. Работа с шаблонами для регистрации преподавателя
8.1. Написание исходного веб-приложения
8.2. Отображение регистрационной формы
8.3. Обработка заявки на регистрацию
9. Работа с формами для сопровождения курса
9.1. Разработка аутентификации пользователя
9.2. Настройка структуры проекта
9.3. Реализация аутентификации пользователя
9.4. Маршрутизация HTTP-запросов
9.5. Создание ресурса с помощью метода HTTP POST
9.6. Обновление ресурса с помощью метода HTTP PUT
9.7. Удаление ресурса с помощью метода HTTP DELETE
ЧАСТЬ 3 РАСШИРЕННАЯ ТЕМА: АСИНХРОННЫЙ RUST
10. Понимание асинхронного Rust
10.1. Знакомство с концепциями асинхронного программирования
10.2. Написание параллельных программ
10.3. Более глубокое изучение асинхронного Rust
10.4. Понимание будущего
10.5. Реализация пользовательского будущего
11. Создание P2P-узла с помощью асинхронного Rust
11.1. Внедрение одноранговых сетей
Транспорт
Идентификация сверстников
Безопасность
Одноранговая маршрутизация
Обмен сообщениями
Мультиплексирование потоков
11.2 Понимание базовой архитектуры сетей libp2p
Идентификаторы одноранговых узлов и пары ключей
Множественные адреса
Поведение роя и сети
11.3. Обмен командами ping между одноранговыми узлами
11.4. Знакомство с аналогами
12. Развертывание веб-служб с помощью Docker
12.1. Ознакомление с производственным развертыванием серверов и приложений
Цикл развертывания программного обеспечения
Основы контейнера Docker
12.2. Написание контейнера Docker
Проверка установки Docker
Написание простого контейнера Docker
Многоступенчатая сборка Docker
12.3. Создание контейнера базы данных
Упаковка базы данных Postgres
Создание таблиц базы данных
12.4. Упаковка веб-сервиса с помощью Docker
12.5. Организация контейнеров Docker с помощью Docker Compose
Приложение: Установка Postgres
Индекс
Предисловие
Создание высокопроизводительных сетевых сервисов остается сложной задачей при использовании любого языка программирования. Rust обладает несколькими уникальными функциями, которые значительно снижают порог сложности.
Действительно, Rust с самого начала разрабатывался как язык для высококонкурентных и безопасных систем. Несколько языков программирования (таких как C, C++, Go, Java, JavaScript и Python) используются для разработки высокопроизводительных и надежных сетевых сервисов, которые могут работать на одном узле или как часть многоузловой распределенной системы, либо в локальных центрах обработки данных, либо в облаке, но несколько моментов делают Rust привлекательной альтернативой:
Небольшая занимаемая площадь (благодаря полному контролю за использованием памяти и процессора)
Безопасность и надежность (благодаря безопасности памяти и данных, обеспечиваемой компилятором)
Низкая задержка (нет сборщика мусора)
Современный язык отличается небольшой занимаемой площадью (благодаря полному контролю за использованием памяти и процессора)
Безопасность и безотказность (за счет сохранения памяти и данных, обеспечиваемых компилятором)
Низкая задержка (отсутствует сборщик мусора)
Современные возможности языка
В этой книге рассказывается о различных инструментах, методах и технологиях, которые могут быть использованы для создания эффективных и надежных веб-сервисов и приложений с использованием Rust. В нем также дается практическое представление о сетевых службах и веб-приложениях в Rust, начиная с базовых одноузловых однопоточных серверов, построенных на основе стандартных библиотечных примитивов, и заканчивая продвинутыми многопоточными асинхронными распределенными серверами, работающими на разных уровнях стека протоколов. Вы узнаете о:
Сетевые примитивы в стандартной библиотеке Rust
Базовые HTTP-сервисы
Серверы REST API, поддерживаемые реляционной базой данных
Распределенные серверы с P2P-сетями
Высококонкурентные асинхронные серверы
Эта книга предназначена для того, чтобы научить вас разрабатывать веб-сервисы и приложения в Rust, используя подход, похожий на учебное пособие, на примере одного примера и постепенно совершенствуя его на протяжении нескольких итераций по мере прохождения глав. Я надеюсь, что вы найдете эту книгу интересной, а изложенный в ней подход достаточно практичным, чтобы применить его непосредственно в вашей сфере деятельности.
Об этой книге
Эта книга не является справочным руководством; скорее, она задумана как введение и должна служить вдохновляющим руководством по широте сетевых сервисов, которые можно разрабатывать в Rust. Она принимает форму практического руководства, чтобы максимизировать обучение и запоминание.
Кому следует прочитать эту книгу
Эта книга предназначена в первую очередь для инженеров-программистов, занимающихся разработкой серверной части, веб-серверной части и API; инженеров по распределенным системам, которые хотят изучить Rust как альтернативу Go, Java или C++; и инженеров-программистов, работающих с серверами и приложениями с низкой задержкой в таких областях, как машинное обеспечение. обучение, искусственный интеллект, Интернет вещей, обработка изображений/видео/аудио и серверные системы для систем реального времени.
Чтобы извлечь максимальную пользу из этой книги, вы должны иметь как опыт бэкенд-разработки, так и некоторое знакомство с Rust. В частности, как бэкенд-разработчик, вы должны обладать навыками в концепциях веб-сервисов, включая HTTP, JSON, доступ к базам данных с ORM и разработку API на любом языке высокого уровня (например, Java, JavaScript, Python, C#, Go или Ruby). Как продвинутый начинающий или программист Rust среднего уровня, вы должны понимать, как копировать и изменять учебные пособия и репозитории с открытым исходным кодом, и быть знакомы со следующими аспектами Rust:
Примитивы Rust (типы данных), определяемые пользователем структуры данных (структуры, перечисления), функции, выражения и циклы управления (циклы if, for и while)
Неизменяемость, владение, ссылки и заимствование
Обработка ошибок с помощью структур Result и option
Базовые функциональные конструкции в Rust
Набор инструментов Rust, включая инструменты для сборки, управления зависимостями, форматирования кода, документацию и средства автоматизированного тестирования
Пожалуйста, ознакомьтесь с разделом “Другие онлайн-ресурсы” далее в этом разделе для получения рекомендаций по обновлению или расширению ваших знаний о Rust.
Как организована эта книга: дорожная карта
Эта книга представляет собой серию практических проектов, каждый из которых посвящен определенному типу сетевого сервиса, который может быть разработан в Rust. Вы узнаете об этом, изучая код и работая над ним. Соответствующая теория объясняется по ходу работы в контексте этих проектов. Вам также будет предложено попробовать некоторые предложенные упражнения по кодированию.
Эта книга состоит из 12 глав, разделенных на три части. В первой части излагаются основные концепции веб-приложения и закладываются основы для следующих разделов. Мы будем разрабатывать серверную часть веб-приложения, которая будет становиться все более сложной и, наконец, достигнет стадии, близкой к производственной готовности.
Часть 1 состоит из следующих глав:
Глава 1 знакомит с ключевыми концепциями, такими как распределенные архитектуры и веб-приложения. Она также знакомит с приложением, которое мы разработаем в этой книге. Наконец, она суммирует сильные стороны Rust и дает некоторые подсказки о том, когда использовать Rust, а когда нет.
Глава 2 — это разминочная глава для остальной части книги. Мы разработаем несколько компонентов на основе TCP, чтобы познакомиться с возможностями Rust в этой области.
Глава 3 показывает, как создавать RESTful веб-сервисы с использованием Rust и некоторых хорошо выбранных контейнеров среди богатой экосистемы, которая уже существует (и продолжает расти). Она также объясняет, что такое состояние приложения и как им управлять.
Глава 4 посвящена необходимости сохранения данных в базе данных. Мы будем использовать простой, но эффективный контейнер, взаимодействующий с базами данных SQL.
В главе 5 рассматривается важный аспект реагирования на непредвиденные обстоятельства при вызове веб-сервисов, которые мы разработали к настоящему моменту.
Глава 6 показывает, насколько легко и безопасно рефакторить код при разработке с использованием Rust, поскольку API нашего веб-сервиса становится все более мощным и сложным.
Часть 2 посвящена другой части веб-приложения, а именно его frontend, с его графическим пользовательским интерфейсом (GUI). В этой книге я выбрал простой подход, который опирается на серверную визуализацию вместо сложных веб-фреймворков, которые работают в браузере. Эта часть состоит из трех глав
Глава 7 знакомит с выбранной серверной структурой рендеринга и показывает, как запрашивать у пользователя ввод данных и как работать со списками элементов. Она также показывает, как взаимодействовать с бэкэнд-веб-сервисом, разработанным в предыдущей части.
Глава 8 фокусируется на механизме шаблонизации, используемом на стороне сервера. Она показывает, как поддерживать регистрацию пользователей с помощью нескольких форм.
Глава 9 рассматривает более сложные темы веб-приложений, такие как аутентификация пользователей, маршрутизация и эффективное использование веб-сервисов RESTful для обслуживания данных в режиме CRUD (создание, чтение, обновление, удаление).
Часть 3 охватывает три продвинутые темы, которые не имеют прямого отношения к веб-сервису и веб-приложению, которые мы создали до сих пор, но которые важны для всех, кто интересуется созданием сложных серверов Rust и подготовкой их к развертыванию в рабочей среде:
Глава 10 знакомит с асинхронным программированием и тем, как Rust поддерживает эту парадигму программирования. Затем асинхронное программирование иллюстрируется несколькими простыми примерами.
В главе 11 показаны возможности Rust для разработки одноранговых (P2P) приложений с использованием Rust и нескольких тщательно подобранных крейтов.
В главе 12 демонстрируется подготовка и упаковка нашего веб-приложения в образ Docker, который затем можно развернуть в различных средах (от локальной рабочей станции до облака).
О коде
Исходный код этой книги доступен на GitHub: https://github.com/peshwar9/rust-servers-services-apps. Этот репозиторий структурирован по главам книги. Как правило, предоставленный код для каждой главы соответствует заключительному этапу кода для главы. Вам предлагается кодировать вместе, начиная с кода в его состоянии в конце предыдущей главы и позволяя ему развиваться постепенно, как описано в каждой главе. В случае возникновения проблемы исходный код с GitHub должен показать вам, что пошло не так, или, по крайней мере, предоставить хорошую основу для возобновления разработки.
Настройка среды должна быть простой для любого, кто уже немного разрабатывал на Rust: все, что требуется, — это стандартный набор инструментов Rust и хорошая IDE (интегрированная среда разработки), например VS Code, с некоторыми расширениями поддержки Rust (рекомендуется Rust Extension Pack; Rust Syntax и Rust Doc Viewer также являются приятными дополнениями). Чтобы извлечь максимальную пользу из GitHub и контроля версий, Git также должен быть установлен, но это не обязательно, так как вы также можете загрузить исходный код в виде zip-архива с GitHub.
Эта книга содержит много примеров исходного кода как в пронумерованных листингах, так и в строке с обычным текстом. В обоих случаях исходный код отформатирован шрифтом фиксированной ширины, как этот, чтобы отделить его от обычного текста.
Во многих случаях исходный код был переформатирован; мы добавили разрывы строк и переработали отступы, чтобы разместить доступное пространство страницы в книге. В редких случаях даже этого было недостаточно, и листинги включали маркеры продолжения строки ( ). Кроме того, комментарии в исходном коде часто удалялись из листингов, когда код описывался в тексте. Аннотации кода сопровождают многие листинги, выделяя важные концепции.
Полный код для примеров в книге доступен для загрузки с GitHub по адресу: https://github.com/peshwar9/rust-servers-services-apps.
Другие онлайн-ресурсы
Rust как язык программирования поддерживается несколькими прекрасными онлайн-ресурсами, управляемыми создателями Rust, а также рядом независимых ресурсов, таких как Medium. Вот некоторые рекомендуемые ресурсы:
Rust Book — официальное руководство от разработчиков Rust (www.rust-lang.org/learn). Эта онлайн-книга содержит раздел о написании сетевых серверов, но он очень базовый.
Rust by Example — дополнение к The Rust Book: https://doc.rust-lang.org/rust-by-example/index.html.
Cargo Book — еще одна книга с официального сайта языка Rust, посвященная менеджеру пакетов Cargo: https://doc.rust-lang.org/cargo/index.html.
Форум пользователей Rust: https://users.rust-lang.org/
Об авторе
ПРАБХУ ЭШВАРЛА в настоящее время является техническим директором стартапа, создающего блокчейн уровня 1, разработанный с использованием Rust. Прабху глубоко заинтересовался Rust как языком программирования и активно изучает его и работает над ним с июля 2019 года. Ранее он занимал несколько руководящих должностей в области разработки программного обеспечения и технологий в Hewlett Packard.
Об иллюстрации на обложке
Фигура на обложке Rust Servers, Services, and Apps — «Homme Toungouse» или «Тунгусский человек», взятая из коллекции Жака Грассе де Сен-Совера, опубликованной в 1788 году. Каждая иллюстрация тщательно прорисована и раскрашена вручную.
В те дни было легко определить, где люди живут, какова их профессия или положение в жизни, просто по их одежде. Мэннинг прославляет изобретательность и инициативу компьютерного бизнеса с помощью обложек книг, основанных на богатом разнообразии региональной культуры многовековой давности, возвращенных к жизни фотографиями из таких коллекций, как эта.