前两天围观国内Rust的视频会议,有人说Rust不适合做Web开发,真的是这样吗? 肯定不是,一门注重安全的语言应该最适合用于Web应用程序的开发。因为Web要的就是稳定,服务器能7x24长期运行不宕机,对开发语言是个挑战。Rust已经被业界证明目前是最安全的语言,编译器能帮我们在发布前将大部分的Bug找出来,做出的产品应该是最稳定的。Rust做Web开发的难点在于选择什么组件。
做Web开发,Java有Spring, Go有Gin, Nodejs有Koa, Rust应该用什么组件呢?
目前最热的是Rocket与Actix-Web, 这两个我都不看好。Rocket发行版基于老的hyper 0.10,不支持Async/await,异步版本正在开发中, 不推荐。 Actix-Web为了性能引入了许多unsafe代码,带来许多Undefined Behavior, 稳定性堪忧,实际测试中发现https并发只能做到2000,上2500就崩了。国人写的Roa借用了Koa的概念,基于异步的Hyper0.13,完全Aysnc/await,测试中发现Async-std用的很重,而其底层hyper 0.13是基于Tokio 0.2的,两种异步运行时混用,稳定性还需要用时间来检验,作者也提供了Tokio运行时的案例,编译未通过。
最后,本文的主角出场,她就是Warp, 基于Filter路由的Web组件。Warp用例在ApacheBench压力测试中性能完全不输Actix-web, 而且在https 万次并发中没有发现任何问题。应该是目前Rust生态中web开发最稳定最高效的组件。推荐warp的原因还在于warp的作者Sean McArthur,就是hyper的作者,hyper是目前很多web组件的底层。此外,用于web客户端调用的reqwest与用于构架微服务/RPC的tower也出自Sean McArthur。该大牛的个人主页地址https://seanmonstar.com/
评论区
写评论async_std确实在api设计上优秀很多,例如它可以取得协程id task_id。但是tokio不行。还有就是async_std还是年轻,目前大部分框架还是基于tokio,例如某些Grpc框架 找不到async_std支持的
--
👇
c5soft: async-std是一个新兴的异步运行时(Runtime),其设计上有很多地方优于老牌的tokio,用async-std写东西应该到了时机成熟的时候了。 warp底层使用的是tokio异步运行时, 如果打算用warp来搭建web应用,应使用tokio。 学习warp需要多看文档与源代码,多写代码,一边干一边学。咱们都是菜鸟,多交流。
回复【jelipo 2020-06-19 14:22】
warp的Filter就充当了中间件的作用。用户认证需要会话(session)或者叫状态(state)来支持, 可以通过warp读写cookie结合后端数据库来实现。
回复【songday 2020-06-19 11:47】
web开发怎么少的了非常成熟的类似Mybatis的ORM框架 推荐 https://github.com/rbatis/rbatis
我参考了官方示例,写了一个
Filter
不过我的
Filter
需要用到数据库,这个数据库实例会move
到闭包里,我这个闭包就只实现了FnOnce
但是
Warp
需要的是Fn
不知道你涉及到这种场景了吗?
看了下Warp,准备从Tide转到Warp了
不过看了你给的文章:
Create an async CRUD web service in Rust with warp
它里面的
db pool
,是放在Filter
里的,传递给handler
都是clone
,这样会不会有性能损耗?用
Arc
会不会比较好?两分钟阅读
It’s worth pointing out that Rust’s Warp shouldn’t be confused with Haskell’s Warp
What’s the thinking behind Rust’s Warp framework?
What are filters in the Warp web framework?
推荐Warp相关几篇文章:
How to use Rust Warp
Creating a REST API in Rust with warp
Create an async CRUD web service in Rust with warp
How do I inject dependencies into my route handlers in Warp?
如何使用Warp来处理通过http头传送认证信息
async-std是一个新兴的异步运行时(Runtime),其设计上有很多地方优于老牌的tokio,用async-std写东西应该到了时机成熟的时候了。 warp底层使用的是tokio异步运行时, 如果打算用warp来搭建web应用,应使用tokio。 学习warp需要多看文档与源代码,多写代码,一边干一边学。咱们都是菜鸟,多交流。
回复【jelipo 2020-06-19 14:22】
warp的Filter就充当了中间件的作用。用户认证需要会话(session)或者叫状态(state)来支持, 可以通过warp读写cookie结合后端数据库来实现。
回复【songday 2020-06-19 11:47】
请教一下使用“async-std”有什么问题吗?正在用这个写一些网络相关的东西,本来打算当成std的异步版本使用的,过度使用会有什么问题吗?
Wrap这个有
middle ware
插件吗?或者是像
actix-web
那样的FromRequest
的trait
我的需求就是在某一个或几个接口,需要认证用户
我最近使用的是
Tide
,性能还不知道,易用性还是不错的。多谢,我去试试
对以下内容的回复:
通过chrome的security还能看到tls的版本: The connection to this site is encrypted and authenticated using TLS 1.3, X25519, and AES_128_GCM. 这应该是业界最新标准
warp 0.2.3启用tls后默认的https协议已经是http2了。 我测试了一下,在cargo.toml中标注branch是多余的(warp = {version="0.2",features=["tls"],branch = "h2"})。 如何知道网站是否开启http2呢? chrome 按f12, 进入network页面,通过鼠标右键,让protocol列显示,按f5刷新页面,如果protocol列为h2,即表明服务器端支持http2。
warp 0.2.3关闭tls,传输协议是http 1.1。
对以下内容的回复:
warp 如何指定使用http 2?
哈哈,我是 Roa 的作者,回复前几楼的一些疑问:
Roa 还非常不成熟,但喜欢 Koajs 的朋友可以来试用一下
用warp+mssql在运行ApacheBench做https万次并发测试的时候,通过浏览器还能正常访问网页。这个项目actix-web与roa都崩了。
warp+sqlserver HTTPS 压力测试:
从http改https只需要加3行代码:
Warp搭配SQL Server数据库正确的开启姿势:
理论上应该能, 不过人懒, 觉得好麻烦, 还是换框架吧.
对以下内容的回复:
不是吧,追踪不到问题所在么
对以下内容的回复:
Filter是Warp独一无二的路由特征,多看作者的例子,依葫芦画瓢,很快就能上手:
https://github.com/seanmonstar/warp/tree/master/examples
对以下内容的回复: