Всем привет! Наверно многие уже знают про язык программирования Rust. Но если кто не знает, Rust - мультипарадигмальный компилируемый язык программирования общего назначения. Всем известно что Rust в основном используется для создания CLI приложений и системного программирования, но у него есть другие области. Например - разработка видео-игр, но мы не об этом. Сегодня я бы хотел обсудить веб-программирование на Rust.
Rust производительный и безопасный язык программирования, он надёжный, быстрый и удобный. Поэтому его стали использовать для веб-программирования. В основном для этого есть два фреймворка для создания веб-приложений, Actix-Web и Rocket. Лично я частенько использую Actix-Web из-за высокой производительности и простоты писании кода на нём.
Actix-Web - производительный фреймворк для создании веб-приложений на Rust. Он очень лёгкий и удобный. Его удобность - быстрота в одном исполняемом файле. Просто запускаешь .exe файл и целое приложение у тебя в одном файле, чем у PHP у которого половину папок и файлов занимает Docker и Composer. Actix-Web основан на другой библиотеке (Actix, да-да, не Web а просто Actix), он работает на асинхронных и акторных функциях.
use actix_web::{get, post, web, App, HttpResponse, HttpServer, Responder};
#[get("/")]
async fn hello() -> impl Responder {
HttpResponse::Ok().body("Hello World!")
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| {
App::new()
.service(hello)
})
.bind("127.0.0.1:8080")?
.run()
.await
}
Как вы видите Actix-Web очень простой, сначала создаём функцию hello() и ставим ей макрос "get", он обозначает запрос (GET/POST), дальше просто мы прописываем в функции HttpResponse который будет отвечать нам "Hello World!". Дальше у нас идёт асинхронная main() функция, дальше ничего особенного, создаём сервер, запускаем и готово! На адресе http://127.0.0.1:8080/ мы видим надпись "Hello, World!". Сайт Actix-Web: https://actix.rs/.
Другой фреймворк, Rocket, довольно интересный. Rocket тоже удобный и быстрый, но его фишка в том что он расширяемый. Его архитектура позволяет писать к нему дополнения или даже просто внести изменения в сам фреймворк (у себя в проекте). В этом Rocket удобен, например, вы можете написать свою базу данных для Rocket, или добавить в Rocket те вещи, которых не хватает в других фреймворках. Ну и тем более само название фреймворка намекает на то что он быстрый (как ракета). Хотя в моём опыте использования Rocket по скорости он уступает Actix-Web.
#![feature(proc_macro_hygiene, decl_macro)]
#[macro_use] extern crate rocket;
#[get("/")]
fn index() -> &'static str {
"Hello, world!"
}
fn main() {
rocket::ignite().mount("/", routes![index]).launch();
}
Синтаксис немного отличается от Actix-Web, в частности сервер отличается очень сильно, по умолчанию, порт и адрес сервера localhost:8000, но его можно поменять (логично), Кстати хэндлинг функции "index" на сервер, немного отличается, мы указываем ему роутинг главной страницы и в макросе функции, и в хэндлинге функции. Метод launch() запускает наше веб-приложение. Всё, готово! Сайт Rocket: https://rocket.rs/.
На самом деле есть очень много фреймворков/библиотек для создания веб-приложений на Rust. Но самые популярные и лучшие это Actix-Web и Rocket. Вообщем, веб-программирование на Rust удобно, просто, и производительно. Всем приятной разработки на Rust, с вами был lambda.
Комментарии (15)
Gorthauer87
00.00.0000 00:00+2Rocket очень медленный, использует кучу Найтли фичей и его вообще вредно использовать.
ArchieHabr
00.00.0000 00:00Судя по публикациям, вы шарите в Раст. Какой веб-фрейморк посоветуете?
PrinceKorwin
00.00.0000 00:00Можете начать с Actix. Он быстрый, фичастый из коробки и к нему уже много написано сторонних модулей.
Да и свои к нему писать не очень сложно (хоть и многословно).
И да. Про него неплохо знает ChatGPT. Поэтому можете с ним консультироваться :) но нужно следить чтобы deprecated не рекомендовал.
domix32
00.00.0000 00:00warp в последнее время начал подниматься, а так смотрите чо там по звёздочкам на AreWeWebYet. Предложил бы попробовать собрать одно и то же приложение на разных фреймворках, чтобы понять к какому душа лежит.
hrls
00.00.0000 00:00Не используйте фреймворки. Используйте библиотеки. Например warp.
PrinceKorwin
00.00.0000 00:00Переходим по ссылке и читаем:
A super-easy, composable, web server framework for warp speeds.
Всё таки warp это фреймворк. Хоть и очень легковесный и быстрый.
TokarevArt
00.00.0000 00:00+2Я бы посоветовал axum. Он предоставляет тонкую оболочку над низкоуровневом HTTP фреймворком hyper, который в свою очередь базируется на библиотеке модульных компонент для написания веб сервисов tower, получая "бесплатно" кучу компонент, разработанных для данной экосистемы (например библиотека модулей tower-http предоставляет модули для добавления CORS, логирования запросов, ServeDir/ServeFile для сервинга вэб страниц и т.п.). Сам недавно сменил на проекте фреймворк с rocket на axum и результаты более чем удовлетворили. С rocket были проблемы с тем, что шаг влево-вправо и нужно выковыривать из исходников готовые компоненты и переписывать часть их реализации чтобы немного подправить поведение готовых компонент. Также при написании route handler-ов часто приходилось реализовывать rocket-овые trait-ы для доставания параметров запросов, в то время как в axum это делается автоматически, используя обычный serde::Deserialize. Могу разве что отдать должное rocket за прекрасную документацию. Из за этого и выбрал его по началу, но теперь увидел множество проблем, которые в моём случае axum решает.
Fenex
00.00.0000 00:00+1Actix-Web основан на другой библиотеке (Actix, да-да, не Web а просто Actix)
Это неправда, actix-web уже очень давно не использует под капотом actix, он сам по себе. Только для прикручивания websocket'ов к actix-web приходится подключать actix.
Помимо actix-web и Rocket ещё популярен axum (от разработчиков tokio).
mike_with_mic
00.00.0000 00:00+1В 2023 пора бы уже забыть про Rocket и сразу брать Axum — он поддерживается (командой Tokio, благодаря чему хорошо интегрируется с остальной экосистемой; например, позволяет использовать готовые middleware для Tower/Hyper), быстрее, эргономичней.
mad_maximus
00.00.0000 00:00Просто запускаешь .exe файл и целое приложение у тебя в одном файле, чем у PHP у которого половину папок и файлов занимает Docker и Composer.
Кто-нибудь скажет автору о различиях компилируемых языков от интерпретируемых?
t1gor
00.00.0000 00:00+2Мне кажется самое главное упустили из Rust-а в web: компиляцию в WebAssembly.
lesha108
rocket, говорят, уже умер почти, не обновляется