2020 Rust Web框架大比拼

2020-12-17 蟲蟲搜奇

Rust是目前最優雅而且熱門的程式語言之一,性能上可以比肩C、編譯時安全、沒有GC的累贅、異步和範型支持,註定這是將來流行的語言。一般認為Rust是一個很好的系統語言,但實際上Rust在各個領域都做的不錯,今天我們就來說說Rust的Web框架。

概述

截至2020年7月,Rust生態系統中的主要Web框架有:actix-web、rocket、tide和warp。那麼問題來了:如果要用Rust構建一個生產環境用的API,應該選擇哪框架呢?

本文我們就來解答這個問題,我們將從幾個方面對上述的各個框架予以說明:包括全面性(功能全面)、社區與採納度、同步和異步(及其選擇的future運行時)、文檔教程和示例以及API和人機工程學。

當然蟲蟲歷來奉行這樣的理念那就是沒有絕對的選擇:不同的環境(和個人好惡)可能會導致選擇不同的架構。

全面性

actix-web,tide和warp都是瘦web框架:他們只提供基本的HTTP Web伺服器,路由邏輯,中間件基礎設施,基本的構建模塊和抽象,從而解析、操作和響應HTTP請求。

rocket框架則與他們相反:它旨在一棧擼,對最常見的需求都可以通過rocket中的組件來提供,隨要隨取,開箱即用。另外它也提供了擴展機制,開發人員可以使用hook擴展用例。

rocket發內置了和ORM集成,可以管理和配置流行資料庫(例如Postgres,Redis,Memcache等)。

與其他語言的Web框架進來對比的話:

actix-web,tide和warp更像是Python語言的Flask或JS中的Express Javascript但是沒有提供現成的配置管理系統或ORM集成。需要有開發者手動自定義構建API,並需要引入所需的功能庫,自己處理圖片樣式等;

rocket則更接近於Python的Django或PHP的Symphony框架:擁有一個穩定而強大的核心,附帶一組高質量組件,可滿足構建堅固的Web應用程式時的日常需求。rocket要在寬度和範圍上與同行匹敵,還有很長的路要走,但這絕對是一個良好的開端。

當然,這是截止目前各框架的情況,各個框架可能也會不斷地調整改善。比如actix-web已經在慢慢積累更多的功能(從安全到會話管理),在GitHub下actix組織的actix-extras倉庫收集了相關的生態體系。

另外需要說明的是,用瘦Web框架開發,也並非就是從零開始要自己動手構建所有內容,畢竟有社區的生態體系,我們需要弄的也是別人需要的,很多已經前人幫我都做好了,我們無需重複造輪子,只需"拿來"用就好了。

社區與採納度

針對四個web框架,我們瀏覽Rust crates庫中的統計數字如下:

構架 總下載量 日下載量

actix-web 1250k 3000

rocket 525k 1000

warp 435k 3000

tide 47k 300

由於各個框架出現的早晚有別,總下載量不能客觀反映框架的流行程度,但是日下載量可以很好地衡量一個框架的目前的流行程度。我們考慮社區規模和流行程度主要考慮以下因素:

具有規模應用的框架,有更多人幫我們趟過它的坑,所以其穩定性也會更好。

規模越,該框架的支持crates的數量也越多;

框架用的人多,其使用教程,問題解決方案和使用經驗也會越多,遇到問題更容易得到解決。

對瘦框架來說,支持crates數量也是框架可實用的關鍵。我搜索框架名稱時查看在crates.io的搜索結果數,可以反應各個框架的社區規模的影響:

構架 搜索結果

rocket 178

actix-web 113

warp 57

tide 20

儘管搜索結果中的這些crates並非都會與搜索的框架相關,他們中也有一些可能是過時或者無法使用的。但是這個結果確實能反應一個框架的了流行程度和實用操作性。比如:

如果需要將Prometheus的指標添加到的API中,則可以使用actix-web-prom或rocket-prometheus在幾分鐘之內手動搞定,兩者都有數千次下載量。如果你選擇warp或tide框架,則這些工作都需要自己開始編寫和集成;

如果要添加分布式跟蹤,則可以使用actix-web-opentelemetry。如果選擇任何其他框架,則需要自己手動實現。

同步與異步

