LINUX.ORG.RU

Rust для Web-разработки

 , ,


2

8

Существуют ли уже в экосистеме Rust’а такие аналоги Web-фреймворков, как, например:

  • Spring Boot (Java, Kotlin, Groovy)
  • Grails (Groovy)
  • Django (Python)
  • Ruby on Rails (Ruby)
  • Play Framework (Scala)
  • и т. д.

То бишь All-in-One решения, в составе которых помимо проброса контроллеров имеется ORM к какой-нибудь там PostgreSQL базе данных, шаблонизатор HTML/CSS/JavaScript по типу того же Thymeleaf из Spring или Apache FreeMarker, ну и встраиваемый Web server по типу Tomcat/Netty/Jetty опционально.

В идеале будет круто если на выходе сайт (или хотя бы его логика) будет завёрнута в компактный бинарь, который будет deamon’изирован тем же systemd а сверху будет Nginx с proxy_pass. Тот же Spring Boot удобно вкомпиливает всё в единый JAR-файл, который можно деплоить просто на машину с установленной JRE и базой данных.

Собственно, хочется попробовать чего-то нового из мира Rust. А то у всех вышеперечисленных решений есть типичные фатальные недостатки, например:

  • Python/Django – убогая динамическая типизация со всеми её проблемами в виде кривого автодополнения абсолютно в любых IDE, ситуацию угрёбищный type-hinting, который даже не часть языка, а так просто нашлёпка сбоку, практически не спасает, ещё дрист километровыми traceback’ами на каждый чих.
  • Java/Spring Boot – с типизацией всё ок, но NPE-проблемы, несколько отстающая от современных трендов стандартная библиотека, для которой нужно создавать Util-классы. Далее у Spring’а слишком много магии в чёрной коробке, ехала аннотация через аннотацию, тяжесть JVM-стека, да и сам Spring тяжёлый.
  • Kotlin/Spring Boot – с типизацией всё ок, типы помогают избегать NPE в Kotlin-коде, но так как большинство библиотек это чистая Java, приходится всё рутинно обёртывать, стандартная библиотека вполне актуальная и удобная. Далее со Spring’ом не слишком хорошая интеграция, нужно там всё подпирать какими-то костылями-плагинами вроде all-open, тестирование тоже усложнено из-за совершенно других средств моккирования, несовместимых со Spring’овскими. Далее к проблемам JVM-стека и тяжести Spring’а добавляется ещё кучка зависимостей самого Kotlin’а и его плагинов интеграции.
  • Groovy/Grails – динамическая типизация, тяжесть Spring Boot и платформы JVM. Слишком декларативненько для логики. Возможно это просто с непривычки так ощущается.
  • Scala/Play Framework – Не слишком нравится синтаксис Scala, и Play Framework со сборщиком sbt мне показался тяжелее Spring Boot’овской связки с Gradle/Maven. Понятно, что можно выкинуть sbt и т. д., но как-то хочется посмотреть в сторону от JVM-языков.
  • Ruby/RoR – тормоза, динамическая типизация, синтаксис на любителя (я приверженец C-like языков), ещё не понравился жирный начальный проект, который генерируется там через сборщик. Он изначально обмазан кучей JavaScript-библиотек вроде свистопердящей полоски прогресс-бара сверху страницы и т. д.

Ну не PHP же, прости-господи, брать для Web-разработки в 2020 году, верно?! Есть ещё вариант с Go/<чем-то>, но количество батареек у Rust’а, на мой взгляд, побольше.

В общем, посоветуйте популярные Web-фреймворки на Rust, с которыми можно поиграться для своих pet-проектов.

★★★★★

Ответ на: комментарий от Kazun3500

В этом виноват язык или разработчик?

Это глупый вопрос. Потому что для разработчика важно только, виноват он (тогда можно всё исправить) или не он (тогда нельзя, или как минимум гораздо сложнее).

