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-проектов.

★★★★★

Scala/Play Framework – Не слишком нравится синтаксис Scala, и Play Framework со сборщиком sbt мне показался тяжелее Spring Boot’овской связки с Gradle/Maven. Понятно, что можно выкинуть sbt и т. д., но как-то хочется посмотреть в сторону от JVM-языков.

Не соглашусь по поводу синтаксиса Scala и тяжести SBT, но пусть на любителя. Но я бы добавил, что NPE там тоже фундаментально не решены, пусть и поощряется написание кода с использованием Option, но никто не мешает подсовывать Some(null).

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

Т.н. «All-in-One решения» в целом противоречат философии раста, которая близка к го в этом плане. На го есть такое плюс-минус, но никогда не использовал

nikolnik ★★★
()

Может тебе еще и генерацию жабоскрипта из раста на блюдечке поднести? Ну типа как в ваадине или в котлинжиэс.

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

А орм там есть? Иначе нельзя круд аппликухи пилить

anonymous
()

Rust для веб разработки слишком замороченный

Язык D гораздо лучше, удобный синтаксис, классы, быстрая компиляция

ism ★★★
()

убогая

отстающая от современных трендов

Не слишком нравится синтаксис

синтаксис на любителя

мне показался

ещё не понравился жирный

на мой взгляд

Недостаточно хиспстерски, недостаточно няшный синтаксис, недостаточно модно, одноклассники не поймут, «показалось», «не понравилось», «померещилось» и т.д. Ни замеров, ничего, типичный форумный философ-гуманитарий ищет себе идеальную «невесту».

Вангую, что ты потратишь больше времени на поиск «идеального» фреймворка, чем, собственно, на его использование – напишешь свой хелловорлд и успокоишься, таким форумным теоретикам, как ты, больше и не нужно, зато, это будет самый «модный» и «безопасный» ПриветМир в мире.

anonymous
()

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

А чем он плох-то, кроме того, что нет асинхронщины? 7-ка не так уж и плоха.

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

Именно PHP и брать.

У меня с php-fpm и php.ini не складывается дружба-магия-жвачка. Так что в его сторону типа Laravel/PHP даже лень смотреть.

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

Хочу статическую типизацию из коробки, а не очередную type hinting нашлёпку.

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

в пхп нет асинхронщины

Смотря с какой стороны посмотреть. Вот те «воркеры» в пхп-фпм очень даже асинхронны (при условии что обслуживают разных клиентов (уникальность по сессии)).

deep-purple ★★★★★
()
Ответ на: комментарий от BattleCoder

Не соглашусь по поводу синтаксиса Scala и тяжести SBT, но пусть на любителя. Но я бы добавил, что NPE там тоже фундаментально не решены, пусть и поощряется написание кода с использованием Option, но никто не мешает подсовывать Some(null).

Синтаксис это больше вкусовщина и просто мои заморочки через которые можно переступить. Я Play Framework и Scala тыкал довольно давно, что там с асинхронностью прослойки для БД? У того же Spring есть Reactor и недавно появился Spring Data R2DBC вместо Spring Data JPA. К sbt я могу прилепить какую-нибудь библиотеку на Kotlin и вообще сам Play Framework умеет в него?

EXL ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

На одном эндпоинте несколько sql-запросов параллельно (которые по смыслу не зависят от результатов друг друга) не сделать, увы. А вот питон и нода могут.

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

В сторону NestJS смотрел? Это тайпскрипт, то есть типизация у тебя будет. Typeorm туда прикручивается вообще без проблем.

dimuska139 ★★
()

Серьезно, вот прям Spring со всей хурмой на расте? Может к 2050 сделают.

bread
()

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

В 2020 в web-разработка делится на три части:

  1. PHP
  2. Java
  3. Ненужно

Выбор простой как палка. Если первые два пункта тебя не устраивают, то в принципе всем похрен что из ненужного ты выберешь.

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

Увы это даже близко не спринг и раст далеко не джава. Но ОПу сойдет, он же все равно с таким подходом действительно дальше петстора не пойдет, на этапе петстора он найдет 1000 и 1 причину хейтить и актикс с растом.

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

Не забыл. Нода занимает почетное первое место в третьем пункте :-)

qtm ★★★
()

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

rust по батарейкам сосёт со свистом.

Dark_SavanT ★★★★★
()

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

Верно. Никто в здравом уме - php уже не использует. Только для легаси.

Я на Rust веб особо не тыкал. Но, например - actix.rs

Кстати, Go - тоже будет хороший вариант. Но там не принято иметь что-то уровня Django/RoR, там модно самому библиотечки собирать.

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

Hello World у этого Rocket не собрался:

error[E0554]: `#![feature]` may not be used on the stable release channel
 --> /Users/exl/.cargo/registry/src/github.com-1ecc6299db9ec823/devise_core-0.2.0/src/lib.rs:1:1
  |
1 | #![feature(proc_macro_diagnostic, proc_macro_span)]
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0554]: `#![feature]` may not be used on the stable release channel
 --> /Users/exl/.cargo/registry/src/github.com-1ecc6299db9ec823/devise_core-0.2.0/src/lib.rs:2:1
  |
2 | #![feature(crate_visibility_modifier)]
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

error[E0554]: `#![feature]` may not be used on the stable release channel
 --> /Users/exl/.cargo/registry/src/github.com-1ecc6299db9ec823/devise_core-0.2.0/src/lib.rs:3:1
  |
3 | #![feature(concat_idents)]
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^

error: aborting due to 3 previous errors

For more information about this error, try `rustc --explain E0554`.
error: could not compile `devise_core`.

To learn more, run the command again with --verbose.
warning: build failed, waiting for other jobs to finish...
error: build failed