Rust 1.39版本(2019-11-07)中引入了async/await語法,改變了Rust異步編程的體驗。當然Rust生態系統追趕並採用async/await異步還需要一些時間,但是可以公平地說,處理IO受限工作負載的brates現在都是是異步優先的(例如reqwest)。那麼Web框架方面的情況呢?

actix-web和warp在0.2.x中 開始支持async/await,而tide中async/await支持基於其nightly rust編譯器。

rocket,仍然會公開一個同步接口。async/await支持預計將在其0.5發行版中提供,目前尚不支持異步編程。

如果要實現一個對性能嚴格要求的,大流量web應用程式,則最好選擇異步Web框架。

如果不是上面這種情況,那麼儘管缺少異步支持,選擇rocket也應該不是啥問題。

future運行時

Rust的異步編程是建立在其Future trait之上的:Future公開了poll一種必須調用的方法,以允許Future同步更新。可以將Rust的futur視為惰性的:除非進行poll,否則無法保證它們會執行完畢。與其他語言所採用的推模型相比,

異步運行時實際上是項目的依賴項,以brates形式引入,這為我們提供了極大的靈活性:確實可以實現自己的運行時,以針對用例的特定要求進行優化或者僅根據情況選擇最合適的運行時。

從表面上看,聽起來很棒,但現實卻很痛苦:目前,運行時之間的互操作性還很差。混合運行時可能會很痛苦,通常會導致無法分流、檢測或解決的問題不直接。

儘管大多數庫不應直接依賴於運行時,而應依賴futures庫公開的接口,但由於歷史包(例如tokio,長期以來是生態系統中唯一可用的運行時),實際需要(例如,一個框架必須能夠產生任務)或缺乏標準化。

因此,選擇一個異步Web框架超出了框架本身的範圍:正在選擇一個由brates組成的生態系統,這突然使依賴於不同異步運行時的庫變得更加麻煩。

當前的事務狀態還很不理想,但是如果從現在開始要編寫異步Rust,那麼建議在異步運行時進行做慎重的選擇。

目前在Rust中可用的兩個主要通用異步運行時為tokio和async-std。

tokio已經存在了很長一段時間,並且已經廣泛用於生產中。儘管這會導致更大,更複雜的API,但是它是相當可調的。

async-std是一年前發布的,和async/await穩定發布時間差不多。它提供了出色的人性化設計,同時為配置擴展留下了更少的空間。

crates搜索中,兩者的統計數據如下:準:

運行時 下載總量 日下載量

tokio 9600k 30k

async-std 600k 4千

四個web框架的對兩者的選擇如下:

構架 運行時

actix-web tokio

rocket(0.5.x) tokio

tide async-std

warp tokio

文檔,教程和示例

必須深入原始碼以了解某項工作原理是一件很意義的事情,但只應該一種選擇,而不是必須的。在大多數情況下,要依靠記錄良好的框架,包括有關使用模式的簡單示例。

良好的文檔,教程和功能齊全的示例對任務至關重要,特別是團隊中一個或多個成員都不是經驗豐富的Rust開發人員的時候。

Rust的生態體系將文檔為最重要的部分(只需運行cargo doc --open即可自動生成項目文檔),這也是Rust社區本身文化的一部分。庫作者通常會認真對待文檔,Web框架也不例外。在docs.rs上可以找到非常詳盡的內容,並在需要時提供上下文示例。

rocket和actix-web在各自的網站上提供高級文檔指南,所有框架都將大量示例作為其代碼庫的一部分。

項目文檔的教程之外的大多是一些隨時間的積累:actix-web和rocket很容易找到的材料(文章,講座,workshop),而warp和tide的材料則較為有限。在另一面,大量的材料可能會存在過時的情況,這些針對老版本的材料可能會引起誤解,這也是初學者常見的困惑之一。

這就是蟲蟲不建議大家使用搜尋引擎搜索材料,而是儘可能先去學習官方文檔。

總結

2020年今天面對這些Web框架,如何選擇呢?

7月開始,我建議actix-web選擇是否要在Rust中編寫生產API。

首先針對actix-web:

它已廣泛用於生產;依靠tokio作為異步運行時,從而最大程度地減少與異步生態系統中最流行的包的兼容性問題的可能性;擁有大量成熟的插件以及最大的社區。