Соответственно, если язык устроен так, что ДРУГОМУ разработчику проще налажать, значит, виноват язык.

Miguel ★★★★★
()
Ответ на: комментарий от Kazun3500

Возможно. Вопрос не в качестве, а в количестве.

Miguel ★★★★★
()
Ответ на: комментарий от dimuska139

В FastAPI можно юзать обычные синхронные обработчики запросов, они автоматически выполняются в пуле потоков. Либо вручную использовать run_in_threadpool() для работы с БД. Для типичного REST API асинхронщина всё равно ничего не даёт.

Либо можно юзать SQLAlchemy Core через https://github.com/encode/databases, лично мне ORM всё меньше нравится.

Pacmu3ka
()
Ответ на: комментарий от Pacmu3ka

Для типичного REST API асинхронщина всё равно ничего не даёт.

У меня сейчас в проекте есть эндпоинты, где из базы нужно достать сущность, а потом для нее (если она существует) из базы достать данные из нескольких таблиц (ну, например, статья + рекомендации). Одним запросом там никак не обойтись, делить эндпоинты тоже по смыслу не имеет. Если б проект был на питоне или ноде, я бы асинхронно эти данные из нескольких таблиц достал разом, а так приходится выполнять запросы последовательно, потому что пхп. И такой эндпоинт в проекте далеко не один. Так что не сказал бы, что асинхронщина ничего не дает.

юзать обычные синхронные обработчики запросов, они автоматически выполняются в пуле потоков.

Я знаю, но тогда ж смысл использования FastAPI пропадает практически полностью.

лично мне ORM всё меньше нравится

Ну, как минимум, квери билдер (с возможностью raw-query) + маппер нужны. Все руками делать - тоже такое себе.

dimuska139 ★★
()
Ответ на: комментарий от Kazun3500

виноват язык или разработчик?

Можно было сделать и без исключений нормально. См. сабжевый раст. Так что да, виноват язык с дешманским возвратом двух значений.

bread
()
Ответ на: комментарий от Pacmu3ka

пользуясь случаем, спрошу. а как заставить нормально работать mypy и fastapi

cat main1.py

 
from fastapi import FastAPI
import typing

app = FastAPI()

@app.get("/")
def read_root() -> typing.Dict[str,str]:
    return {"Hello": "World"}
pipenv run mypy --strict main1.py 
Loading .env environment variables...
main1.py:1: error: Module 'fastapi' has no attribute 'FastAPI'
main1.py:7: error: Untyped decorator makes function "read_root" untyped
Found 2 errors in 1 file (checked 1 source file)

Как исправить ошибки.

swelf
()
Ответ на: комментарий от Kazun3500

В Rust тип Result имеет атрибут #[must_use], так что о случаях игнорирования компилятор предупредит:

fn foo() -> Result<(), i32> {
    Ok(())
}

fn main() {
    foo();
}
warning: unused `std::result::Result` that must be used
 --> src/main.rs:6:5
  |
6 |     foo();
  |     ^^^^^^
  |
  = note: `#[warn(unused_must_use)]` on by default
  = note: this `Result` may be an `Err` variant, which should be handled

запустить

freecoder
()
Последнее исправление: freecoder (всего исправлений: 1)
Ответ на: комментарий от dem

знакомый 1Сник парсил XML путем поиска в строке < потом через сколько то символов искал кавычку и читал атрибут.

На заре своей карьеры я тоже так делал правда то был запутанный html код сайта mail.ru и не php а python. Не вижу в этом особой трагедии. Иногда других способов не остается. Все работало кстати пока на мэйлрушечке не закрыли дырку.

Конечно это не для xml.

XoFfiCEr ★★☆☆
()
Последнее исправление: XoFfiCEr (всего исправлений: 1)

Я использую actix-web, diesel с r2d2 и yew (для wasm-клиента).

