在Web开发方面也是,Rust已经成为构建安全和高性能应用程序的首选语言。随着Rust在Web开发方面的不断流行,各种Web框架也层出不穷,今天我们就介绍一些时下最好用的Rust框架,对比其它们各自的优点和缺点,帮助大家进行了解、学习以及深入抉择实际应用。
Actix Web
Github星:18.4k
仓库:github/actix/actix-web
最新版本:V4.4.0
特点:
All in a Actix Web一栈式搞定;
强大、独立的生态系统;
基于Actor模型;
通过主要版本保证的稳定 API。
非常棒社区和文档。
Actix Web是Rust中历史悠久的Web框架之一,已经积攒了大量人气和好评,备受受欢迎。像任何好的开源项目一样,经历多次迭代,已经有了成熟的主版本(V4.4.0),其API已经可以保证稳定性,在主要版本下,可以确定没有重大更改。
Actix Web基于Actor运行时。Actix Web中唯一需要Actor的部分是WebSockets,但是由于无法很好地与现代异步Rust世界配合使用,因此正在努力完全删除其使用。更广泛的Actix项目和GitHub组织提供了许多用于构建并发应用程序的库,从较低级别的TCP服务器构建器到HTTP/Web层,再到静态文件提供者和session管理器板条箱。
乍一看,Actix Web看起来对Rust中的其他Web框架非常熟悉。可以使用宏来定义HTTP方法和路由(如 Rocket),并使用提取程序从请求中获取数据(如 Axum)。与Axum的相似之处是惊人的,它们如何命名概念和特征。最大的区别是Actix Web与Tokio生态系统的联系并不紧密。
虽然Tokio仍然是Actix Web下面的运行时,但该框架具有自己的抽象和特征,以及自己的板条箱生态系统。这有利有弊。一方面,可以确定事情通常可以很好地协同工作,另一方面,可能会错过Tokio生态系统中已经存在的许多东西。
Actix Web实现了自己的服务特征,这与Tower的基本相同,但仍然不兼容。这意味着塔式生态系统中大多数可用的中间件都不适用于Actix。
同样有趣的是,如果你需要在Actix Web中完成一些需要自己实现的特殊任务,你可能会遇到在框架中运行所有内容的Actor模型。这可能会增加一些可能不想处理的复杂性层。
但是围绕Actix Web的社区提供了支持 HTTP/2和Websocket升级,它有用于Web 框架中最常见任务的板条箱和指南,优秀(我的意思是优秀)文档,而且速度很快。Actix Web流行是有原因的,如果需要保留版本保证,它可能是现在的最佳选择。
Axum
Github星:12k
仓库:github/tokio-rs/axum/
最新版本:0.7.7
特点:
无宏的 API。
结合了Tokio,Tower和Hyper的强大生态系统。
出色的开发人员体验。
仍然在0.x中,因此可能会发生重大更改。
Axum是一个在Rust生态系统中具有特殊地位的Web框架。它是Toki项目的一部分。Axum使用异步网络应用程序的运行时,使用Tokio作为其异步运行时,而且还与Tokio生态系统中的其他库集成,使用Hyper作为其HTTP服务器和Tower作为中间件。使用Axum进行Web开发,开发人员能够重用来自Tokio生态系统的现有库和工具。
Axum还致力于在不依赖宏的情况下提供一流的开发人员体验,利用Rust的类型系统来提供安全且符合人体工程学的API。这是通过使用特征来定义框架的核心抽象来实现的,例如用于定义应用程序核心逻辑的Handler特性(trait)。该方法允许开发人员轻松地从较小的组件编写应用程序,这些组件可以在多个应用程序中重用。
Axum中的处理程序是接受请求并返回响应的函数。这类似于其他后端框架,但利用Axum的FromRequest特性,开发人员可以指定应从请求中提取的数据类型。返回类型需要实现IntoResponse特性,并且已经有许多类型可以实现此特性(trait),包括允许轻松更改的元组类型,例如响应的状态代码。
熟悉Rust的类型系统的同学应该了解泛型,尤其是traits中的异步方法(或者更具体地说:返回Future类型),当不满足trait绑定时,Rust的错误消息会变得非常复杂杂乱。尤其是需要匹配抽象特征边界时,它经常发生。Axum提供了一个带有帮助程序宏的库,这些宏将错误放在实际发生的位置,从而更容易理解出了什么问题。
Axum 做了很多正确的事情,并且很容易启动做很多事情的应用程序。但是,需要注意一些事项。Axum还没有达到业界标杆成熟的1.0版本,所以随时可能会出现API的情况,所以如果大规模应用还待时日。尽管如此,Axum也是目前最受欢迎的框架。
Rocket
Github星:21.4k
仓库:github/SergioBenitez/Rocket
最新版本:V0.4.11
特点:
包含电池的方法。
出色的开发人员体验。
不像以前那样积极发展。
对于初学者来说仍然是一个不错的选择。
鲜为人知但仍然令人兴奋的Rust框架
Rocket曾在相当长的一段时间内一直是Rust Web框架生态系统中的明星,它对忽略开发人员体验,对熟悉和现有概念的依赖,以及提供包含电池的体验的雄心勃勃的目标。
Rocket基于宏的路由,内置表单处理,支持数据库和状态管理,以及自己的模板版本,Rocket试图完成构建Web应用程序所需的一切。
然而,Rocket为巨大野心付出了代价。虽然仍在积极开发中,但发布并不像当初那样频繁了。
此外,通过其包含电池的方法,还需要了解Rocket如何做事。Rocket应用程序具有生命周期,构建块以特定方式连接,如果出现问题,用户需要了解出了什么问题。
Rocket是一个很好的框架,如果你想开始Rust Web开发,它是一个不错的选择。对于许多Rust Web码农来说,Rocket是Rust Web的第一个尝试框架,用它开发它仍然很有趣。但是一般不建议在生产中使用该框架。
Warp
Github星:8.4k
仓库:github/seanmonstar/warp
最新版本:V0.3.5
特点:
功能性方法。
很有表现力。
更接近近Tokio,Tower和超级的强大生态系统。
不是最适合初学者的框架。
Warp是一个建立在Tokio之上的Web框架,它是一个非常好的框架。它也与我们迄今为止看到的其他框架非常不同。
Warp与Axum有一些共同的特征:它建立在Tokio和Hyper之上,并使用Tower中间件。但是,它的方法非常不同。Warp建立在Filter特性之上。
在Warp中,可以构建应用于传入请求的过滤器管道,请求通过管道传递,直到到达末尾。筛选器可以链接,也可以组合。这样可以构建仍然易于理解的非常复杂的管道。
Warp也比Axum更接近Tokio生态系统,这意味着可能会处理更多的Tokio结构和概念,而没有任何胶水特征。
Warp采用非常实用的方法,如果这是你的编程风格,你会喜欢Warp的表现力和可组合性。当看一段 Warp代码时,它通常读起来就像一个正在发生的事情的故事,这在Rust中工作是有趣和惊人的。
不过,可能希望在Rust分析器设置中关闭镶嵌提示。随着所有这些不同的函数和过滤器被链接起来,Warp中的类型变得非常长和非常复杂,也很难破。错误消息也是如此,这可能是难以理解的文本页面。
此外,虽然过滤器概念一旦理解了就会很方便,但想要拥有声明式路由器、处理程序和提取器风格,就像得到的所有其他框架一样。
War是一个很好的框架,大家都喜欢它。但是,它不是最适合初学者的框架,也不是最受欢迎的框架。这意味着可能更难找到帮助和资源。但是对于快速和小应用程序来说,它很有趣,而且它的实验风格可能会给你新的想法。
Tide
Github星:4.7k
仓库:github/http-rs/tide
最新版本:V0.17.0-bata.1
特点:
简约的方法。
使用async-std运行时。
简单的处理程序函数。
Rust异步功能的游乐场。
Tide是一个非常简约的Web框架,它建立在async-std运行时之上。简约的方法意味着可以获得非常小的API层。Tide中的处理程序函数是“async fn”接受一个“Request”并返回一个“tide::Result”。提取数据或发送正确的响应格式取决于用户。
虽然这对码农来说可以说是更多的工作,但它也更直接,码农可以完全控制正在发生的所有事情。在某些情况下,能够如此接近HTTP请求和响应是一种乐趣,并使事情变得更容易。
它的中间件方法类似于从Tower,但Tide暴露了异步性状板条箱使实施变得更加容易。由于Tide是由参与Rust异步生态系统的开发者实现的,Rust异步的改进会给该框架带来巨大益处。
Poem
Github星:2.8k
仓库:github/poem-web/poem
最新版本:V2.0.0
特点:
庞大的功能集。
与Tokio生态系统兼容。
易于使用。
适用于gRPC和Lambda。
程序就像一首诗,该框架名字也像诗一样!不对,它名字就是诗。Poem自称是一个功能齐全但易于使用的Web框架。大胆的主张,但诗似乎兑现了。乍一看,它的用法与Axum非常相似,唯一的区别是需要使用相应的宏标记处理程序函数。Poem建立在Tokio和Hyper的基础上,并且Towe中间件完全兼容,同时仍然暴露了自己的中间件特征。
Poem的中间件特性也很容易使用。可以直接为所有或特定的Endpoints(Poem表达可以处理HTTP请求的所有内容的方式)实现特征,或者只编写一个接受Endpoint为参数的异步函数。
Poem不仅与更广泛的生态系统中的许多功能兼容,而且本身也充满了功能,包括对OpenAPI和Swagger文档的完全支持。它不仅限于基于HTTP的Web服务,它还可用于基于Tonic的gRPC服务,甚至用于Lambda函数,而无需切换框架。添加对OpenTelemetry,Redis,Prometheus等的支持,可以选中企业级应用程序的现代Web框架的所有框。
值得注意的是Poem仍然是0.x 版本,但如果它保持势头并提供稳定完整的1.0后,这是一个值得关注的框架!
Pavex
Github星:919
仓库:LukeMathWalker/pavex
最新版本:~
特点:
庞大的功能集。
与Tokio生态系统兼容。
易于使用。
适用于gRPC和Lambda。
上面的所的述的Rust Web框架乍一看都非常相似。他们只是在细微差别上有所不同,部分功能上相比较其他框架人做得更好。
Pavex有很大的不同,因为它将自己视为构建Rust API的专用编译器。它对应用程序应执行的操作进行高级描述,编译器会生成一个独立的API服务器SDK板条箱,随时可以配置和启动。
Pavex仍处于孵化雏形阶段,但这绝对是一个值得关注和期待的项目。