儘管它的某些API絕對不是最符合人性化,但考慮到所有因素,這帶來的不便肯定很小。

當然如果都按部就班,不願意嘗試,Rust框架就無法百花齊放,繁榮昌盛。其他web框架也優勢明顯

tide並warp使用異步Rust突破了人性化極限;

用rocket可以最大程度上享受其功能方面的優勢,但是它採用了async/await以及用nightly Rust編譯器進行移植。

當然最好的框架是不用框架,是用自己的框架,如果你心有餘,力所及,去創建一個自己的Rust框架也是一個非常好的選擇,如果你有這方面的打算或者已經做了這方面的工作,請at蟲蟲,如果下次介紹Rust框架,我將予以優先介紹。

相關焦點

  • 6 大主流 Web前端框架優缺點對比
    當我們開始寫這個系列博客的時候,我們知道 JavaScript/web 應用框架並不太好總結。我們努力對這個不可回答的問題作出回答:我該用什麼樣的框架?在這篇文章中,我們將對這個系列中所提到的每款框架做一個總結,包括我們所認為的強項和弱項。另外,我們為你留下了一些值得思考的問題。我是否需要使用框架?
  • Rust 1.0發布半年後社區湧現的項目集錦
    Coreutils - 準備全面替換gnu core utils的rust套件Redox實現的是作業系統內核、圖形界面、文件系統等基礎功能,而Coreutils就是實現全套GNU coreutils這套基本工具集了,相當於它是Redox之上的一層,可以配合Redox使用。你一定會覺得這幫人沒事找事,瘋了。重寫是有它的價值的,從根出發,保證安全性,消除漏洞。
  • 盤點十大主流go web框架
    Gin Web FrameworkGin是為速度而生的框架,相比較其它框架,它的速度是最快的,與此同時,它還提供了中間件功能,我們可以輕鬆集成權限驗證,記錄壓縮等功能。Gin框架對於開發api接口非常適合,它提供了豐富的渲染機制,同時也可以作為web後端處理應用。
  • 10大移動Web開發框架
    開發者在創建web程序和Web移動開發時應該不斷的挑戰自我,開發新技術。如今,觸屏時代了終結了滑鼠,大多數可攜式應用改變了傳統的臺式機產品。為了幫助您快速的構建跨平臺的移動應用和網頁,本文收集了一些JavaScript框架。對此,你可以充分利用它。
  • Web應用程式開發的前5位Java框架
    Java於1996年1月23日發布,並在2020年慶祝了它的24周年。根據TIOBE指數,它一直排在第一位。在其24年的歷程中,Java已經證明自己是定製軟體開發的最高通用程式語言,134861個網站,如espn、Snapdeal、Alibaba等,使用Java作為他們的主要語言。
  • Web前端開發必不可少的9個開源框架
    今天就和大家分享9個流行的、強大的前端開源框架,幫助你輕鬆構建漂亮的網站前端。1、BootstrapBootstrap無疑是最流行的CSS框架,它是最早的Web前端框架,由Twitter開發。Bootstrap還提供了許多實例來幫助你入門。
  • Web前端三大主流框架是什麼?
    前端框架對於前端開發的好處是顯而易見的,比如減少代碼中因失誤產生的bug,還能大大節約時間和人力成本,縮短開發周期等等。目前,市面上Web前端三大主流框架分別指的是Angular、React和Vue,在Web前端開發中,它們平分秋色,各有優劣。
  • AWS 聘用 Rust 編譯器聯合創始人,大企為何都愛 Rust?
    此前,Felix Klock是Mozilla的研究工程師,負責Rust編譯器、運行時庫和語言設計工作,因Mozilla的一輪大規模裁員,Felix 於2020年8月離開Mozilla,10月份加入AWS。
  • 面試官:web框架響應用戶請求的原理你都不知道,還搞web開發?
    For Better You本文基於python的web微型框架Flask, 分享基於wsgi規範的伺服器是如何響應用戶請求的(其實django的響應也差不多是這個樣子__call__源碼我們知道python的web框架都是基於WSGI協議做的,所以我們首先看到的就是這個方法的封裝從上述代碼可以看得出,我們實際上要看的是真正的wsgi幹了什麼事情,以下self.wsgi_app
  • 如何在Web應用中實現Velocity 與Struts2框架相互集成的應用實例
    軟體項目實訓及課程設計指導——如何在Web應用系統中實現Velocity 與Struts2框架相互集成的應用實例1、Struts 2應用框架提供對 Velocity 和 FreeMarker 模板引擎的支持在Struts 2應用框架中不僅繼續保留有對Velocity
  • 使用Ruby on Rails進行Web開發的利弊
    RoR框架以其快速、簡便的web應用程式開發和部署而著稱。因此,Ruby程式語言的創建者Matsuki Yukihiro Matsumoto將此工具稱為「 Ruby的殺手級應用」。有了這個框架,您的web產品將免受以下威脅:跨站腳本攻擊SQL注入跨站請求偽造不安全的直接對象引用或強制瀏覽。
  • Rust中的裸指針
    ("z = {}", z); //值為 100// 由引用得到的裸指針,不需要自己管理內存,其指針還是由引用的rust對象管理1.2 由Box轉換的裸指針#[derive(Debug)]struct M { id: String}impl Drop for M {
  • PHP和Python 哪個更適合web開發
    PHP和Python 哪個更適合web開發?口號PHP:全世界最好的語言。Python:人生苦短我用Python。語法PHP:很隨意,很靈活。html的使用既然是web方面就免不了和html打交道。PHP:以非常方便地直接用來編寫 HTML 模版,這一點很奈斯,當然也有第三方的一些模板引擎,比如Smarty。Python:Python需要藉助其他的庫來實現操作HTML。運行方式PHP:使用php-fpm,使用簡單環境也好配置。
  • web前端學習攻略
    web前端學習攻略第一階段:HTML+CSS:HTML進階、CSS進階、div+css布局、HTML+css整站開發、JavaScript基礎:Js基礎教程、js內置對象常用方法、常見DOM樹操作大全、ECMAscript、DOM、BOM、定時器和焦點圖。
  • SSM框架-SpringMVC詳解
    springmvc概述Springmvc是spring框架的一個模塊,spring和springmvc無需中間整合層整合。Springmvc是一個基於mvc的web框架表現層的三大任務:URL到controller的映射http請求參數綁定http響應的生成和輸出MVC設計模式
  • 安卓應用開發頂級框架大盤點,總有一款適合你
    到2020年,許多大型企業都計劃遷移或正在遷移到Kotlin。其中包括Uber、Trello、Pinterest、Twitter、Basecamp、Airbnb和Netflix,他們更喜歡Kotlin作為其開發安卓應用程式的主要語言。自發布以來,Kotlin已經證明了它是一個高度直觀的安卓應用程式開發平臺。
  • kuapingUI 2.0 版本發布,Bootstrap 4+ 大組件 UI 框架
    > kuapingUI 2.0 版本發布,更新了基於bootstrap 4+的組件版本,增加了文本、巨幕、新聞、產品、聯繫、團隊、特徵等數幾十種常用web
  • 北大青鳥整理:一名web前端工程師需要必備哪些技術和工具?
    最近,有小夥伴私信留言讓我總結一下:「一個合格的web前端需要會什麼技術?」我想了半天,合格的web前端當然符合企業的用人要求啊!那麼一名web前端工程師需要必備哪些技術和工具?想要成為一個高薪高職的Web前端工程師並不容易,你不僅需要掌握專業的技能點,還要具備較多的項目經驗。優秀的Web前端工程師需要掌握哪些技術工具嗎?接下來就給大家一一介紹。
  • 都說Rust程式語言難學,那我們Ubuntu系統裡安裝下試試
    近日,程式語言Rust的官方在全球做了一個調查,然後發布了 2020 年 Rust 調查報告。這個又引發大家一陣對Rust的討論。這個曾經很小眾的程式語言,發布以後近些年越來越受開發者和企業的認可。不長時間rust和所依賴的包都會安裝,這樣就完成了。然後我們可以查看下Rust程式語言的版本。終端命令rustc --version執行。機智客這個Ubuntu20.04系統的終端短小精悍反饋就一句話:rustc 1.43.0。Rust程式語言就這樣正確安裝到我們的電腦裡了。