Проблем с ними нет, но для плохо знакомых с Rust такой стек вряд ли подойдет, потому что учебных материалов нет и многие имеющиеся примеры использования уже устарели, отстали от последних изменений в библиотеках. Так что готовьтесь смотреть исходники, читать API-доки и экспериментировать.

freecoder
()
Последнее исправление: freecoder (всего исправлений: 1)
Ответ на: комментарий от Kazun3500

В spring boot ловится исключение, откуда можно достать какие поля не удалось сбиндить.

ma1uta ★★★
()
Ответ на: комментарий от freecoder

yew (для wasm-клиента)

Он делает что-то особенное, где нужна высокая производительность. Или просто как замена всяких vue/react?

swelf
()
Ответ на: комментарий от ma1uta

Ну вот) А самый популярный гошный микрофреймворк gin/gonic так не умеет.

dimuska139 ★★
()
Ответ на: комментарий от swelf

Использую как замену React. Просто чтобы поменьше иметь дела с JavaScript и чтобы можно было использовать на клиенте те же библиотеки, что и на сервере.

freecoder
()

На Rust юзал warp, но после экосистемы Kotlin + Spring Boot довольно долго и мучительно всё это шло, хотя юзал в совсем небольшом проекте. С виду ко многим crate’ам есть документация, но в большинстве случаев всё очень туго с примерами. Rust-плагин для IDEA пока очень далёк от совершенства, в сравнении с тем же Kotlin Plugin.

Думаю для средних и больших CRUD реализация на RUST будет очень долгой и мучительной. Конечная задача требует таких страданий?

Если не CRUD, то есть как минимум эксплуатационная проблема. Написал как-то утиль, так вот она не завелась на Windows Server 2008 R2, нужно было очень много либ поставить. В итоге утилитка на 900КБ, потребовала тащить с собой еще 150МБ добра от Microsoft.

p.s: очень люблю Rust

dooodie
()
17 августа 2021 г.

Сам ищу и много перепробовал. Из web-фрейморков раста rocket из-за ночной версии сразу отмел. Сырой. Actix - интересный, со своим сайтом и идеей пришедшей из функциональных языков. Пробовал Yew и сейчас остановился на Seed. Seed, по моему, выводит на новые рельсы. B yew и seed вдохновлены elm. Поинтересуйтесь про elm - вещь (надежнейшая вещь). Что касается кода на клиенте, то yew и seed влазят в клиента через компиляцию в wasm. Разработка продолжает идти на rust. Денис Колодин (автор yew) пишет: «Я разработал этот фреймворк…» когда «…писал на Elm некое криптовалютное приложение и столкнулся с тем, что из-за ограничений языка не могу создать рекурсивную структуру. И в этот момент подумал: в Rust моя проблема решилась бы очень легко… решил…попробовать». По сравнению с seed yew более монолитный и это мне кажется минусом. А по замыслу они схожи. Я начал c yew и перешел потом на seed. Да, о поддержке - в discord группы по каждому из этих фреймворков активные. Help -приходит 100%. Даже бывает за 15мин, а бывает и подождать нужно. Но такого чтоб не ответили - не было. Отвечают разработчики. В общем можно двигаться. Удачи(!)

konik
()

И еще к примеру эти ребята (https://evrone.ru/rust) ведут коммерческую разработку на раст на yew

konik
()

Ну не PHP же, прости-господи, брать для Web-разработки в 2020 году, верно

Год уже 21, а всё ещё РНР. Заодно и работа с типами теперь неплохая.

В общем, посоветуйте популярные Web-фреймворки на Rust, с которыми можно поиграться для своих pet-проектов.

Знаю только актикс.

Собственно, хочется попробовать чего-то нового из мира Rust. А то у всех вышеперечисленных решений есть типичные фатальные недостатки, например:

Я изредка посматриваю на асп.нет кор.

fernandos ★★★
()
Ответ на: комментарий от konik

Спасибо за советы, буду смотреть и пробовать!

EXL ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.