作者简介:成锁元,Westar实验室技术专家。Westar实验室(),成立于 2018 年,关注于区块链及分布式前沿技术,包括区块链分层架构、二层路由,网络性能、智能合约、PoW 优化等。
Rust语言这两年在“安全、并发、性能”方面吸足了眼球,但在主流的web应用领域表现如何?有哪些可以推荐的Web框架?下面就这个话题深入展开。
背景
Web框架
我们先简单回顾下Web框架: Web框架主要用于动态Web开发,开发人员在框架基础上实现自己的业务逻辑。 Web框架需要实现接收到请求后,能够提供参数校验的能力,然后根据请求参数从底层拿到数据,最后以特定格式返回。Web框架旨在简化web开发流程,让开发人员更专注于自己的业务逻辑。
其他语言现状
其他主流语言,Web框架都已经发展非常成熟,大家耳熟能详的比如:
PHP语言: Laravel
JAVA语言:Spring MVC
GO语言: Gin/Beego
这些框架介绍的文章已经满大街了,在此就不赘述。
Rust常见Web框架
Rust目前已知的Web框架也有几十种,在flosse的rust-web-framework-comparison开源项目里面详细列出(见文末参考资料的链接),感兴趣的可以查看。但遗憾的是官方也没有给出支持或者推荐的Web框架,所以我们就实际项目简单使用的情况,挑出几个比较下,希望给大家选型框架时参考下。
Rust Web框架的难点
在比较这些框架之前,我们先回顾下Rust语言处理Web流程困难的地方。众所周知,Rust近年发展迅猛,同时也带来一些新的概念,比如生命周期等,另外rust没有全局状态,或者说实现比较困难,以及编译检查比较严格,相对速度也比较慢,这样对实现web框架带来一些困难,下来我们看下这些框架的实现情况。
Rust Web框架分类
Rust Web框架中,hyper、h2、tiny-http属于底层一些的框架,比如hyper,很多框架都是基于它开发的,它也是Rust语言中比较老牌的框架;Rocket框架相对比较专注, 大名鼎鼎的tokio的作者实现的Tower,目前跟warp交流较多,有可能会合并大家也可以持续关注;iron、gotham、nickel、rouille、actix-web功能相对全面些,就像其中Actix框架整个体系庞大,下面又拆分出许多子框架:web、http、net等。
Rust主流Web框架的比较
下面我们终于进入正题,挑出几个我们实际项目中使用过的框架进行比较。当然,可能有些框架的特性我们并未涉猎,文中有不妥之处欢迎指正。
Hyper
第一个出场的就是hyper,它的特点就是高性能,后面会给出的压测结果,跟actix-web差不多;另外首先实现了Client组件,方便写单元测试验证;前面也提到很多web框架基于hyper实现,侧面说明他底层的封装还是不错的。不过它也有些缺点:
hyper应用侧的功能相对少,所以会导致很多框架又在他的基础上继续封装;
通过match block实现路由,这个笔者认为是一个比较明显的缺点; 比如下面的例子:
async fn response_examples(
req: Request<Body>,client: Client<HttpConnector>
) -> Result<Response<Body>> {
match ((), ().path()) {
(&Method::GET, "/") => {
Ok(Response::new(()))
},
(&Method::GET, "/json_api") => {
api_get_response().await
}
_ => {