$ rustc --version
rustc 1.43.1

$ rustc --explain E0554
Feature attributes are only allowed on the nightly release channel. Stable or
beta compilers will not comply.

Example of erroneous code (on a stable compiler):

#![feature(non_ascii_idents)] // error: `#![feature]` may not be used on the
                              //        stable release channel

If you need the feature, make sure to use a nightly release of the compiler
(but be warned that the feature may be removed or altered in the future).

Зачем релизной версии Web-фреймворка ночная сборка компилятора O_o?

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

В сторону NestJS смотрел?

Нет, не смотрел. Спасибо за наводку. Но пока хочу разобраться и попробовать что-нибудь компилируемое, типа Rust, Swift или Go.

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

Потому, что автору так захотелось.

Со следующим релизом Rust как раз пофисят.

RazrFalcon ★★★★★
()
Ответ на: комментарий от deep-purple

2 запроса к БД по 100 мс синхронно будут 200 мс, а асинхронно - 100 мс. Понятно, что кеш, но кеш возможен не везде и не всегда.

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

Я вообще не фанат так называемых «фреймворков», я больше про легковесные библиотеки.

Насчёт прослойки БД рекомендую doobie посмотреть (не уверен, что play framework хорошо сочетается с этим, но в целом что угодно присобачить можно 🤷‍♂️).

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

Ещё как сделать… вот только работать это может хуже последовательных… или одного нормально оптимизированного.

Эх, чего только не встретишь порой в дебрях старого production code…

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

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

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

У тебя все API делают ровно 1 запрос к базе? И при чем тут транзакции? Есть у тебя эндпоинт, который возвращает сложный объект, для формирования которого нужно несколько раз сходить в базу в разные таблицы (иногда и в разные базы). Каждый запрос не зависит от ответа предыдущего. В случае синхронщины ты будешь последовательно выполнять запросы, в случае асинхронщины - одновременно. Не знаю насчет проблемы, высосанной из пальца, но я с подобными моментами сталкиваюсь регулярно.

dimuska139 ★★
()
Ответ на: комментарий от theLastOfCats
[EXLs-MBP:Desktop exl]$ git clone https://github.com/SergioBenitez/Rocket --depth=1 -b v0.4.4
EXL ★★★★★
() автор топика
Ответ на: комментарий от theLastOfCats

Советую посмотреть на Elixir/Phoenix

Там же динамическая типизация и рубишный синтаксис, что ТС не переваривает.

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

Спасибо, ковыряю примеры, вроде все собираются, запускаются и тыкаются, примеры работы с PostgreSQL, всякие там миграции и HTML-шаблонизаторы тоже нашел здесь https://github.com/actix/examples

Нравится Rust’овая экосистема и Cargo. В отличие от того же Gradle/Maven работает шустро и не качает сотни мегабайт на каждый чих. Хотя казалось бы тут исходные тексты + сборка, а не уже собранные бинарники как в Java-экосистеме. Надеюсь со временем в Rust появятся проекты уровня Spring Boot.

Собственно, хочу задать несколько вопросов.

  1. Насколько этот проект зрел? Это в данный момент времени самый популярный Web-фреймворк на Rust? Я вроде слышал недавно с главным разработчиком actix был какой-то скандал и хлопанье дверями. Насколько это отразилось на экосистеме этого фреймворка?

  2. Какой HTML-шаблонизатор лучше всего использовать для генерации простеньких страничек с большим количеством текста?

  3. Как обычно осуществляется deploy собранного приложения если отказаться от всяких там Docker’ов? Собирается релизная сборка бинарника через Cargo, затем он демонизируется средствами менеджера служб, на него проксируется какой-нибудь Nginx? Есть ли какие-нибудь подводные камни?

EXL ★★★★★
() автор топика
Ответ на: комментарий от theLastOfCats

Ну это не надолго, какой-то чел делает статическую типизацию поверх BEAM VM.

Но это же всё равно ждать пока какой-то чел что-то доделает, а потом какой-то чел должен захотеть и портировать Финикс для этого.

А ТС нужна серебрянная пуля здесь и сейчас. У него всё серьёзно. Не шутки.

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

ASP.NET Core? ;)

Религия мешает.

EXL ★★★★★
() автор топика
Ответ на: комментарий от theLastOfCats

Это на Elixir мигрируют программисты с Ruby? Или то Crystal, а на Elixir мигрируют с Erlang’а?

В любом случае, спасибо за совет. Может быть когда-нибудь я попробую этот фреймворк, с ErlangVM всегда хотел поковыряться, но удобного случая не предоставлялось.

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

Насколько этот проект зрел?

Ему пару лет всего. Так что…

Это в данный момент времени самый популярный Web-фреймворк на Rust?

Да. Есть пара альтернатив, но они слишком сырые.

Насколько это отразилось на экосистеме этого фреймворка?

Пока что никак.

Какой HTML-шаблонизатор лучше всего использовать

Не интересовался. Но они все должны быть очень быстрыми.

Как обычно осуществляется deploy собранного приложения если отказаться от всяких там Docker’ов?

Я просто собираю релиз и запускаю через systemd. Если хочется совсем всё выжать, то можно включить lto и собирать с -Ctarget-cpu=native прямо на месте.

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

Спасибо за ссылку.

Из этого списка заценил еще Gotham. Последние два Web-фреймворка выглядят уж слишком простенько.

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

С Ruby много, да, создатель языка раньше контрибьютил в Рельсы и многие популярные рубишные либы. А потом он понял, что писать в XXI веке на языке с GIL/GVL — не комильфо, и запилил свой ЯП с блэкдже конкурентностью и макросами на основе BEAM, получив бесплатно все батарейки Erlang за счёт стопроцентного прозрачного интеропа с оным.

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